ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2NhcmJvbiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2NhcmJvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI3YWEwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9jYXJib24KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgc291cmNlcGF0aD0iSlJFX1NSQyIga2luZD0idmFyIiBwYXRoPSJKUkVfTElCIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY2FyYm9uIj4KLQkgICAgPGF0dHJpYnV0ZXM+Ci0JCQk8YXR0cmlidXRlIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmNhcmJvbiIgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfQVRUUl9MSUJSQVJZX1BBVEhfRU5UUlkiLz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfZ3RrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfZ3RrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzEwMDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2d0aworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJKUkVfU1JDIiBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJndGsiPgotCSAgICA8YXR0cmlidXRlcz4KLQkJCTxhdHRyaWJ1dGUgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZ3RrL29zL2xpbnV4L3g4NiIgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfQVRUUl9MSUJSQVJZX1BBVEhfRU5UUlkiLz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfbW90aWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9tb3RpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNWZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9tb3RpZgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IHNvdXJjZXBhdGg9IkpSRV9TUkMiIGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vdGlmIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfd2luMzIgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF93aW4zMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4MTU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF93aW4zMgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJKUkVfU1JDIiBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3aW4zMiI+Ci0JICAgIDxhdHRyaWJ1dGVzPgotCQkJPGF0dHJpYnV0ZSB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC53aW4zMi9vcy93aW4zMi94ODYiIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX0FUVFJfTElCUkFSWV9QQVRIX0VOVFJZIi8+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5zd3QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMTEzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi0uY2xhc3NwYXRoCi13cwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1MzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uuc3d0PC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS5jdnNuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhMzM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOyBzaW5nbGV0b249dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMS4wCi1CdW5kbGUtQ2xhc3NQYXRoOiAkd3MkL29wZW5nbC5qYXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUHJvdmlkZS1QYWNrYWdlOiAKLSAgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYxMmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImFnbF9zdHJ1Y3RzLmgiCi0jaW5jbHVkZSAiYWdsX3N0YXRzLmgiCi0KLSNkZWZpbmUgQUdMX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vcGVuZ2xfY2FyYm9uX0FHTF8jI2Z1bmMKLQotI2lmbmRlZiBOT19hZ2xDaG9vc2VQaXhlbEZvcm1hdAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbENob29zZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqaW50IHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWFnbENob29zZVBpeGVsRm9ybWF0KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fYWdsQ3JlYXRlQ29udGV4dAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbENyZWF0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamludCByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbENyZWF0ZUNvbnRleHRfRlVOQyk7Ci0JcmMgPSAoamludClhZ2xDcmVhdGVDb250ZXh0KGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbENyZWF0ZUNvbnRleHRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fYWdsRGVzY3JpYmVQaXhlbEZvcm1hdAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXNjcmliZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbERlc2NyaWJlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqYm9vbGVhbilhZ2xEZXNjcmliZVBpeGVsRm9ybWF0KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsRGVzY3JpYmVQaXhlbEZvcm1hdF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xEZXN0cm95Q29udGV4dAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXN0cm95Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xEZXN0cm95Q29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xEZXN0cm95Q29udGV4dChhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xEZXN0cm95Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xEZXN0cm95UGl4ZWxGb3JtYXQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXN0cm95UGl4ZWxGb3JtYXQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xEZXN0cm95UGl4ZWxGb3JtYXRfRlVOQyk7Ci0JYWdsRGVzdHJveVBpeGVsRm9ybWF0KGFyZzApOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbERlc3Ryb3lQaXhlbEZvcm1hdF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2FnbEVuYWJsZQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xFbmFibGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xFbmFibGVfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pYWdsRW5hYmxlKGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbEVuYWJsZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xHZXRDdXJyZW50Q29udGV4dAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbEdldEN1cnJlbnRDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JamludCByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbEdldEN1cnJlbnRDb250ZXh0X0ZVTkMpOwotCXJjID0gKGppbnQpYWdsR2V0Q3VycmVudENvbnRleHQoKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xHZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xHZXREcmF3YWJsZQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbEdldERyYXdhYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsR2V0RHJhd2FibGVfRlVOQyk7Ci0JcmMgPSAoamludClhZ2xHZXREcmF3YWJsZShhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xHZXREcmF3YWJsZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXRDdXJyZW50Q29udGV4dAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRDdXJyZW50Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xTZXRDdXJyZW50Q29udGV4dChhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXREcmF3YWJsZQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbFNldERyYXdhYmxlX0ZVTkMpOwotCXJjID0gKGpib29sZWFuKWFnbFNldERyYXdhYmxlKGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFNldERyYXdhYmxlX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2FnbFNldEludGVnZXJfX0lJSQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRJbnRlZ2VyX19JSUkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbFNldEludGVnZXJfX0lJSV9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xTZXRJbnRlZ2VyKGFyZzAsIGFyZzEsIGFyZzIpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFNldEludGVnZXJfX0lJSV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXRJbnRlZ2VyX19JSV8zSQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRJbnRlZ2VyX19JSV8zSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xTZXRJbnRlZ2VyX19JSV8zSV9GVU5DKTsKLQlpZiAoYXJnMikgaWYgKChscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCXJjID0gKGpib29sZWFuKWFnbFNldEludGVnZXIoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLWZhaWw6Ci0JaWYgKGFyZzIgJiYgbHBhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xTZXRJbnRlZ2VyX19JSV8zSV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTd2FwQnVmZmVycwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbFN3YXBCdWZmZXJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsU3dhcEJ1ZmZlcnNfRlVOQyk7Ci0JYWdsU3dhcEJ1ZmZlcnMoYXJnMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsU3dhcEJ1ZmZlcnNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xVcGRhdGVDb250ZXh0Ci1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbFVwZGF0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWpib29sZWFuIHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsVXBkYXRlQ29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xVcGRhdGVDb250ZXh0KGFyZzApOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFVwZGF0ZUNvbnRleHRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4N2Q0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0YXRzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0YXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjAxNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzd3QuaCIKLSNpbmNsdWRlICJhZ2xfc3RhdHMuaCIKLQotI2lmZGVmIE5BVElWRV9TVEFUUwotCi1pbnQgQUdMX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAxNDsKLWludCBBR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbMTRdOwotY2hhciAqIEFHTF9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Ci0JImFnbENob29zZVBpeGVsRm9ybWF0IiwKLQkiYWdsQ3JlYXRlQ29udGV4dCIsCi0JImFnbERlc2NyaWJlUGl4ZWxGb3JtYXQiLAotCSJhZ2xEZXN0cm95Q29udGV4dCIsCi0JImFnbERlc3Ryb3lQaXhlbEZvcm1hdCIsCi0JImFnbEVuYWJsZSIsCi0JImFnbEdldEN1cnJlbnRDb250ZXh0IiwKLQkiYWdsR2V0RHJhd2FibGUiLAotCSJhZ2xTZXRDdXJyZW50Q29udGV4dCIsCi0JImFnbFNldERyYXdhYmxlIiwKLQkiYWdsU2V0SW50ZWdlcl9fSUlJIiwKLQkiYWdsU2V0SW50ZWdlcl9fSUlfM0kiLAotCSJhZ2xTd2FwQnVmZmVycyIsCi0JImFnbFVwZGF0ZUNvbnRleHQiLAotfTsKLQotI2RlZmluZSBTVEFUU19OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3RfdG9vbHNfaW50ZXJuYWxfTmF0aXZlU3RhdHNfIyNmdW5jCi0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKEFHTF8xR2V0RnVuY3Rpb25Db3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCXJldHVybiBBR0xfbmF0aXZlRnVuY3Rpb25Db3VudDsKLX0KLQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBTVEFUU19OQVRJVkUoQUdMXzFHZXRGdW5jdGlvbk5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBBR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tpbmRleF0pOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShBR0xfMUdldEZ1bmN0aW9uQ2FsbENvdW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuIEFHTF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtpbmRleF07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM1OWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2xfc3RhdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgTkFUSVZFX1NUQVRTCi1leHRlcm4gaW50IEFHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBBR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbXTsKLWV4dGVybiBjaGFyKiBBR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOwotI2RlZmluZSBBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgQUdMX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Ci0jZGVmaW5lIEFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2Vsc2UKLSNkZWZpbmUgQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotCWFnbENob29zZVBpeGVsRm9ybWF0X0ZVTkMsCi0JYWdsQ3JlYXRlQ29udGV4dF9GVU5DLAotCWFnbERlc2NyaWJlUGl4ZWxGb3JtYXRfRlVOQywKLQlhZ2xEZXN0cm95Q29udGV4dF9GVU5DLAotCWFnbERlc3Ryb3lQaXhlbEZvcm1hdF9GVU5DLAotCWFnbEVuYWJsZV9GVU5DLAotCWFnbEdldEN1cnJlbnRDb250ZXh0X0ZVTkMsCi0JYWdsR2V0RHJhd2FibGVfRlVOQywKLQlhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DLAotCWFnbFNldERyYXdhYmxlX0ZVTkMsCi0JYWdsU2V0SW50ZWdlcl9fSUlJX0ZVTkMsCi0JYWdsU2V0SW50ZWdlcl9fSUlfM0lfRlVOQywKLQlhZ2xTd2FwQnVmZmVyc19GVU5DLAotCWFnbFVwZGF0ZUNvbnRleHRfRlVOQywKLX0gQUdMX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdHJ1Y3RzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0cnVjdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1MzFmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYWdsLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9jYXJib24vQUdMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvY2FyYm9uL0FHTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzEzMzllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9jYXJib24vQUdMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5jYXJib247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci0KLXB1YmxpYyBjbGFzcyBBR0wgewotCi1zdGF0aWMgewotCUxpYnJhcnkubG9hZExpYnJhcnkoImdsIik7Ci19Ci0KLS8qIEF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9OT05FID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9CVUZGRVJfU0laRSA9IDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfTEVWRUwgPSAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX1JHQkEgPSA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0RPVUJMRUJVRkZFUiA9IDU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1RFUkVPID0gNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9BVVhfQlVGRkVSUyA9IDc7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfUkVEX1NJWkUgPSA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0dSRUVOX1NJWkUgPSA5OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0JMVUVfU0laRSA9IDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0FMUEhBX1NJWkUgPSAxMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9ERVBUSF9TSVpFID0gMTI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1RFTkNJTF9TSVpFID0gMTM7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fUkVEX1NJWkUgPSAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9BQ0NVTV9HUkVFTl9TSVpFID0gMTU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fQkxVRV9TSVpFID0gMTY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fQUxQSEFfU0laRSA9IDE3OwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU0FNUExFX0JVRkZFUlNfQVJCID0gNTU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU0FNUExFU19BUkIgPSA1NjsKLQotLyogSW50ZWdlciBwYXJhbWV0ZXJzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQlVGRkVSX1JFQ1QgPSAyMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1dBUF9JTlRFUlZBTCA9IDIyMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9CVUZGRVJfTkFNRSA9IDIzMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9DTElQX1JFR0lPTiA9IDI1NDsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbENob29zZVBpeGVsRm9ybWF0KGludCBnZGV2cywgaW50IG5kZXYsIGludFtdIGF0dHJpYnMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbENyZWF0ZUNvbnRleHQoaW50IHBpeCwgaW50IHNoYXJlKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gYWdsRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgcGl4LCBpbnQgYXR0cmliLCBpbnRbXSB2YWx1ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbERlc3Ryb3lDb250ZXh0KGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBhZ2xEZXN0cm95UGl4ZWxGb3JtYXQoaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbEVuYWJsZShpbnQgY3R4LCBpbnQgcG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgYWdsR2V0RHJhd2FibGUoaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFNldEN1cnJlbnRDb250ZXh0KGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBhZ2xTZXREcmF3YWJsZShpbnQgY3R4LCBpbnQgZHJhdyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFNldEludGVnZXIoaW50IGN0eCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBhZ2xTZXRJbnRlZ2VyKGludCBjdHgsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgYWdsU3dhcEJ1ZmZlcnMoaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFVwZGF0ZUNvbnRleHQoaW50IGN0eCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ2FudmFzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJmYzc3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuY2FyYm9uLio7Ci0KLS8qKgotICogR0xDYW52YXMgaXMgYSB3aWRnZXQgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIE9wZW5HTCBjb250ZW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyB7CQotCWludCBjb250ZXh0OwotCWludCBwaXhlbEZvcm1hdDsKLQlzdGF0aWMgZmluYWwgaW50IE1BWF9BVFRSSUJVVEVTID0gMzI7Ci0KLS8qKgotICogQ3JlYXRlIGEgR0xDYW52YXMgd2lkZ2V0IHVzaW5nIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJlZCBpbiB0aGUgR0xEYXRhCi0gKiBvYmplY3QgcHJvdmlkZWQuCi0gKgotICogQHBhcmFtIHBhcmVudCBhIGNvbXBvc2l0ZSB3aWRnZXQKLSAqIEBwYXJhbSBzdHlsZSB0aGUgYml0d2lzZSBPUidpbmcgb2Ygd2lkZ2V0IHN0eWxlcwotICogQHBhcmFtIGRhdGEgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzIG9mIHRoZSBHTENhbnZhcwotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiB0aGUgZGF0YSBpcyBudWxsCi0gKiAgICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIHdoZW4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzIGNhbm5vdCBiZSBwcm92aWRlZDwvdWw+IAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24KLSAqIDx1bD48bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIHdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotICogICAgIDxsaT5FUlJPUl9DQU5OT1RfQ1JFQVRFX09CSkVDVCB3aGVuIGZhaWxlZCB0byBjcmVhdGUgT0xFIE9iamVjdAotICogICAgIDxsaT5FUlJPUl9DQU5OT1RfT1BFTl9GSUxFIHdoZW4gZmFpbGVkIHRvIG9wZW4gZmlsZQotICogICAgIDxsaT5FUlJPUl9JTlRFUkZBQ0VfTk9UX0ZPVU5EIHdoZW4gdW5hYmxlIHRvIGNyZWF0ZSBjYWxsYmFja3MgZm9yIE9MRSBJbnRlcmZhY2VzCi0gKiAgICAgPGxpPkVSUk9SX0lOVkFMSURfQ0xBU1NJRAotICogPC91bD4KLSAqLwotcHVibGljIEdMQ2FudmFzIChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIEdMRGF0YSBkYXRhKSB7Ci0Jc3VwZXIgKHBhcmVudCwgc3R5bGUpOwotCWlmIChkYXRhID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWludCBhZ2xBdHRyaWIgW10gPSBuZXcgaW50IFtNQVhfQVRUUklCVVRFU107Ci0JaW50IHBvcyA9IDA7Ci0JYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1JHQkE7Ci0JaWYgKGRhdGEuZG91YmxlQnVmZmVyKSBhZ2xBdHRyaWIgW3BvcysrXSA9IEFHTC5BR0xfRE9VQkxFQlVGRkVSOwotCWlmIChkYXRhLnN0ZXJlbykgYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NURVJFTzsKLQlpZiAoZGF0YS5yZWRTaXplID4gMCkgewotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IEFHTC5BR0xfUkVEX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5yZWRTaXplOwotCX0KLQlpZiAoZGF0YS5ncmVlblNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9HUkVFTl9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuZ3JlZW5TaXplOwotCX0KLQlpZiAoZGF0YS5ibHVlU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX0JMVUVfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLmJsdWVTaXplOwotCX0KLQlpZiAoZGF0YS5hbHBoYVNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BTFBIQV9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWxwaGFTaXplOwotCX0KLQlpZiAoZGF0YS5kZXB0aFNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9ERVBUSF9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuZGVwdGhTaXplOwotCX0KLQlpZiAoZGF0YS5zdGVuY2lsU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NURU5DSUxfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnN0ZW5jaWxTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bVJlZFNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9SRURfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtUmVkU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuYWNjdW1HcmVlblNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9HUkVFTl9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWNjdW1HcmVlblNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtQmx1ZVNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9CTFVFX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUJsdWVTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bUFscGhhU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX0FDQ1VNX0FMUEhBX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUFscGhhU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuc2FtcGxlQnVmZmVycyA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NBTVBMRV9CVUZGRVJTX0FSQjsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZUJ1ZmZlcnM7Ci0JfQotCWlmIChkYXRhLnNhbXBsZXMgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9TQU1QTEVTX0FSQjsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZXM7Ci0JfQotCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9OT05FOwotCXBpeGVsRm9ybWF0ID0gQUdMLmFnbENob29zZVBpeGVsRm9ybWF0ICgwLCAwLCBhZ2xBdHRyaWIpOwotLy8JY29udGV4dCA9IEFHTC5hZ2xDcmVhdGVDb250ZXh0IChwaXhlbEZvcm1hdCwgc2hhcmUgPT0gbnVsbCA/IDAgOiBzaGFyZS5jb250ZXh0KTsKLQljb250ZXh0ID0gQUdMLmFnbENyZWF0ZUNvbnRleHQgKHBpeGVsRm9ybWF0LCAwKTsKLQlpbnQgd2luZG93ID0gT1MuR2V0Q29udHJvbE93bmVyIChoYW5kbGUpOwotCWludCBwb3J0ID0gT1MuR2V0V2luZG93UG9ydCAod2luZG93KTsKLQlBR0wuYWdsU2V0RHJhd2FibGUgKGNvbnRleHQsIHBvcnQpOwotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuRGlzcG9zZToKLQkJCQlBR0wuYWdsRGVzdHJveUNvbnRleHQgKGNvbnRleHQpOwotCQkJCUFHTC5hZ2xEZXN0cm95UGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULlJlc2l6ZToKLQkJCWNhc2UgU1dULkhpZGU6Ci0JCQljYXNlIFNXVC5TaG93OgotCQkJCWdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXhCb3VuZHMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlhZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlNob3csIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuSGlkZSwgbGlzdGVuZXIpOwotCUNvbnRyb2wgYyA9IHRoaXM7Ci0JZG8gewotCQljLmFkZExpc3RlbmVyKFNXVC5TaG93LCBsaXN0ZW5lcik7Ci0JCWMuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGxpc3RlbmVyKTsKLQkJYyA9IGMuZ2V0UGFyZW50KCk7Ci0JfSB3aGlsZSAoYyAhPSBzaGVsbCk7Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLXZvaWQgZml4Qm91bmRzICgpIHsKLQlHQ0RhdGEgZGF0YSA9IG5ldyBHQ0RhdGEgKCk7Ci0JaW50IGdjID0gaW50ZXJuYWxfbmV3X0dDIChkYXRhKTsKLQlSZWN0IGJvdW5kcyA9IG5ldyBSZWN0ICgpOwotCU9TLkdldFJlZ2lvbkJvdW5kcyAoZGF0YS52aXNpYmxlUmduLCBib3VuZHMpOwotCWludCB3aWR0aCA9IGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0OwotCWludCBoZWlnaHQgPSBib3VuZHMuYm90dG9tIC0gYm91bmRzLnRvcDsKLQlSZWN0IHJlY3QgPSBuZXcgUmVjdCAoKTsKLQlpbnQgd2luZG93ID0gT1MuR2V0Q29udHJvbE93bmVyIChoYW5kbGUpOwotCWludCBwb3J0ID0gT1MuR2V0V2luZG93UG9ydCAod2luZG93KTsKLQlPUy5HZXRQb3J0Qm91bmRzIChwb3J0LCByZWN0KTsKLQlpbnQgW10gZ2xib3VuZHMgPSBuZXcgaW50IFs0XTsKLQlnbGJvdW5kc1swXSA9IGJvdW5kcy5sZWZ0OwotCWdsYm91bmRzWzFdID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCAtIGJvdW5kcy50b3AgLSBoZWlnaHQ7Ci0JZ2xib3VuZHNbMl0gPSB3aWR0aDsKLQlnbGJvdW5kc1szXSA9IGhlaWdodDsKLQlBR0wuYWdsU2V0SW50ZWdlciAoY29udGV4dCwgQUdMLkFHTF9CVUZGRVJfUkVDVCwgZ2xib3VuZHMpOwotCUFHTC5hZ2xFbmFibGUgKGNvbnRleHQsIEFHTC5BR0xfQlVGRkVSX1JFQ1QpOwotCUFHTC5hZ2xTZXRJbnRlZ2VyIChjb250ZXh0LCBBR0wuQUdMX0NMSVBfUkVHSU9OLCBkYXRhLnZpc2libGVSZ24pOwotCUFHTC5hZ2xVcGRhdGVDb250ZXh0IChjb250ZXh0KTsKLQlpbnRlcm5hbF9kaXNwb3NlX0dDIChnYywgZGF0YSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlpbnQgW10gdmFsdWUgPSBuZXcgaW50IFsxXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfRE9VQkxFQlVGRkVSLCB2YWx1ZSk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSB2YWx1ZSBbMF0gIT0gMDsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfU1RFUkVPLCB2YWx1ZSk7Ci0JZGF0YS5zdGVyZW8gPSB2YWx1ZSBbMF0gIT0gMDsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfUkVEX1NJWkUsIHZhbHVlKTsKLQlkYXRhLnJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmdyZWVuU2l6ZSA9IHZhbHVlIFswXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfQkxVRV9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5ibHVlU2l6ZSA9IHZhbHVlIFswXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfQUxQSEFfU0laRSwgdmFsdWUpOwotCWRhdGEuYWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9ERVBUSF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5kZXB0aFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX1NURU5DSUxfU0laRSwgdmFsdWUpOwotCWRhdGEuc3RlbmNpbFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX1JFRF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5hY2N1bVJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtR3JlZW5TaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9BQ0NVTV9CTFVFX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQmx1ZVNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX0FMUEhBX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9TQU1QTEVfQlVGRkVSU19BUkIsIHZhbHVlKTsKLQlkYXRhLnNhbXBsZUJ1ZmZlcnMgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX1NBTVBMRVNfQVJCLCB2YWx1ZSk7Ci0JZGF0YS5zYW1wbGVzID0gdmFsdWUgWzBdOwotCXJldHVybiBkYXRhOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVjZWl2ZXIncyBPcGVuR0wgY29udGV4dAotICogaXMgdGhlIGN1cnJlbnQgY29udGV4dC4KLSAqICAKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaG9sZHMgdGhlIGN1cnJlbnQgT3BlbkdMIGNvbnRleHQsCi0gKiBmYWxzZSBvdGhlcndpc2UKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNDdXJyZW50ICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm4gQUdMLmFnbEdldEN1cnJlbnRDb250ZXh0ICgpID09IGNvbnRleHQ7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgT3BlbkdMIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR0xDYW52YXMgdG8gYmUgdGhlCi0gKiBjdXJyZW50IEdMIGNvbnRleHQuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Q3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKEFHTC5hZ2xHZXRDdXJyZW50Q29udGV4dCAoKSAhPSBjb250ZXh0KSB7Ci0JCUFHTC5hZ2xTZXRDdXJyZW50Q29udGV4dCAoY29udGV4dCk7Ci0JfQotfQotCi0vKioKLSAqIFN3YXBzIHRoZSBmcm9udCBhbmQgYmFjayBjb2xvciBidWZmZXJzLgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlBR0wuYWdsU3dhcEJ1ZmZlcnMgKGNvbnRleHQpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiNWU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MjcgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0cnVjdHMuaCIKLSNpbmNsdWRlICJnbF9zdGF0cy5oIgotCi0jZGVmaW5lIEdMX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX29wZW5nbF9HTF8jI2Z1bmMKLQotI2lmbmRlZiBOT19nbEFjY3VtCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEFjY3VtKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xBY2N1bV9GVU5DKTsKLQlnbEFjY3VtKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xBY2N1bV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQWxwaGFGdW5jCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEFscGhhRnVuYykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQWxwaGFGdW5jX0ZVTkMpOwotCWdsQWxwaGFGdW5jKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xBbHBoYUZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEFyZVRleHR1cmVzUmVzaWRlbnQKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMX05BVElWRShnbEFyZVRleHR1cmVzUmVzaWRlbnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamJvb2xlYW5BcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMT1OVUxMOwotCWpib29sZWFuICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEFyZVRleHR1cmVzUmVzaWRlbnRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JcmMgPSAoamJvb2xlYW4pZ2xBcmVUZXh0dXJlc1Jlc2lkZW50KGFyZzAsIChjb25zdCBHTHVpbnQgKilscGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEFyZVRleHR1cmVzUmVzaWRlbnRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xBcnJheUVsZW1lbnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQXJyYXlFbGVtZW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEFycmF5RWxlbWVudF9GVU5DKTsKLQlnbEFycmF5RWxlbWVudChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQXJyYXlFbGVtZW50X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xCZWdpbgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xCZWdpbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCZWdpbl9GVU5DKTsKLQlnbEJlZ2luKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCZWdpbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQmluZFRleHR1cmUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQmluZFRleHR1cmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCaW5kVGV4dHVyZV9GVU5DKTsKLQlnbEJpbmRUZXh0dXJlKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCaW5kVGV4dHVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQml0bWFwCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEJpdG1hcCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczLCBqZmxvYXQgYXJnNCwgamZsb2F0IGFyZzUsIGpieXRlQXJyYXkgYXJnNikKLXsKLQlqYnl0ZSAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCaXRtYXBfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbEJpdG1hcChhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCAoY29uc3QgR0x1Ynl0ZSAqKWxwYXJnNik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQml0bWFwX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xCbGVuZEZ1bmMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQmxlbmRGdW5jKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQmxlbmRGdW5jX0ZVTkMpOwotCWdsQmxlbmRGdW5jKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCbGVuZEZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENhbGxMaXN0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENhbGxMaXN0X0ZVTkMpOwotCWdsQ2FsbExpc3QoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENhbGxMaXN0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNCCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpieXRlQXJyYXkgYXJnMikKLXsKLQlqYnl0ZSAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNDCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpjaGFyQXJyYXkgYXJnMikKLXsKLQlqY2hhciAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Q2hhckFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNJCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2FsbExpc3RzX19JSV8zSV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENhbGxMaXN0c19fSUlfM0lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENsZWFyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENsZWFyX0ZVTkMpOwotCWdsQ2xlYXIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDbGVhckFjY3VtCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENsZWFyQWNjdW0pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamZsb2F0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDbGVhckFjY3VtX0ZVTkMpOwotCWdsQ2xlYXJBY2N1bShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ2xlYXJBY2N1bV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ2xlYXJDb2xvcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhckNvbG9yKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJDb2xvcl9GVU5DKTsKLQlnbENsZWFyQ29sb3IoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFyQ29sb3JfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyRGVwdGgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ2xlYXJEZXB0aCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDbGVhckRlcHRoX0ZVTkMpOwotCWdsQ2xlYXJEZXB0aChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ2xlYXJEZXB0aF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ2xlYXJJbmRleAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhckluZGV4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJJbmRleF9GVU5DKTsKLQlnbENsZWFySW5kZXgoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFySW5kZXhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyU3RlbmNpbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhclN0ZW5jaWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJTdGVuY2lsX0ZVTkMpOwotCWdsQ2xlYXJTdGVuY2lsKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDbGVhclN0ZW5jaWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsaXBQbGFuZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGlwUGxhbmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENsaXBQbGFuZV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xDbGlwUGxhbmUoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsaXBQbGFuZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzYgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNiKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlIGFyZzAsIGpieXRlIGFyZzEsIGpieXRlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNiX0ZVTkMpOwotCWdsQ29sb3IzYihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzYl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzYnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzYnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2J2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNidihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM2J2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjNkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2RfRlVOQyk7Ci0JZ2xDb2xvcjNkKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjNkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM2R2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNmX0ZVTkMpOwotCWdsQ29sb3IzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNpX0ZVTkMpOwotCWdsQ29sb3IzaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3MKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3Izc19GVU5DKTsKLQlnbENvbG9yM3MoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3N2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3N2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3Izc3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3Izc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3ViCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3ViKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlIGFyZzAsIGpieXRlIGFyZzEsIGpieXRlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjN1Yl9GVU5DKTsKLQlnbENvbG9yM3ViKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjN1Yl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdWJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3VidikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZUFycmF5IGFyZzApCi17Ci0JamJ5dGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzdWJ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjN1YnYoKGNvbnN0IEdMdWJ5dGUgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3Vidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdWkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdWkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3VpX0ZVTkMpOwotCWdsQ29sb3IzdWkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3VpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjN1aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzdWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM3VpdigoY29uc3QgR0x1aW50ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3Vpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3VzX0ZVTkMpOwotCWdsQ29sb3IzdXMoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3VzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjN1c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3Vzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM3VzdigoY29uc3QgR0x1c2hvcnQgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjN1c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0YikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZSBhcmcwLCBqYnl0ZSBhcmcxLCBqYnl0ZSBhcmcyLCBqYnl0ZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0Yl9GVU5DKTsKLQlnbENvbG9yNGIoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNGJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNGJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRidl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3I0YnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGRfRlVOQyk7Ci0JZ2xDb2xvcjRkKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjRkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yNGR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0Zl9GVU5DKTsKLQlnbENvbG9yNGYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3I0ZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRpX0ZVTkMpOwotCWdsQ29sb3I0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0aXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjRpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyLCBqc2hvcnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHNfRlVOQyk7Ci0JZ2xDb2xvcjRzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjR1YgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjR1YikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZSBhcmcwLCBqYnl0ZSBhcmcxLCBqYnl0ZSBhcmcyLCBqYnl0ZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0dWJfRlVOQyk7Ci0JZ2xDb2xvcjR1YihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0dWJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHVidgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjR1YnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHVidl9GVU5DKTsKLQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCWdsQ29sb3I0dWJ2KChjb25zdCBHTHVieXRlICopbHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjR1YnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHVpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNHVpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHVpX0ZVTkMpOwotCWdsQ29sb3I0dWkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNHVpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjR1aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0dWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0dWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yNHVpdigoY29uc3QgR0x1aW50ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNHVpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0dXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0dXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMiwganNob3J0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjR1c19GVU5DKTsKLQlnbENvbG9yNHVzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjR1c19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0dXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNHVzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjR1c3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjR1c3YoKGNvbnN0IEdMdXNob3J0ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0dXN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvck1hc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3JNYXNrKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpib29sZWFuIGFyZzAsIGpib29sZWFuIGFyZzEsIGpib29sZWFuIGFyZzIsIGpib29sZWFuIGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvck1hc2tfRlVOQyk7Ci0JZ2xDb2xvck1hc2soYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yTWFza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3JNYXRlcmlhbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvck1hdGVyaWFsKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3JNYXRlcmlhbF9GVU5DKTsKLQlnbENvbG9yTWF0ZXJpYWwoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yTWF0ZXJpYWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvclBvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvclBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsQ29sb3JQb2ludGVyKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvclBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvcHlQaXhlbHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVBpeGVscykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlQaXhlbHNfRlVOQyk7Ci0JZ2xDb3B5UGl4ZWxzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5UGl4ZWxzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb3B5VGV4SW1hZ2UxRAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb3B5VGV4SW1hZ2UxRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DKTsKLQlnbENvcHlUZXhJbWFnZTFEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29weVRleEltYWdlMkQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVRleEltYWdlMkQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UyRF9GVU5DKTsKLQlnbENvcHlUZXhJbWFnZTJEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UyRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29weVRleFN1YkltYWdlMUQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVRleFN1YkltYWdlMUQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMpOwotCWdsQ29weVRleFN1YkltYWdlMUQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb3B5VGV4U3ViSW1hZ2UyRAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb3B5VGV4U3ViSW1hZ2UyRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTJEX0ZVTkMpOwotCWdsQ29weVRleFN1YkltYWdlMkQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTJEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDdWxsRmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDdWxsRmFjZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDdWxsRmFjZV9GVU5DKTsKLQlnbEN1bGxGYWNlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDdWxsRmFjZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGVsZXRlTGlzdHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGVsZXRlTGlzdHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEZWxldGVMaXN0c19GVU5DKTsKLQlnbERlbGV0ZUxpc3RzKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEZWxldGVMaXN0c19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGVsZXRlVGV4dHVyZXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGVsZXRlVGV4dHVyZXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERlbGV0ZVRleHR1cmVzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbERlbGV0ZVRleHR1cmVzKGFyZzAsIChjb25zdCBHTHVpbnQgKilscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVsZXRlVGV4dHVyZXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERlcHRoRnVuYwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEZXB0aEZ1bmMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRGVwdGhGdW5jX0ZVTkMpOwotCWdsRGVwdGhGdW5jKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEZXB0aEZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERlcHRoTWFzawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEZXB0aE1hc2spCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJvb2xlYW4gYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERlcHRoTWFza19GVU5DKTsKLQlnbERlcHRoTWFzayhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVwdGhNYXNrX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEZXB0aFJhbmdlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERlcHRoUmFuZ2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEZXB0aFJhbmdlX0ZVTkMpOwotCWdsRGVwdGhSYW5nZShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVwdGhSYW5nZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGlzYWJsZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEaXNhYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERpc2FibGVfRlVOQyk7Ci0JZ2xEaXNhYmxlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEaXNhYmxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEaXNhYmxlQ2xpZW50U3RhdGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGlzYWJsZUNsaWVudFN0YXRlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERpc2FibGVDbGllbnRTdGF0ZV9GVU5DKTsKLQlnbERpc2FibGVDbGllbnRTdGF0ZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGlzYWJsZUNsaWVudFN0YXRlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEcmF3QXJyYXlzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERyYXdBcnJheXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERyYXdBcnJheXNfRlVOQyk7Ci0JZ2xEcmF3QXJyYXlzKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3QXJyYXlzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEcmF3QnVmZmVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERyYXdCdWZmZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRHJhd0J1ZmZlcl9GVU5DKTsKLQlnbERyYXdCdWZmZXIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbERyYXdCdWZmZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERyYXdFbGVtZW50cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEcmF3RWxlbWVudHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEcmF3RWxlbWVudHNfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsRHJhd0VsZW1lbnRzKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3RWxlbWVudHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERyYXdQaXhlbHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRHJhd1BpeGVscykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRHJhd1BpeGVsc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQl9Ci0JZ2xEcmF3UGl4ZWxzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGxwYXJnNCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3UGl4ZWxzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFZGdlRmxhZwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYm9vbGVhbiBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRWRnZUZsYWdfRlVOQyk7Ci0JZ2xFZGdlRmxhZyhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRWRnZUZsYWdfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEVkZ2VGbGFnUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZ1BvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqYm9vbGVhbkFycmF5IGFyZzEpCi17Ci0JamJvb2xlYW4gKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRWRnZUZsYWdQb2ludGVyX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xFZGdlRmxhZ1BvaW50ZXIoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFZGdlRmxhZ1BvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEVkZ2VGbGFndgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZ3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJvb2xlYW5BcnJheSBhcmcwKQotewotCWpib29sZWFuICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEVkZ2VGbGFndl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJvb2xlYW5BcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsRWRnZUZsYWd2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRWRnZUZsYWd2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFbmFibGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRW5hYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEVuYWJsZV9GVU5DKTsKLQlnbEVuYWJsZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRW5hYmxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFbmFibGVDbGllbnRTdGF0ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFbmFibGVDbGllbnRTdGF0ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFbmFibGVDbGllbnRTdGF0ZV9GVU5DKTsKLQlnbEVuYWJsZUNsaWVudFN0YXRlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFbmFibGVDbGllbnRTdGF0ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRW5kCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEVuZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRW5kX0ZVTkMpOwotCWdsRW5kKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEVuZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRW5kTGlzdAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFbmRMaXN0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFbmRMaXN0X0ZVTkMpOwotCWdsRW5kTGlzdCgpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFbmRMaXN0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQxZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQxZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZF9GVU5DKTsKLQlnbEV2YWxDb29yZDFkKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDFkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxDb29yZDFkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQxZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxDb29yZDFkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbENvb3JkMWYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZl9GVU5DKTsKLQlnbEV2YWxDb29yZDFmKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDFmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQxZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMWZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQyZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxDb29yZDJkX0ZVTkMpOwotCWdsRXZhbENvb3JkMmQoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxDb29yZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbENvb3JkMmR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbEV2YWxDb29yZDJkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQyZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZl9GVU5DKTsKLQlnbEV2YWxDb29yZDJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQyZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsTWVzaDEKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbE1lc2gxKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsTWVzaDFfRlVOQyk7Ci0JZ2xFdmFsTWVzaDEoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxNZXNoMV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbE1lc2gyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxNZXNoMikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxNZXNoMl9GVU5DKTsKLQlnbEV2YWxNZXNoMihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbE1lc2gyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsUG9pbnQxCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxQb2ludDEpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRXZhbFBvaW50MV9GVU5DKTsKLQlnbEV2YWxQb2ludDEoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxQb2ludDFfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEV2YWxQb2ludDIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbFBvaW50MikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxQb2ludDJfRlVOQyk7Ci0JZ2xFdmFsUG9pbnQyKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsUG9pbnQyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xGZWVkYmFja0J1ZmZlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGZWVkYmFja0J1ZmZlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRmVlZGJhY2tCdWZmZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xGZWVkYmFja0J1ZmZlcihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGZWVkYmFja0J1ZmZlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRmluaXNoCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZpbmlzaCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRmluaXNoX0ZVTkMpOwotCWdsRmluaXNoKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZpbmlzaF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRmx1c2gKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRmx1c2gpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEZsdXNoX0ZVTkMpOwotCWdsRmx1c2goKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRmx1c2hfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRm9nZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9nZl9GVU5DKTsKLQlnbEZvZ2YoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZvZ2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2Z2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZvZ2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSkKLXsKLQlqZmxvYXQgKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9nZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xGb2dmdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGb2dmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRm9naQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGb2dpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9naV9GVU5DKTsKLQlnbEZvZ2koYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZvZ2lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZvZ2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xGb2dpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xGb2dpdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRm9naXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZyb250RmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGcm9udEZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRnJvbnRGYWNlX0ZVTkMpOwotCWdsRnJvbnRGYWNlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGcm9udEZhY2VfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZydXN0dW0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRnJ1c3R1bSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMsIGpkb3VibGUgYXJnNCwgamRvdWJsZSBhcmc1KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRnJ1c3R1bV9GVU5DKTsKLQlnbEZydXN0dW0oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZydXN0dW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdlbkxpc3RzCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMX05BVElWRShnbEdlbkxpc3RzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2VuTGlzdHNfRlVOQyk7Ci0JcmMgPSAoamludClnbEdlbkxpc3RzKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZW5MaXN0c19GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdlblRleHR1cmVzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdlblRleHR1cmVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZW5UZXh0dXJlc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZW5UZXh0dXJlcyhhcmcwLCAoR0x1aW50ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdlblRleHR1cmVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRCb29sZWFudgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRCb29sZWFudikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpib29sZWFuQXJyYXkgYXJnMSkKLXsKLQlqYm9vbGVhbiAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRCb29sZWFudl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEJvb2xlYW5BcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0Qm9vbGVhbnYoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRCb29sZWFudl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0Q2xpcFBsYW5lCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldENsaXBQbGFuZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGVBcnJheSBhcmcxKQotewotCWpkb3VibGUgKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0Q2xpcFBsYW5lX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbEdldENsaXBQbGFuZShhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0Q2xpcFBsYW5lX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXREb3VibGV2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldERvdWJsZXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldERvdWJsZXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0RG91YmxldihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0RG91Ymxldl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0RXJyb3IKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0RXJyb3IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0RXJyb3JfRlVOQyk7Ci0JcmMgPSAoamludClnbEdldEVycm9yKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldEVycm9yX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0RmxvYXR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldEZsb2F0dikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldEZsb2F0dl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbEdldEZsb2F0dihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRGbG9hdHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldEludGVnZXJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldEludGVnZXJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRJbnRlZ2Vydl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRJbnRlZ2VydihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0SW50ZWdlcnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldExpZ2h0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TGlnaHRmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TGlnaHRmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldExpZ2h0ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0TGlnaHRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TGlnaHRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRMaWdodGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldExpZ2h0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TGlnaHRpdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0TGlnaHRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TWFwZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWFwZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TWFwZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hcGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRNYXBmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRNYXBmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRNYXBmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRNYXBmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TWFwaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWFwaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TWFwaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hcGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRNYXRlcmlhbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldE1hdGVyaWFsZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRNYXRlcmlhbGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldE1hdGVyaWFsaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWF0ZXJpYWxpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRNYXRlcmlhbGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldE1hdGVyaWFsaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBpeGVsTWFwZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0UGl4ZWxNYXBmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQaXhlbE1hcGZ2KGFyZzAsIGxwYXJnMSk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBpeGVsTWFwdWl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFBpeGVsTWFwdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRQaXhlbE1hcHVpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQaXhlbE1hcHVpdihhcmcwLCAoR0x1aW50ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwdWl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRQaXhlbE1hcHVzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRQaXhlbE1hcHVzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpzaG9ydEFycmF5IGFyZzEpCi17Ci0JanNob3J0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwdXN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0UGl4ZWxNYXB1c3YoYXJnMCwgKEdMdXNob3J0ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0UGl4ZWxNYXB1c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBvaW50ZXJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFBvaW50ZXJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRQb2ludGVydl9GVU5DKTsKLQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JZ2xHZXRQb2ludGVydihhcmcwLCAoR0x2b2lkICoqKWxwYXJnMSk7Ci0JaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRQb2ludGVydl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0UG9seWdvblN0aXBwbGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0UG9seWdvblN0aXBwbGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBvbHlnb25TdGlwcGxlX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQb2x5Z29uU3RpcHBsZSgoR0x1Ynl0ZSAqKWxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0UG9seWdvblN0aXBwbGVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFN0cmluZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWppbnQgcmM7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbEdldFN0cmluZyhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0U3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4RW52ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4RW52ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFRleEVudmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4RW52ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0VGV4RW52ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFRleEVudml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFRleEVudml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFRleEVudml2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldFRleEVudml2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhFbnZpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4R2VuZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4R2VuZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4R2VuZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEdlbmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhHZW5mdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhHZW5mdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhHZW5mdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhHZW5mdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4R2VuaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4R2VuaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4R2VuaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEdlbml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhJbWFnZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhJbWFnZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4SW1hZ2VfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzQsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4SW1hZ2UoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgbHBhcmc0KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEltYWdlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFRleExldmVsUGFyYW1ldGVyZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamZsb2F0QXJyYXkgYXJnMykKLXsKLQlqZmxvYXQgKmxwYXJnMz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIE5VTEwpOwotCX0KLQlnbEdldFRleExldmVsUGFyYW1ldGVyZnYoYXJnMCwgYXJnMSwgYXJnMiwgbHBhcmczKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnRBcnJheSBhcmczKQotewotCWppbnQgKmxwYXJnMz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhQYXJhbWV0ZXJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhQYXJhbWV0ZXJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4UGFyYW1ldGVyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhQYXJhbWV0ZXJmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4UGFyYW1ldGVyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4UGFyYW1ldGVyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4UGFyYW1ldGVyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4UGFyYW1ldGVyaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xIaW50Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEhpbnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xIaW50X0ZVTkMpOwotCWdsSGludChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSGludF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhNYXNrCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4TWFzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleE1hc2tfRlVOQyk7Ci0JZ2xJbmRleE1hc2soYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEluZGV4TWFza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhQb2ludGVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4UG9pbnRlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsSW5kZXhQb2ludGVyKGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleFBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbmRleGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhkX0ZVTkMpOwotCWdsSW5kZXhkKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEluZGV4ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsSW5kZXhkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEluZGV4Zl9GVU5DKTsKLQlnbEluZGV4ZihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbmRleGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbEluZGV4ZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleGlfRlVOQyk7Ci0JZ2xJbmRleGkoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEluZGV4aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbmRleGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xJbmRleGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbmRleHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhzX0ZVTkMpOwotCWdsSW5kZXhzKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsSW5kZXhzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleHN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbml0TmFtZXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5pdE5hbWVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbml0TmFtZXNfRlVOQyk7Ci0JZ2xJbml0TmFtZXMoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5pdE5hbWVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbnRlcmxlYXZlZEFycmF5cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbnRlcmxlYXZlZEFycmF5cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbnRlcmxlYXZlZEFycmF5c19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xJbnRlcmxlYXZlZEFycmF5cyhhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW50ZXJsZWF2ZWRBcnJheXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbElzRW5hYmxlZAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgR0xfTkFUSVZFKGdsSXNFbmFibGVkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqYm9vbGVhbiByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbElzRW5hYmxlZF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilnbElzRW5hYmxlZChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSXNFbmFibGVkX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSXNMaXN0Ci1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJc0xpc3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWpib29sZWFuIHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSXNMaXN0X0ZVTkMpOwotCXJjID0gKGpib29sZWFuKWdsSXNMaXN0KGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJc0xpc3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJc1RleHR1cmUKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMX05BVElWRShnbElzVGV4dHVyZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmM7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJc1RleHR1cmVfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pZ2xJc1RleHR1cmUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbElzVGV4dHVyZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZl9GVU5DKTsKLQlnbExpZ2h0TW9kZWxmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRNb2RlbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbExpZ2h0TW9kZWxmdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTGlnaHRNb2RlbGlfRlVOQyk7Ci0JZ2xMaWdodE1vZGVsaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTGlnaHRNb2RlbGlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodE1vZGVsaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xMaWdodE1vZGVsaXYoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGZfRlVOQyk7Ci0JZ2xMaWdodGYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTGlnaHRmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodGZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMaWdodGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGlnaHRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGlfRlVOQyk7Ci0JZ2xMaWdodGkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTGlnaHRpdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTGlnaHRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGluZVN0aXBwbGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGluZVN0aXBwbGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqc2hvcnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpbmVTdGlwcGxlX0ZVTkMpOwotCWdsTGluZVN0aXBwbGUoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpbmVTdGlwcGxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMaW5lV2lkdGgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGluZVdpZHRoKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTGluZVdpZHRoX0ZVTkMpOwotCWdsTGluZVdpZHRoKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaW5lV2lkdGhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpc3RCYXNlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpc3RCYXNlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpc3RCYXNlX0ZVTkMpOwotCWdsTGlzdEJhc2UoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpc3RCYXNlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMb2FkSWRlbnRpdHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZElkZW50aXR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMb2FkSWRlbnRpdHlfRlVOQyk7Ci0JZ2xMb2FkSWRlbnRpdHkoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9hZElkZW50aXR5X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMb2FkTWF0cml4ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMb2FkTWF0cml4ZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExvYWRNYXRyaXhkX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbExvYWRNYXRyaXhkKGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMb2FkTWF0cml4ZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTG9hZE1hdHJpeGYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZE1hdHJpeGYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTG9hZE1hdHJpeGZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xMb2FkTWF0cml4ZihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMb2FkTWF0cml4Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTG9hZE5hbWUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZE5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTG9hZE5hbWVfRlVOQyk7Ci0JZ2xMb2FkTmFtZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9hZE5hbWVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExvZ2ljT3AKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9naWNPcCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMb2dpY09wX0ZVTkMpOwotCWdsTG9naWNPcChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9naWNPcF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTWFwMWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpkb3VibGVBcnJheSBhcmc1KQotewotCWpkb3VibGUgKmxwYXJnNT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwMWRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNSkgbHBhcmc1ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgTlVMTCk7Ci0JfQotCWdsTWFwMWQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgbHBhcmc1KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hcDFkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXAxZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXAxZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpmbG9hdEFycmF5IGFyZzUpCi17Ci0JamZsb2F0ICpscGFyZzU9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcDFmX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc1LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgTlVMTCk7Ci0JfQotCWdsTWFwMWYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgbHBhcmc1KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc1LCBscGFyZzUsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwMWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcDJkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hcDJkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqZG91YmxlIGFyZzUsIGpkb3VibGUgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgsIGpkb3VibGVBcnJheSBhcmc5KQotewotCWpkb3VibGUgKmxwYXJnOT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwMmRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzkpIGxwYXJnOSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOSkgbHBhcmc5ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgTlVMTCk7Ci0JfQotCWdsTWFwMmQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgbHBhcmc5KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIGxwYXJnOSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc5KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgbHBhcmc5LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hcDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXAyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXAyZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpmbG9hdCBhcmc1LCBqZmxvYXQgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgsIGpmbG9hdEFycmF5IGFyZzkpCi17Ci0JamZsb2F0ICpscGFyZzk9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcDJmX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc5KSBscGFyZzkgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc5LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzkpIGxwYXJnOSA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgTlVMTCk7Ci0JfQotCWdsTWFwMmYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgbHBhcmc5KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIGxwYXJnOSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc5KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc5LCBscGFyZzksIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwMmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcEdyaWQxZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXBHcmlkMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQxZF9GVU5DKTsKLQlnbE1hcEdyaWQxZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDFkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXBHcmlkMWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwR3JpZDFmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwR3JpZDFmX0ZVTkMpOwotCWdsTWFwR3JpZDFmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xNYXBHcmlkMWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcEdyaWQyZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXBHcmlkMmQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamludCBhcmczLCBqZG91YmxlIGFyZzQsIGpkb3VibGUgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQyZF9GVU5DKTsKLQlnbE1hcEdyaWQyZChhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXBHcmlkMmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwR3JpZDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqaW50IGFyZzMsIGpmbG9hdCBhcmc0LCBqZmxvYXQgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQyZl9GVU5DKTsKLQlnbE1hcEdyaWQyZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWF0ZXJpYWxmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsZl9GVU5DKTsKLQlnbE1hdGVyaWFsZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWF0ZXJpYWxmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdGVyaWFsZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xNYXRlcmlhbGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hdGVyaWFsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hdGVyaWFsaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXRlcmlhbGkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsaV9GVU5DKTsKLQlnbE1hdGVyaWFsaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWF0ZXJpYWxpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdGVyaWFsaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWF0ZXJpYWxpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xNYXRlcmlhbGl2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xNYXRlcmlhbGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRyaXhNb2RlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdHJpeE1vZGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWF0cml4TW9kZV9GVU5DKTsKLQlnbE1hdHJpeE1vZGUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hdHJpeE1vZGVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE11bHRNYXRyaXhkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE11bHRNYXRyaXhkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTXVsdE1hdHJpeGRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTXVsdE1hdHJpeGQobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE11bHRNYXRyaXhkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNdWx0TWF0cml4ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNdWx0TWF0cml4ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xNdWx0TWF0cml4Zl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE11bHRNYXRyaXhmKGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE11bHRNYXRyaXhmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOZXdMaXN0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE5ld0xpc3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xOZXdMaXN0X0ZVTkMpOwotCWdsTmV3TGlzdChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTmV3TGlzdF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2IKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGUgYXJnMCwgamJ5dGUgYXJnMSwgamJ5dGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNiX0ZVTkMpOwotCWdsTm9ybWFsM2IoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNiX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzYnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2J2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xOb3JtYWwzYnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNidihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2QKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNkX0ZVTkMpOwotCWdsTm9ybWFsM2QoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2R2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2R2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2ZfRlVOQyk7Ci0JZ2xOb3JtYWwzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE5vcm1hbDNmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsM2Z2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNpX0ZVTkMpOwotCWdsTm9ybWFsM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2l2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM3NfRlVOQyk7Ci0JZ2xOb3JtYWwzcyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE5vcm1hbDNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWxQb2ludGVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsUG9pbnRlcihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsUG9pbnRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsT3J0aG8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsT3J0aG8pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczLCBqZG91YmxlIGFyZzQsIGpkb3VibGUgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE9ydGhvX0ZVTkMpOwotCWdsT3J0aG8oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE9ydGhvX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQYXNzVGhyb3VnaAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQYXNzVGhyb3VnaCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBhc3NUaHJvdWdoX0ZVTkMpOwotCWdsUGFzc1Rocm91Z2goYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBhc3NUaHJvdWdoX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQaXhlbE1hcGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBpeGVsTWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xQaXhlbE1hcGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsTWFwZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsTWFwdWl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBpeGVsTWFwdWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFBpeGVsTWFwdWl2KGFyZzAsIGFyZzEsIChjb25zdCBHTHVpbnQgKilscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxNYXB1aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsTWFwdXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwdXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqc2hvcnRBcnJheSBhcmcyKQotewotCWpzaG9ydCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbE1hcHVzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFBpeGVsTWFwdXN2KGFyZzAsIGFyZzEsIChjb25zdCBHTHVzaG9ydCAqKWxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsTWFwdXN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQaXhlbFN0b3JlZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQaXhlbFN0b3JlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWZfRlVOQyk7Ci0JZ2xQaXhlbFN0b3JlZihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsU3RvcmVpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsU3RvcmVpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWlfRlVOQyk7Ci0JZ2xQaXhlbFN0b3JlaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsVHJhbnNmZXJmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsVHJhbnNmZXJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyZl9GVU5DKTsKLQlnbFBpeGVsVHJhbnNmZXJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUGl4ZWxUcmFuc2ZlcmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUGl4ZWxUcmFuc2ZlcmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyaV9GVU5DKTsKLQlnbFBpeGVsVHJhbnNmZXJpKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUGl4ZWxab29tCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsWm9vbSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFpvb21fRlVOQyk7Ci0JZ2xQaXhlbFpvb20oYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsWm9vbV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUG9pbnRTaXplCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvaW50U2l6ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvaW50U2l6ZV9GVU5DKTsKLQlnbFBvaW50U2l6ZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9pbnRTaXplX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb2x5Z29uTW9kZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQb2x5Z29uTW9kZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvbHlnb25Nb2RlX0ZVTkMpOwotCWdsUG9seWdvbk1vZGUoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25Nb2RlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb2x5Z29uT2Zmc2V0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvbHlnb25PZmZzZXQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUG9seWdvbk9mZnNldF9GVU5DKTsKLQlnbFBvbHlnb25PZmZzZXQoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25PZmZzZXRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBvbHlnb25TdGlwcGxlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvbHlnb25TdGlwcGxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb2x5Z29uU3RpcHBsZV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUG9seWdvblN0aXBwbGUoKEdMdWJ5dGUgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25TdGlwcGxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wQXR0cmliKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BBdHRyaWJfRlVOQyk7Ci0JZ2xQb3BBdHRyaWIoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wQXR0cmliX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BDbGllbnRBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wQ2xpZW50QXR0cmliKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BDbGllbnRBdHRyaWJfRlVOQyk7Ci0JZ2xQb3BDbGllbnRBdHRyaWIoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wQ2xpZW50QXR0cmliX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BNYXRyaXgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wTWF0cml4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BNYXRyaXhfRlVOQyk7Ci0JZ2xQb3BNYXRyaXgoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wTWF0cml4X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BOYW1lCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvcE5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvcE5hbWVfRlVOQyk7Ci0JZ2xQb3BOYW1lKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvcE5hbWVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFByaW9yaXRpemVUZXh0dXJlcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQcmlvcml0aXplVGV4dHVyZXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUHJpb3JpdGl6ZVRleHR1cmVzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFByaW9yaXRpemVUZXh0dXJlcyhhcmcwLCAoY29uc3QgR0x1aW50ICopbHBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUHJpb3JpdGl6ZVRleHR1cmVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQdXNoQXR0cmliCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFB1c2hBdHRyaWIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUHVzaEF0dHJpYl9GVU5DKTsKLQlnbFB1c2hBdHRyaWIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFB1c2hBdHRyaWJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFB1c2hDbGllbnRBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUHVzaENsaWVudEF0dHJpYikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoQ2xpZW50QXR0cmliX0ZVTkMpOwotCWdsUHVzaENsaWVudEF0dHJpYihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUHVzaENsaWVudEF0dHJpYl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUHVzaE1hdHJpeAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQdXNoTWF0cml4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoTWF0cml4X0ZVTkMpOwotCWdsUHVzaE1hdHJpeCgpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQdXNoTWF0cml4X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQdXNoTmFtZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQdXNoTmFtZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoTmFtZV9GVU5DKTsKLQlnbFB1c2hOYW1lKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQdXNoTmFtZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyZF9GVU5DKTsKLQlnbFJhc3RlclBvczJkKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczJkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczJkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xSYXN0ZXJQb3MyZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MyZihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MyZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zMmZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyaV9GVU5DKTsKLQlnbFJhc3RlclBvczJpKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczJpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xSYXN0ZXJQb3MyaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMnMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnNfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MycyhhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczJzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3Myc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zMnN2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zM2QKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczNkX0ZVTkMpOwotCWdsUmFzdGVyUG9zM2QoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2R2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFJhc3RlclBvczNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2R2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2ZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczNmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zM2Z2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczNpX0ZVTkMpOwotCWdsUmFzdGVyUG9zM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2l2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFJhc3RlclBvczNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3NfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MzcyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3Mzc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zNGQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zNGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGRfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0ZChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0ZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0ZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczRmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zNGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zNGkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGlfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0aXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczRzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHNfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0cyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0c3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNHN2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczRzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmVhZEJ1ZmZlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWFkQnVmZmVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlYWRCdWZmZXJfRlVOQyk7Ci0JZ2xSZWFkQnVmZmVyKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWFkQnVmZmVyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWFkUGl4ZWxzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlYWRQaXhlbHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludEFycmF5IGFyZzYpCi17Ci0JamludCAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWFkUGl4ZWxzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbFJlYWRQaXhlbHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgbHBhcmc2LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlYWRQaXhlbHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3RkX0ZVTkMpOwotCWdsUmVjdGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlY3RkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWN0ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVjdGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3Rkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsUmVjdGR2KGxwYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0ZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmVjdGZfRlVOQyk7Ci0JZ2xSZWN0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmVjdGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWN0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCWpmbG9hdCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWN0ZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xSZWN0ZnYobHBhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3RpX0ZVTkMpOwotCWdsUmVjdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlY3RpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWN0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVjdGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3Rpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsUmVjdGl2KGxwYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmVjdHNfRlVOQyk7Ci0JZ2xSZWN0cyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmVjdHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWN0c3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCwganNob3J0QXJyYXkgYXJnMSkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCWpzaG9ydCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWN0c3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xSZWN0c3YobHBhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlbmRlck1vZGUKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVuZGVyTW9kZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamludCByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlbmRlck1vZGVfRlVOQyk7Ci0JcmMgPSAoamludClnbFJlbmRlck1vZGUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlbmRlck1vZGVfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSb3RhdGVkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJvdGF0ZWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUm90YXRlZF9GVU5DKTsKLQlnbFJvdGF0ZWQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJvdGF0ZWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJvdGF0ZWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUm90YXRlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqZmxvYXQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJvdGF0ZWZfRlVOQyk7Ci0JZ2xSb3RhdGVmKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSb3RhdGVmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xTY2FsZWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU2NhbGVkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTY2FsZWRfRlVOQyk7Ci0JZ2xTY2FsZWQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFNjYWxlZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU2NhbGVmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNjYWxlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU2NhbGVmX0ZVTkMpOwotCWdsU2NhbGVmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xTY2FsZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFNjaXNzb3IKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU2Npc3NvcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTY2lzc29yX0ZVTkMpOwotCWdsU2Npc3NvcihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU2Npc3Nvcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU2VsZWN0QnVmZmVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNlbGVjdEJ1ZmZlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFNlbGVjdEJ1ZmZlcl9GVU5DKTsKLQlnbFNlbGVjdEJ1ZmZlcihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU2VsZWN0QnVmZmVyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xTaGFkZU1vZGVsCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNoYWRlTW9kZWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU2hhZGVNb2RlbF9GVU5DKTsKLQlnbFNoYWRlTW9kZWwoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFNoYWRlTW9kZWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFN0ZW5jaWxGdW5jCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFN0ZW5jaWxGdW5jKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTdGVuY2lsRnVuY19GVU5DKTsKLQlnbFN0ZW5jaWxGdW5jKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xTdGVuY2lsRnVuY19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU3RlbmNpbE1hc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU3RlbmNpbE1hc2spCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU3RlbmNpbE1hc2tfRlVOQyk7Ci0JZ2xTdGVuY2lsTWFzayhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU3RlbmNpbE1hc2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFN0ZW5jaWxPcAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xTdGVuY2lsT3ApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFN0ZW5jaWxPcF9GVU5DKTsKLQlnbFN0ZW5jaWxPcChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU3RlbmNpbE9wX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZF9GVU5DKTsKLQlnbFRleENvb3JkMWQoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMWR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQxZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMWR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFmX0ZVTkMpOwotCWdsVGV4Q29vcmQxZihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQxZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDFmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMWlfRlVOQyk7Ci0JZ2xUZXhDb29yZDFpKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMWl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxc19GVU5DKTsKLQlnbFRleENvb3JkMXMoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMXN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQxc3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQxc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMmQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmRfRlVOQyk7Ci0JZ2xUZXhDb29yZDJkKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMmR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmZfRlVOQyk7Ci0JZ2xUZXhDb29yZDJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMmZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJpX0ZVTkMpOwotCWdsVGV4Q29vcmQyaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDJpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMnMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQycykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJzX0ZVTkMpOwotCWdsVGV4Q29vcmQycyhhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyc19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQyc3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDJzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQzZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDNkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNkX0ZVTkMpOwotCWdsVGV4Q29vcmQzZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZl9GVU5DKTsKLQlnbFRleENvb3JkM2YoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2Z2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQzZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzaSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzaV9GVU5DKTsKLQlnbFRleENvb3JkM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQzaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDNzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkM3NfRlVOQyk7Ci0JZ2xUZXhDb29yZDNzKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDNzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM3N2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZF9GVU5DKTsKLQlnbFRleENvb3JkNGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkNGR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQ0ZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamZsb2F0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRmX0ZVTkMpOwotCWdsVGV4Q29vcmQ0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQ0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDRmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0aQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNGlfRlVOQyk7Ci0JZ2xUZXhDb29yZDRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkNGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0c19GVU5DKTsKLQlnbFRleENvb3JkNHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkNHN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNHN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQ0c3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZFBvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmRQb2ludGVyKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZFBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhFbnZmX0ZVTkMpOwotCWdsVGV4RW52ZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4RW52Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4RW52ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEVudmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4RW52ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4RW52ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4RW52aV9GVU5DKTsKLQlnbFRleEVudmkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEVudmlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEVudml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEVudml2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFRleEVudml2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhFbnZpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4R2VuZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhHZW5kKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5kX0ZVTkMpOwotCWdsVGV4R2VuZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4R2VuZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4R2VuZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4R2VuZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4R2VuZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4R2VuZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5mCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4R2VuZl9GVU5DKTsKLQlnbFRleEdlbmYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEdlbmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5mdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFRleEdlbmZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5pCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEdlbmlfRlVOQyk7Ci0JZ2xUZXhHZW5pKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhHZW5pX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5pdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhHZW5pdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5pdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xUZXhHZW5pdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4R2VuaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEltYWdlMUQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4SW1hZ2UxRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnRBcnJheSBhcmc3KQotewotCWppbnQgKmxwYXJnNz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4SW1hZ2UxRF9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQl9Ci0JZ2xUZXhJbWFnZTFEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGxwYXJnNyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzcsIGxwYXJnNywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhJbWFnZTFEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhJbWFnZTJECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEltYWdlMkQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcsIGpieXRlQXJyYXkgYXJnOCkKLXsKLQlqYnl0ZSAqbHBhcmc4PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhJbWFnZTJEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBOVUxMKTsKLQl9Ci0JZ2xUZXhJbWFnZTJEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcsIGxwYXJnOCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzgpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBscGFyZzgsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBscGFyZzgsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4SW1hZ2UyRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleFBhcmFtZXRlcmZfRlVOQyk7Ci0JZ2xUZXhQYXJhbWV0ZXJmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhQYXJhbWV0ZXJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xUZXhQYXJhbWV0ZXJmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJpX0ZVTkMpOwotCWdsVGV4UGFyYW1ldGVyaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4UGFyYW1ldGVyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4UGFyYW1ldGVyaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhTdWJJbWFnZTFECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleFN1YkltYWdlMUQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludEFycmF5IGFyZzYpCi17Ci0JamludCAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhTdWJJbWFnZTFEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbFRleFN1YkltYWdlMUQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgbHBhcmc2LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFN1YkltYWdlMURfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleFN1YkltYWdlMkQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4U3ViSW1hZ2UyRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNywgamludEFycmF5IGFyZzgpCi17Ci0JamludCAqbHBhcmc4PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhTdWJJbWFnZTJEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIE5VTEwpOwotCX0KLQlnbFRleFN1YkltYWdlMkQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgbHBhcmc4KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFN1YkltYWdlMkRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRyYW5zbGF0ZWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVHJhbnNsYXRlZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVHJhbnNsYXRlZF9GVU5DKTsKLQlnbFRyYW5zbGF0ZWQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRyYW5zbGF0ZWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRyYW5zbGF0ZWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVHJhbnNsYXRlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVHJhbnNsYXRlZl9GVU5DKTsKLQlnbFRyYW5zbGF0ZWYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRyYW5zbGF0ZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4MmRfRlVOQyk7Ci0JZ2xWZXJ0ZXgyZChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4MmRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXgyZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVmVydGV4MmR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJmX0ZVTkMpOwotCWdsVmVydGV4MmYoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgyZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4MmZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDJmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4MmlfRlVOQyk7Ci0JZ2xWZXJ0ZXgyaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4MmlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXgyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVmVydGV4Mml2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJzX0ZVTkMpOwotCWdsVmVydGV4MnMoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDJzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgyc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4MnN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDJzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDNkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZF9GVU5DKTsKLQlnbFZlcnRleDNkKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2R2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNkdl9GVU5DKTsKLQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JZ2xWZXJ0ZXgzZHYobHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M2YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNmX0ZVTkMpOwotCWdsVmVydGV4M2YoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgzZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDNmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDNpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzaV9GVU5DKTsKLQlnbFZlcnRleDNpKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xWZXJ0ZXgzaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M3MKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNzX0ZVTkMpOwotCWdsVmVydGV4M3MoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgzc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M3N2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDNzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDRkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDRkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRkX0ZVTkMpOwotCWdsVmVydGV4NGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4NGR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4NGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXg0ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqZmxvYXQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRmX0ZVTkMpOwotCWdsVmVydGV4NGYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXg0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDRpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRpX0ZVTkMpOwotCWdsVmVydGV4NGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4NGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4NGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXg0cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyLCBqc2hvcnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRzX0ZVTkMpOwotCWdsVmVydGV4NHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NHN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXg0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleFBvaW50ZXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4UG9pbnRlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50QXJyYXkgYXJnMykKLXsKLQlqaW50ICpscGFyZzM9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsVmVydGV4UG9pbnRlcihhcmcwLCBhcmcxLCBhcmcyLCBscGFyZzMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmczKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgbHBhcmczLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4UG9pbnRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmlld3BvcnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmlld3BvcnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmlld3BvcnRfRlVOQyk7Ci0JZ2xWaWV3cG9ydChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmlld3BvcnRfRlVOQyk7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmMGExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpZmRlZiBfX0FQUExFX18KLSNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KLSNlbHNlCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxHTC9nbC5oPgotI2VuZGlmCi0KLWV4dGVybiBpbnQgSVNfSk5JXzFfMjsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdGF0cy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2VmZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAzMzU7Ci1pbnQgR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbMzM1XTsKLWNoYXIgKiBHTF9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Ci0JImdsQWNjdW0iLCAKLQkiZ2xBbHBoYUZ1bmMiLCAKLQkiZ2xBcmVUZXh0dXJlc1Jlc2lkZW50IiwgCi0JImdsQXJyYXlFbGVtZW50IiwgCi0JImdsQmVnaW4iLCAKLQkiZ2xCaW5kVGV4dHVyZSIsIAotCSJnbEJpdG1hcCIsIAotCSJnbEJsZW5kRnVuYyIsIAotCSJnbENhbGxMaXN0IiwgCi0JImdsQ2FsbExpc3RzX19JSV8zQiIsIAotCSJnbENhbGxMaXN0c19fSUlfM0MiLCAKLQkiZ2xDYWxsTGlzdHNfX0lJXzNJIiwgCi0JImdsQ2xlYXIiLCAKLQkiZ2xDbGVhckFjY3VtIiwgCi0JImdsQ2xlYXJDb2xvciIsIAotCSJnbENsZWFyRGVwdGgiLCAKLQkiZ2xDbGVhckluZGV4IiwgCi0JImdsQ2xlYXJTdGVuY2lsIiwgCi0JImdsQ2xpcFBsYW5lIiwgCi0JImdsQ29sb3IzYiIsIAotCSJnbENvbG9yM2J2IiwgCi0JImdsQ29sb3IzZCIsIAotCSJnbENvbG9yM2R2IiwgCi0JImdsQ29sb3IzZiIsIAotCSJnbENvbG9yM2Z2IiwgCi0JImdsQ29sb3IzaSIsIAotCSJnbENvbG9yM2l2IiwgCi0JImdsQ29sb3IzcyIsIAotCSJnbENvbG9yM3N2IiwgCi0JImdsQ29sb3IzdWIiLCAKLQkiZ2xDb2xvcjN1YnYiLCAKLQkiZ2xDb2xvcjN1aSIsIAotCSJnbENvbG9yM3VpdiIsIAotCSJnbENvbG9yM3VzIiwgCi0JImdsQ29sb3IzdXN2IiwgCi0JImdsQ29sb3I0YiIsIAotCSJnbENvbG9yNGJ2IiwgCi0JImdsQ29sb3I0ZCIsIAotCSJnbENvbG9yNGR2IiwgCi0JImdsQ29sb3I0ZiIsIAotCSJnbENvbG9yNGZ2IiwgCi0JImdsQ29sb3I0aSIsIAotCSJnbENvbG9yNGl2IiwgCi0JImdsQ29sb3I0cyIsIAotCSJnbENvbG9yNHViIiwgCi0JImdsQ29sb3I0dWJ2IiwgCi0JImdsQ29sb3I0dWkiLCAKLQkiZ2xDb2xvcjR1aXYiLCAKLQkiZ2xDb2xvcjR1cyIsIAotCSJnbENvbG9yNHVzdiIsIAotCSJnbENvbG9yTWFzayIsIAotCSJnbENvbG9yTWF0ZXJpYWwiLCAKLQkiZ2xDb2xvclBvaW50ZXIiLCAKLQkiZ2xDb3B5UGl4ZWxzIiwgCi0JImdsQ29weVRleEltYWdlMUQiLCAKLQkiZ2xDb3B5VGV4SW1hZ2UyRCIsIAotCSJnbENvcHlUZXhTdWJJbWFnZTFEIiwgCi0JImdsQ29weVRleFN1YkltYWdlMkQiLCAKLQkiZ2xDdWxsRmFjZSIsIAotCSJnbERlbGV0ZUxpc3RzIiwgCi0JImdsRGVsZXRlVGV4dHVyZXMiLCAKLQkiZ2xEZXB0aEZ1bmMiLCAKLQkiZ2xEZXB0aE1hc2siLCAKLQkiZ2xEZXB0aFJhbmdlIiwgCi0JImdsRGlzYWJsZSIsIAotCSJnbERpc2FibGVDbGllbnRTdGF0ZSIsIAotCSJnbERyYXdBcnJheXMiLCAKLQkiZ2xEcmF3QnVmZmVyIiwgCi0JImdsRHJhd0VsZW1lbnRzIiwgCi0JImdsRHJhd1BpeGVscyIsIAotCSJnbEVkZ2VGbGFnIiwgCi0JImdsRWRnZUZsYWdQb2ludGVyIiwgCi0JImdsRWRnZUZsYWd2IiwgCi0JImdsRW5hYmxlIiwgCi0JImdsRW5hYmxlQ2xpZW50U3RhdGUiLCAKLQkiZ2xFbmQiLCAKLQkiZ2xFbmRMaXN0IiwgCi0JImdsRXZhbENvb3JkMWQiLCAKLQkiZ2xFdmFsQ29vcmQxZHYiLCAKLQkiZ2xFdmFsQ29vcmQxZiIsIAotCSJnbEV2YWxDb29yZDFmdiIsIAotCSJnbEV2YWxDb29yZDJkIiwgCi0JImdsRXZhbENvb3JkMmR2IiwgCi0JImdsRXZhbENvb3JkMmYiLCAKLQkiZ2xFdmFsQ29vcmQyZnYiLCAKLQkiZ2xFdmFsTWVzaDEiLCAKLQkiZ2xFdmFsTWVzaDIiLCAKLQkiZ2xFdmFsUG9pbnQxIiwgCi0JImdsRXZhbFBvaW50MiIsIAotCSJnbEZlZWRiYWNrQnVmZmVyIiwgCi0JImdsRmluaXNoIiwgCi0JImdsRmx1c2giLCAKLQkiZ2xGb2dmIiwgCi0JImdsRm9nZnYiLCAKLQkiZ2xGb2dpIiwgCi0JImdsRm9naXYiLCAKLQkiZ2xGcm9udEZhY2UiLCAKLQkiZ2xGcnVzdHVtIiwgCi0JImdsR2VuTGlzdHMiLCAKLQkiZ2xHZW5UZXh0dXJlcyIsIAotCSJnbEdldEJvb2xlYW52IiwgCi0JImdsR2V0Q2xpcFBsYW5lIiwgCi0JImdsR2V0RG91YmxldiIsIAotCSJnbEdldEVycm9yIiwgCi0JImdsR2V0RmxvYXR2IiwgCi0JImdsR2V0SW50ZWdlcnYiLCAKLQkiZ2xHZXRMaWdodGZ2IiwgCi0JImdsR2V0TGlnaHRpdiIsIAotCSJnbEdldE1hcGR2IiwgCi0JImdsR2V0TWFwZnYiLCAKLQkiZ2xHZXRNYXBpdiIsIAotCSJnbEdldE1hdGVyaWFsZnYiLCAKLQkiZ2xHZXRNYXRlcmlhbGl2IiwgCi0JImdsR2V0UGl4ZWxNYXBmdiIsIAotCSJnbEdldFBpeGVsTWFwdWl2IiwgCi0JImdsR2V0UGl4ZWxNYXB1c3YiLCAKLQkiZ2xHZXRQb2ludGVydiIsIAotCSJnbEdldFBvbHlnb25TdGlwcGxlIiwgCi0JImdsR2V0U3RyaW5nIiwgCi0JImdsR2V0VGV4RW52ZnYiLCAKLQkiZ2xHZXRUZXhFbnZpdiIsIAotCSJnbEdldFRleEdlbmR2IiwgCi0JImdsR2V0VGV4R2VuZnYiLCAKLQkiZ2xHZXRUZXhHZW5pdiIsIAotCSJnbEdldFRleEltYWdlIiwgCi0JImdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdiIsIAotCSJnbEdldFRleExldmVsUGFyYW1ldGVyaXYiLCAKLQkiZ2xHZXRUZXhQYXJhbWV0ZXJmdiIsIAotCSJnbEdldFRleFBhcmFtZXRlcml2IiwgCi0JImdsSGludCIsIAotCSJnbEluZGV4TWFzayIsIAotCSJnbEluZGV4UG9pbnRlciIsIAotCSJnbEluZGV4ZCIsIAotCSJnbEluZGV4ZHYiLCAKLQkiZ2xJbmRleGYiLCAKLQkiZ2xJbmRleGZ2IiwgCi0JImdsSW5kZXhpIiwgCi0JImdsSW5kZXhpdiIsIAotCSJnbEluZGV4cyIsIAotCSJnbEluZGV4c3YiLCAKLQkiZ2xJbml0TmFtZXMiLCAKLQkiZ2xJbnRlcmxlYXZlZEFycmF5cyIsIAotCSJnbElzRW5hYmxlZCIsIAotCSJnbElzTGlzdCIsIAotCSJnbElzVGV4dHVyZSIsIAotCSJnbExpZ2h0TW9kZWxmIiwgCi0JImdsTGlnaHRNb2RlbGZ2IiwgCi0JImdsTGlnaHRNb2RlbGkiLCAKLQkiZ2xMaWdodE1vZGVsaXYiLCAKLQkiZ2xMaWdodGYiLCAKLQkiZ2xMaWdodGZ2IiwgCi0JImdsTGlnaHRpIiwgCi0JImdsTGlnaHRpdiIsIAotCSJnbExpbmVTdGlwcGxlIiwgCi0JImdsTGluZVdpZHRoIiwgCi0JImdsTGlzdEJhc2UiLCAKLQkiZ2xMb2FkSWRlbnRpdHkiLCAKLQkiZ2xMb2FkTWF0cml4ZCIsIAotCSJnbExvYWRNYXRyaXhmIiwgCi0JImdsTG9hZE5hbWUiLCAKLQkiZ2xMb2dpY09wIiwgCi0JImdsTWFwMWQiLCAKLQkiZ2xNYXAxZiIsIAotCSJnbE1hcDJkIiwgCi0JImdsTWFwMmYiLCAKLQkiZ2xNYXBHcmlkMWQiLCAKLQkiZ2xNYXBHcmlkMWYiLCAKLQkiZ2xNYXBHcmlkMmQiLCAKLQkiZ2xNYXBHcmlkMmYiLCAKLQkiZ2xNYXRlcmlhbGYiLCAKLQkiZ2xNYXRlcmlhbGZ2IiwgCi0JImdsTWF0ZXJpYWxpIiwgCi0JImdsTWF0ZXJpYWxpdiIsIAotCSJnbE1hdHJpeE1vZGUiLCAKLQkiZ2xNdWx0TWF0cml4ZCIsIAotCSJnbE11bHRNYXRyaXhmIiwgCi0JImdsTmV3TGlzdCIsIAotCSJnbE5vcm1hbDNiIiwgCi0JImdsTm9ybWFsM2J2IiwgCi0JImdsTm9ybWFsM2QiLCAKLQkiZ2xOb3JtYWwzZHYiLCAKLQkiZ2xOb3JtYWwzZiIsIAotCSJnbE5vcm1hbDNmdiIsIAotCSJnbE5vcm1hbDNpIiwgCi0JImdsTm9ybWFsM2l2IiwgCi0JImdsTm9ybWFsM3MiLCAKLQkiZ2xOb3JtYWwzc3YiLCAKLQkiZ2xOb3JtYWxQb2ludGVyIiwgCi0JImdsT3J0aG8iLCAKLQkiZ2xQYXNzVGhyb3VnaCIsIAotCSJnbFBpeGVsTWFwZnYiLCAKLQkiZ2xQaXhlbE1hcHVpdiIsIAotCSJnbFBpeGVsTWFwdXN2IiwgCi0JImdsUGl4ZWxTdG9yZWYiLCAKLQkiZ2xQaXhlbFN0b3JlaSIsIAotCSJnbFBpeGVsVHJhbnNmZXJmIiwgCi0JImdsUGl4ZWxUcmFuc2ZlcmkiLCAKLQkiZ2xQaXhlbFpvb20iLCAKLQkiZ2xQb2ludFNpemUiLCAKLQkiZ2xQb2x5Z29uTW9kZSIsIAotCSJnbFBvbHlnb25PZmZzZXQiLCAKLQkiZ2xQb2x5Z29uU3RpcHBsZSIsIAotCSJnbFBvcEF0dHJpYiIsIAotCSJnbFBvcENsaWVudEF0dHJpYiIsIAotCSJnbFBvcE1hdHJpeCIsIAotCSJnbFBvcE5hbWUiLCAKLQkiZ2xQcmlvcml0aXplVGV4dHVyZXMiLCAKLQkiZ2xQdXNoQXR0cmliIiwgCi0JImdsUHVzaENsaWVudEF0dHJpYiIsIAotCSJnbFB1c2hNYXRyaXgiLCAKLQkiZ2xQdXNoTmFtZSIsIAotCSJnbFJhc3RlclBvczJkIiwgCi0JImdsUmFzdGVyUG9zMmR2IiwgCi0JImdsUmFzdGVyUG9zMmYiLCAKLQkiZ2xSYXN0ZXJQb3MyZnYiLCAKLQkiZ2xSYXN0ZXJQb3MyaSIsIAotCSJnbFJhc3RlclBvczJpdiIsIAotCSJnbFJhc3RlclBvczJzIiwgCi0JImdsUmFzdGVyUG9zMnN2IiwgCi0JImdsUmFzdGVyUG9zM2QiLCAKLQkiZ2xSYXN0ZXJQb3MzZHYiLCAKLQkiZ2xSYXN0ZXJQb3MzZiIsIAotCSJnbFJhc3RlclBvczNmdiIsIAotCSJnbFJhc3RlclBvczNpIiwgCi0JImdsUmFzdGVyUG9zM2l2IiwgCi0JImdsUmFzdGVyUG9zM3MiLCAKLQkiZ2xSYXN0ZXJQb3Mzc3YiLCAKLQkiZ2xSYXN0ZXJQb3M0ZCIsIAotCSJnbFJhc3RlclBvczRkdiIsIAotCSJnbFJhc3RlclBvczRmIiwgCi0JImdsUmFzdGVyUG9zNGZ2IiwgCi0JImdsUmFzdGVyUG9zNGkiLCAKLQkiZ2xSYXN0ZXJQb3M0aXYiLCAKLQkiZ2xSYXN0ZXJQb3M0cyIsIAotCSJnbFJhc3RlclBvczRzdiIsIAotCSJnbFJlYWRCdWZmZXIiLCAKLQkiZ2xSZWFkUGl4ZWxzIiwgCi0JImdsUmVjdGQiLCAKLQkiZ2xSZWN0ZHYiLCAKLQkiZ2xSZWN0ZiIsIAotCSJnbFJlY3RmdiIsIAotCSJnbFJlY3RpIiwgCi0JImdsUmVjdGl2IiwgCi0JImdsUmVjdHMiLCAKLQkiZ2xSZWN0c3YiLCAKLQkiZ2xSZW5kZXJNb2RlIiwgCi0JImdsUm90YXRlZCIsIAotCSJnbFJvdGF0ZWYiLCAKLQkiZ2xTY2FsZWQiLCAKLQkiZ2xTY2FsZWYiLCAKLQkiZ2xTY2lzc29yIiwgCi0JImdsU2VsZWN0QnVmZmVyIiwgCi0JImdsU2hhZGVNb2RlbCIsIAotCSJnbFN0ZW5jaWxGdW5jIiwgCi0JImdsU3RlbmNpbE1hc2siLCAKLQkiZ2xTdGVuY2lsT3AiLCAKLQkiZ2xUZXhDb29yZDFkIiwgCi0JImdsVGV4Q29vcmQxZHYiLCAKLQkiZ2xUZXhDb29yZDFmIiwgCi0JImdsVGV4Q29vcmQxZnYiLCAKLQkiZ2xUZXhDb29yZDFpIiwgCi0JImdsVGV4Q29vcmQxaXYiLCAKLQkiZ2xUZXhDb29yZDFzIiwgCi0JImdsVGV4Q29vcmQxc3YiLCAKLQkiZ2xUZXhDb29yZDJkIiwgCi0JImdsVGV4Q29vcmQyZHYiLCAKLQkiZ2xUZXhDb29yZDJmIiwgCi0JImdsVGV4Q29vcmQyZnYiLCAKLQkiZ2xUZXhDb29yZDJpIiwgCi0JImdsVGV4Q29vcmQyaXYiLCAKLQkiZ2xUZXhDb29yZDJzIiwgCi0JImdsVGV4Q29vcmQyc3YiLCAKLQkiZ2xUZXhDb29yZDNkIiwgCi0JImdsVGV4Q29vcmQzZHYiLCAKLQkiZ2xUZXhDb29yZDNmIiwgCi0JImdsVGV4Q29vcmQzZnYiLCAKLQkiZ2xUZXhDb29yZDNpIiwgCi0JImdsVGV4Q29vcmQzaXYiLCAKLQkiZ2xUZXhDb29yZDNzIiwgCi0JImdsVGV4Q29vcmQzc3YiLCAKLQkiZ2xUZXhDb29yZDRkIiwgCi0JImdsVGV4Q29vcmQ0ZHYiLCAKLQkiZ2xUZXhDb29yZDRmIiwgCi0JImdsVGV4Q29vcmQ0ZnYiLCAKLQkiZ2xUZXhDb29yZDRpIiwgCi0JImdsVGV4Q29vcmQ0aXYiLCAKLQkiZ2xUZXhDb29yZDRzIiwgCi0JImdsVGV4Q29vcmQ0c3YiLCAKLQkiZ2xUZXhDb29yZFBvaW50ZXIiLCAKLQkiZ2xUZXhFbnZmIiwgCi0JImdsVGV4RW52ZnYiLCAKLQkiZ2xUZXhFbnZpIiwgCi0JImdsVGV4RW52aXYiLCAKLQkiZ2xUZXhHZW5kIiwgCi0JImdsVGV4R2VuZHYiLCAKLQkiZ2xUZXhHZW5mIiwgCi0JImdsVGV4R2VuZnYiLCAKLQkiZ2xUZXhHZW5pIiwgCi0JImdsVGV4R2VuaXYiLCAKLQkiZ2xUZXhJbWFnZTFEIiwgCi0JImdsVGV4SW1hZ2UyRCIsIAotCSJnbFRleFBhcmFtZXRlcmYiLCAKLQkiZ2xUZXhQYXJhbWV0ZXJmdiIsIAotCSJnbFRleFBhcmFtZXRlcmkiLCAKLQkiZ2xUZXhQYXJhbWV0ZXJpdiIsIAotCSJnbFRleFN1YkltYWdlMUQiLCAKLQkiZ2xUZXhTdWJJbWFnZTJEIiwgCi0JImdsVHJhbnNsYXRlZCIsIAotCSJnbFRyYW5zbGF0ZWYiLCAKLQkiZ2xWZXJ0ZXgyZCIsIAotCSJnbFZlcnRleDJkdiIsIAotCSJnbFZlcnRleDJmIiwgCi0JImdsVmVydGV4MmZ2IiwgCi0JImdsVmVydGV4MmkiLCAKLQkiZ2xWZXJ0ZXgyaXYiLCAKLQkiZ2xWZXJ0ZXgycyIsIAotCSJnbFZlcnRleDJzdiIsIAotCSJnbFZlcnRleDNkIiwgCi0JImdsVmVydGV4M2R2IiwgCi0JImdsVmVydGV4M2YiLCAKLQkiZ2xWZXJ0ZXgzZnYiLCAKLQkiZ2xWZXJ0ZXgzaSIsIAotCSJnbFZlcnRleDNpdiIsIAotCSJnbFZlcnRleDNzIiwgCi0JImdsVmVydGV4M3N2IiwgCi0JImdsVmVydGV4NGQiLCAKLQkiZ2xWZXJ0ZXg0ZHYiLCAKLQkiZ2xWZXJ0ZXg0ZiIsIAotCSJnbFZlcnRleDRmdiIsIAotCSJnbFZlcnRleDRpIiwgCi0JImdsVmVydGV4NGl2IiwgCi0JImdsVmVydGV4NHMiLCAKLQkiZ2xWZXJ0ZXg0c3YiLCAKLQkiZ2xWZXJ0ZXhQb2ludGVyIiwgCi0JImdsVmlld3BvcnQiLCAKLX07Ci0KLSNkZWZpbmUgU1RBVFNfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X3Rvb2xzX2ludGVybmFsX05hdGl2ZVN0YXRzXyMjZnVuYwotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25Db3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCXJldHVybiBHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotfQotCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25OYW1lKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tpbmRleF0pOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25DYWxsQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdGF0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWZlZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotI2lmZGVmIE5BVElWRV9TVEFUUwotZXh0ZXJuIGludCBHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBHTF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOwotZXh0ZXJuIGNoYXIqIEdMX25hdGl2ZUZ1bmN0aW9uTmFtZXNbXTsKLSNkZWZpbmUgR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbZnVuY10rKzsKLSNkZWZpbmUgR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbHNlCi0jZGVmaW5lIEdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JZ2xBY2N1bV9GVU5DLAotCWdsQWxwaGFGdW5jX0ZVTkMsCi0JZ2xBcmVUZXh0dXJlc1Jlc2lkZW50X0ZVTkMsCi0JZ2xBcnJheUVsZW1lbnRfRlVOQywKLQlnbEJlZ2luX0ZVTkMsCi0JZ2xCaW5kVGV4dHVyZV9GVU5DLAotCWdsQml0bWFwX0ZVTkMsCi0JZ2xCbGVuZEZ1bmNfRlVOQywKLQlnbENhbGxMaXN0X0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNJX0ZVTkMsCi0JZ2xDbGVhcl9GVU5DLAotCWdsQ2xlYXJBY2N1bV9GVU5DLAotCWdsQ2xlYXJDb2xvcl9GVU5DLAotCWdsQ2xlYXJEZXB0aF9GVU5DLAotCWdsQ2xlYXJJbmRleF9GVU5DLAotCWdsQ2xlYXJTdGVuY2lsX0ZVTkMsCi0JZ2xDbGlwUGxhbmVfRlVOQywKLQlnbENvbG9yM2JfRlVOQywKLQlnbENvbG9yM2J2X0ZVTkMsCi0JZ2xDb2xvcjNkX0ZVTkMsCi0JZ2xDb2xvcjNkdl9GVU5DLAotCWdsQ29sb3IzZl9GVU5DLAotCWdsQ29sb3IzZnZfRlVOQywKLQlnbENvbG9yM2lfRlVOQywKLQlnbENvbG9yM2l2X0ZVTkMsCi0JZ2xDb2xvcjNzX0ZVTkMsCi0JZ2xDb2xvcjNzdl9GVU5DLAotCWdsQ29sb3IzdWJfRlVOQywKLQlnbENvbG9yM3Vidl9GVU5DLAotCWdsQ29sb3IzdWlfRlVOQywKLQlnbENvbG9yM3Vpdl9GVU5DLAotCWdsQ29sb3IzdXNfRlVOQywKLQlnbENvbG9yM3Vzdl9GVU5DLAotCWdsQ29sb3I0Yl9GVU5DLAotCWdsQ29sb3I0YnZfRlVOQywKLQlnbENvbG9yNGRfRlVOQywKLQlnbENvbG9yNGR2X0ZVTkMsCi0JZ2xDb2xvcjRmX0ZVTkMsCi0JZ2xDb2xvcjRmdl9GVU5DLAotCWdsQ29sb3I0aV9GVU5DLAotCWdsQ29sb3I0aXZfRlVOQywKLQlnbENvbG9yNHNfRlVOQywKLQlnbENvbG9yNHViX0ZVTkMsCi0JZ2xDb2xvcjR1YnZfRlVOQywKLQlnbENvbG9yNHVpX0ZVTkMsCi0JZ2xDb2xvcjR1aXZfRlVOQywKLQlnbENvbG9yNHVzX0ZVTkMsCi0JZ2xDb2xvcjR1c3ZfRlVOQywKLQlnbENvbG9yTWFza19GVU5DLAotCWdsQ29sb3JNYXRlcmlhbF9GVU5DLAotCWdsQ29sb3JQb2ludGVyX0ZVTkMsCi0JZ2xDb3B5UGl4ZWxzX0ZVTkMsCi0JZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DLAotCWdsQ29weVRleEltYWdlMkRfRlVOQywKLQlnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMsCi0JZ2xDb3B5VGV4U3ViSW1hZ2UyRF9GVU5DLAotCWdsQ3VsbEZhY2VfRlVOQywKLQlnbERlbGV0ZUxpc3RzX0ZVTkMsCi0JZ2xEZWxldGVUZXh0dXJlc19GVU5DLAotCWdsRGVwdGhGdW5jX0ZVTkMsCi0JZ2xEZXB0aE1hc2tfRlVOQywKLQlnbERlcHRoUmFuZ2VfRlVOQywKLQlnbERpc2FibGVfRlVOQywKLQlnbERpc2FibGVDbGllbnRTdGF0ZV9GVU5DLAotCWdsRHJhd0FycmF5c19GVU5DLAotCWdsRHJhd0J1ZmZlcl9GVU5DLAotCWdsRHJhd0VsZW1lbnRzX0ZVTkMsCi0JZ2xEcmF3UGl4ZWxzX0ZVTkMsCi0JZ2xFZGdlRmxhZ19GVU5DLAotCWdsRWRnZUZsYWdQb2ludGVyX0ZVTkMsCi0JZ2xFZGdlRmxhZ3ZfRlVOQywKLQlnbEVuYWJsZV9GVU5DLAotCWdsRW5hYmxlQ2xpZW50U3RhdGVfRlVOQywKLQlnbEVuZF9GVU5DLAotCWdsRW5kTGlzdF9GVU5DLAotCWdsRXZhbENvb3JkMWRfRlVOQywKLQlnbEV2YWxDb29yZDFkdl9GVU5DLAotCWdsRXZhbENvb3JkMWZfRlVOQywKLQlnbEV2YWxDb29yZDFmdl9GVU5DLAotCWdsRXZhbENvb3JkMmRfRlVOQywKLQlnbEV2YWxDb29yZDJkdl9GVU5DLAotCWdsRXZhbENvb3JkMmZfRlVOQywKLQlnbEV2YWxDb29yZDJmdl9GVU5DLAotCWdsRXZhbE1lc2gxX0ZVTkMsCi0JZ2xFdmFsTWVzaDJfRlVOQywKLQlnbEV2YWxQb2ludDFfRlVOQywKLQlnbEV2YWxQb2ludDJfRlVOQywKLQlnbEZlZWRiYWNrQnVmZmVyX0ZVTkMsCi0JZ2xGaW5pc2hfRlVOQywKLQlnbEZsdXNoX0ZVTkMsCi0JZ2xGb2dmX0ZVTkMsCi0JZ2xGb2dmdl9GVU5DLAotCWdsRm9naV9GVU5DLAotCWdsRm9naXZfRlVOQywKLQlnbEZyb250RmFjZV9GVU5DLAotCWdsRnJ1c3R1bV9GVU5DLAotCWdsR2VuTGlzdHNfRlVOQywKLQlnbEdlblRleHR1cmVzX0ZVTkMsCi0JZ2xHZXRCb29sZWFudl9GVU5DLAotCWdsR2V0Q2xpcFBsYW5lX0ZVTkMsCi0JZ2xHZXREb3VibGV2X0ZVTkMsCi0JZ2xHZXRFcnJvcl9GVU5DLAotCWdsR2V0RmxvYXR2X0ZVTkMsCi0JZ2xHZXRJbnRlZ2Vydl9GVU5DLAotCWdsR2V0TGlnaHRmdl9GVU5DLAotCWdsR2V0TGlnaHRpdl9GVU5DLAotCWdsR2V0TWFwZHZfRlVOQywKLQlnbEdldE1hcGZ2X0ZVTkMsCi0JZ2xHZXRNYXBpdl9GVU5DLAotCWdsR2V0TWF0ZXJpYWxmdl9GVU5DLAotCWdsR2V0TWF0ZXJpYWxpdl9GVU5DLAotCWdsR2V0UGl4ZWxNYXBmdl9GVU5DLAotCWdsR2V0UGl4ZWxNYXB1aXZfRlVOQywKLQlnbEdldFBpeGVsTWFwdXN2X0ZVTkMsCi0JZ2xHZXRQb2ludGVydl9GVU5DLAotCWdsR2V0UG9seWdvblN0aXBwbGVfRlVOQywKLQlnbEdldFN0cmluZ19GVU5DLAotCWdsR2V0VGV4RW52ZnZfRlVOQywKLQlnbEdldFRleEVudml2X0ZVTkMsCi0JZ2xHZXRUZXhHZW5kdl9GVU5DLAotCWdsR2V0VGV4R2VuZnZfRlVOQywKLQlnbEdldFRleEdlbml2X0ZVTkMsCi0JZ2xHZXRUZXhJbWFnZV9GVU5DLAotCWdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DLAotCWdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl9GVU5DLAotCWdsR2V0VGV4UGFyYW1ldGVyZnZfRlVOQywKLQlnbEdldFRleFBhcmFtZXRlcml2X0ZVTkMsCi0JZ2xIaW50X0ZVTkMsCi0JZ2xJbmRleE1hc2tfRlVOQywKLQlnbEluZGV4UG9pbnRlcl9GVU5DLAotCWdsSW5kZXhkX0ZVTkMsCi0JZ2xJbmRleGR2X0ZVTkMsCi0JZ2xJbmRleGZfRlVOQywKLQlnbEluZGV4ZnZfRlVOQywKLQlnbEluZGV4aV9GVU5DLAotCWdsSW5kZXhpdl9GVU5DLAotCWdsSW5kZXhzX0ZVTkMsCi0JZ2xJbmRleHN2X0ZVTkMsCi0JZ2xJbml0TmFtZXNfRlVOQywKLQlnbEludGVybGVhdmVkQXJyYXlzX0ZVTkMsCi0JZ2xJc0VuYWJsZWRfRlVOQywKLQlnbElzTGlzdF9GVU5DLAotCWdsSXNUZXh0dXJlX0ZVTkMsCi0JZ2xMaWdodE1vZGVsZl9GVU5DLAotCWdsTGlnaHRNb2RlbGZ2X0ZVTkMsCi0JZ2xMaWdodE1vZGVsaV9GVU5DLAotCWdsTGlnaHRNb2RlbGl2X0ZVTkMsCi0JZ2xMaWdodGZfRlVOQywKLQlnbExpZ2h0ZnZfRlVOQywKLQlnbExpZ2h0aV9GVU5DLAotCWdsTGlnaHRpdl9GVU5DLAotCWdsTGluZVN0aXBwbGVfRlVOQywKLQlnbExpbmVXaWR0aF9GVU5DLAotCWdsTGlzdEJhc2VfRlVOQywKLQlnbExvYWRJZGVudGl0eV9GVU5DLAotCWdsTG9hZE1hdHJpeGRfRlVOQywKLQlnbExvYWRNYXRyaXhmX0ZVTkMsCi0JZ2xMb2FkTmFtZV9GVU5DLAotCWdsTG9naWNPcF9GVU5DLAotCWdsTWFwMWRfRlVOQywKLQlnbE1hcDFmX0ZVTkMsCi0JZ2xNYXAyZF9GVU5DLAotCWdsTWFwMmZfRlVOQywKLQlnbE1hcEdyaWQxZF9GVU5DLAotCWdsTWFwR3JpZDFmX0ZVTkMsCi0JZ2xNYXBHcmlkMmRfRlVOQywKLQlnbE1hcEdyaWQyZl9GVU5DLAotCWdsTWF0ZXJpYWxmX0ZVTkMsCi0JZ2xNYXRlcmlhbGZ2X0ZVTkMsCi0JZ2xNYXRlcmlhbGlfRlVOQywKLQlnbE1hdGVyaWFsaXZfRlVOQywKLQlnbE1hdHJpeE1vZGVfRlVOQywKLQlnbE11bHRNYXRyaXhkX0ZVTkMsCi0JZ2xNdWx0TWF0cml4Zl9GVU5DLAotCWdsTmV3TGlzdF9GVU5DLAotCWdsTm9ybWFsM2JfRlVOQywKLQlnbE5vcm1hbDNidl9GVU5DLAotCWdsTm9ybWFsM2RfRlVOQywKLQlnbE5vcm1hbDNkdl9GVU5DLAotCWdsTm9ybWFsM2ZfRlVOQywKLQlnbE5vcm1hbDNmdl9GVU5DLAotCWdsTm9ybWFsM2lfRlVOQywKLQlnbE5vcm1hbDNpdl9GVU5DLAotCWdsTm9ybWFsM3NfRlVOQywKLQlnbE5vcm1hbDNzdl9GVU5DLAotCWdsTm9ybWFsUG9pbnRlcl9GVU5DLAotCWdsT3J0aG9fRlVOQywKLQlnbFBhc3NUaHJvdWdoX0ZVTkMsCi0JZ2xQaXhlbE1hcGZ2X0ZVTkMsCi0JZ2xQaXhlbE1hcHVpdl9GVU5DLAotCWdsUGl4ZWxNYXB1c3ZfRlVOQywKLQlnbFBpeGVsU3RvcmVmX0ZVTkMsCi0JZ2xQaXhlbFN0b3JlaV9GVU5DLAotCWdsUGl4ZWxUcmFuc2ZlcmZfRlVOQywKLQlnbFBpeGVsVHJhbnNmZXJpX0ZVTkMsCi0JZ2xQaXhlbFpvb21fRlVOQywKLQlnbFBvaW50U2l6ZV9GVU5DLAotCWdsUG9seWdvbk1vZGVfRlVOQywKLQlnbFBvbHlnb25PZmZzZXRfRlVOQywKLQlnbFBvbHlnb25TdGlwcGxlX0ZVTkMsCi0JZ2xQb3BBdHRyaWJfRlVOQywKLQlnbFBvcENsaWVudEF0dHJpYl9GVU5DLAotCWdsUG9wTWF0cml4X0ZVTkMsCi0JZ2xQb3BOYW1lX0ZVTkMsCi0JZ2xQcmlvcml0aXplVGV4dHVyZXNfRlVOQywKLQlnbFB1c2hBdHRyaWJfRlVOQywKLQlnbFB1c2hDbGllbnRBdHRyaWJfRlVOQywKLQlnbFB1c2hNYXRyaXhfRlVOQywKLQlnbFB1c2hOYW1lX0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyZF9GVU5DLAotCWdsUmFzdGVyUG9zMmR2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyZl9GVU5DLAotCWdsUmFzdGVyUG9zMmZ2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyaV9GVU5DLAotCWdsUmFzdGVyUG9zMml2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3Myc19GVU5DLAotCWdsUmFzdGVyUG9zMnN2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzZF9GVU5DLAotCWdsUmFzdGVyUG9zM2R2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzZl9GVU5DLAotCWdsUmFzdGVyUG9zM2Z2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzaV9GVU5DLAotCWdsUmFzdGVyUG9zM2l2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3Mzc19GVU5DLAotCWdsUmFzdGVyUG9zM3N2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0ZF9GVU5DLAotCWdsUmFzdGVyUG9zNGR2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0Zl9GVU5DLAotCWdsUmFzdGVyUG9zNGZ2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0aV9GVU5DLAotCWdsUmFzdGVyUG9zNGl2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0c19GVU5DLAotCWdsUmFzdGVyUG9zNHN2X0ZVTkMsCi0JZ2xSZWFkQnVmZmVyX0ZVTkMsCi0JZ2xSZWFkUGl4ZWxzX0ZVTkMsCi0JZ2xSZWN0ZF9GVU5DLAotCWdsUmVjdGR2X0ZVTkMsCi0JZ2xSZWN0Zl9GVU5DLAotCWdsUmVjdGZ2X0ZVTkMsCi0JZ2xSZWN0aV9GVU5DLAotCWdsUmVjdGl2X0ZVTkMsCi0JZ2xSZWN0c19GVU5DLAotCWdsUmVjdHN2X0ZVTkMsCi0JZ2xSZW5kZXJNb2RlX0ZVTkMsCi0JZ2xSb3RhdGVkX0ZVTkMsCi0JZ2xSb3RhdGVmX0ZVTkMsCi0JZ2xTY2FsZWRfRlVOQywKLQlnbFNjYWxlZl9GVU5DLAotCWdsU2Npc3Nvcl9GVU5DLAotCWdsU2VsZWN0QnVmZmVyX0ZVTkMsCi0JZ2xTaGFkZU1vZGVsX0ZVTkMsCi0JZ2xTdGVuY2lsRnVuY19GVU5DLAotCWdsU3RlbmNpbE1hc2tfRlVOQywKLQlnbFN0ZW5jaWxPcF9GVU5DLAotCWdsVGV4Q29vcmQxZF9GVU5DLAotCWdsVGV4Q29vcmQxZHZfRlVOQywKLQlnbFRleENvb3JkMWZfRlVOQywKLQlnbFRleENvb3JkMWZ2X0ZVTkMsCi0JZ2xUZXhDb29yZDFpX0ZVTkMsCi0JZ2xUZXhDb29yZDFpdl9GVU5DLAotCWdsVGV4Q29vcmQxc19GVU5DLAotCWdsVGV4Q29vcmQxc3ZfRlVOQywKLQlnbFRleENvb3JkMmRfRlVOQywKLQlnbFRleENvb3JkMmR2X0ZVTkMsCi0JZ2xUZXhDb29yZDJmX0ZVTkMsCi0JZ2xUZXhDb29yZDJmdl9GVU5DLAotCWdsVGV4Q29vcmQyaV9GVU5DLAotCWdsVGV4Q29vcmQyaXZfRlVOQywKLQlnbFRleENvb3JkMnNfRlVOQywKLQlnbFRleENvb3JkMnN2X0ZVTkMsCi0JZ2xUZXhDb29yZDNkX0ZVTkMsCi0JZ2xUZXhDb29yZDNkdl9GVU5DLAotCWdsVGV4Q29vcmQzZl9GVU5DLAotCWdsVGV4Q29vcmQzZnZfRlVOQywKLQlnbFRleENvb3JkM2lfRlVOQywKLQlnbFRleENvb3JkM2l2X0ZVTkMsCi0JZ2xUZXhDb29yZDNzX0ZVTkMsCi0JZ2xUZXhDb29yZDNzdl9GVU5DLAotCWdsVGV4Q29vcmQ0ZF9GVU5DLAotCWdsVGV4Q29vcmQ0ZHZfRlVOQywKLQlnbFRleENvb3JkNGZfRlVOQywKLQlnbFRleENvb3JkNGZ2X0ZVTkMsCi0JZ2xUZXhDb29yZDRpX0ZVTkMsCi0JZ2xUZXhDb29yZDRpdl9GVU5DLAotCWdsVGV4Q29vcmQ0c19GVU5DLAotCWdsVGV4Q29vcmQ0c3ZfRlVOQywKLQlnbFRleENvb3JkUG9pbnRlcl9GVU5DLAotCWdsVGV4RW52Zl9GVU5DLAotCWdsVGV4RW52ZnZfRlVOQywKLQlnbFRleEVudmlfRlVOQywKLQlnbFRleEVudml2X0ZVTkMsCi0JZ2xUZXhHZW5kX0ZVTkMsCi0JZ2xUZXhHZW5kdl9GVU5DLAotCWdsVGV4R2VuZl9GVU5DLAotCWdsVGV4R2VuZnZfRlVOQywKLQlnbFRleEdlbmlfRlVOQywKLQlnbFRleEdlbml2X0ZVTkMsCi0JZ2xUZXhJbWFnZTFEX0ZVTkMsCi0JZ2xUZXhJbWFnZTJEX0ZVTkMsCi0JZ2xUZXhQYXJhbWV0ZXJmX0ZVTkMsCi0JZ2xUZXhQYXJhbWV0ZXJmdl9GVU5DLAotCWdsVGV4UGFyYW1ldGVyaV9GVU5DLAotCWdsVGV4UGFyYW1ldGVyaXZfRlVOQywKLQlnbFRleFN1YkltYWdlMURfRlVOQywKLQlnbFRleFN1YkltYWdlMkRfRlVOQywKLQlnbFRyYW5zbGF0ZWRfRlVOQywKLQlnbFRyYW5zbGF0ZWZfRlVOQywKLQlnbFZlcnRleDJkX0ZVTkMsCi0JZ2xWZXJ0ZXgyZHZfRlVOQywKLQlnbFZlcnRleDJmX0ZVTkMsCi0JZ2xWZXJ0ZXgyZnZfRlVOQywKLQlnbFZlcnRleDJpX0ZVTkMsCi0JZ2xWZXJ0ZXgyaXZfRlVOQywKLQlnbFZlcnRleDJzX0ZVTkMsCi0JZ2xWZXJ0ZXgyc3ZfRlVOQywKLQlnbFZlcnRleDNkX0ZVTkMsCi0JZ2xWZXJ0ZXgzZHZfRlVOQywKLQlnbFZlcnRleDNmX0ZVTkMsCi0JZ2xWZXJ0ZXgzZnZfRlVOQywKLQlnbFZlcnRleDNpX0ZVTkMsCi0JZ2xWZXJ0ZXgzaXZfRlVOQywKLQlnbFZlcnRleDNzX0ZVTkMsCi0JZ2xWZXJ0ZXgzc3ZfRlVOQywKLQlnbFZlcnRleDRkX0ZVTkMsCi0JZ2xWZXJ0ZXg0ZHZfRlVOQywKLQlnbFZlcnRleDRmX0ZVTkMsCi0JZ2xWZXJ0ZXg0ZnZfRlVOQywKLQlnbFZlcnRleDRpX0ZVTkMsCi0JZ2xWZXJ0ZXg0aXZfRlVOQywKLQlnbFZlcnRleDRzX0ZVTkMsCi0JZ2xWZXJ0ZXg0c3ZfRlVOQywKLQlnbFZlcnRleFBvaW50ZXJfRlVOQywKLQlnbFZpZXdwb3J0X0ZVTkMsCi19IEdMX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDkwZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0cnVjdHMuaCIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTk2NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2luY2x1ZGUgImdsLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNzA3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTggKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsdV9zdHJ1Y3RzLmgiCi0jaW5jbHVkZSAiZ2x1X3N0YXRzLmgiCi0KLSNkZWZpbmUgR0xVX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX29wZW5nbF9HTFVfIyNmdW5jCi0KLSNpZm5kZWYgTk9fZ2x1QmVnaW5DdXJ2ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luQ3VydmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVCZWdpbkN1cnZlX0ZVTkMpOwotCWdsdUJlZ2luQ3VydmUoKEdMVW51cmJzICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1QmVnaW5DdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJlZ2luUG9seWdvbgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luUG9seWdvbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUJlZ2luUG9seWdvbl9GVU5DKTsKLQlnbHVCZWdpblBvbHlnb24oKEdMVXRlc3NlbGF0b3IqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJlZ2luUG9seWdvbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJlZ2luU3VyZmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luU3VyZmFjZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUJlZ2luU3VyZmFjZV9GVU5DKTsKLQlnbHVCZWdpblN1cmZhY2UoKEdMVW51cmJzICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1QmVnaW5TdXJmYWNlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1QmVnaW5UcmltCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1QmVnaW5UcmltKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1QmVnaW5UcmltX0ZVTkMpOwotCWdsdUJlZ2luVHJpbSgoR0xVbnVyYnMgKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVCZWdpblRyaW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVCdWlsZDFETWlwbWFwcwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJ1aWxkMURNaXBtYXBzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUpCi17Ci0JamludCByYzsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1QnVpbGQxRE1pcG1hcHNfRlVOQyk7Ci0JcmMgPSAoamludClnbHVCdWlsZDFETWlwbWFwcyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCAoY29uc3Qgdm9pZCAqKWFyZzUpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJ1aWxkMURNaXBtYXBzX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJ1aWxkMkRNaXBtYXBzCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1QnVpbGQyRE1pcG1hcHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamJ5dGVBcnJheSBhcmc2KQotewotCWpieXRlICpscGFyZzY9TlVMTDsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVCdWlsZDJETWlwbWFwc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgTlVMTCk7Ci0JfQotCXJjID0gKGppbnQpZ2x1QnVpbGQyRE1pcG1hcHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJ1aWxkMkRNaXBtYXBzX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUN5bGluZGVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1Q3lsaW5kZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1Q3lsaW5kZXJfRlVOQyk7Ci0JZ2x1Q3lsaW5kZXIoKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVDeWxpbmRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdURlbGV0ZU51cmJzUmVuZGVyZXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVEZWxldGVOdXJic1JlbmRlcmVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RGVsZXRlTnVyYnNSZW5kZXJlcl9GVU5DKTsKLQlnbHVEZWxldGVOdXJic1JlbmRlcmVyKChHTFVudXJicyAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZU51cmJzUmVuZGVyZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEZWxldGVRdWFkcmljCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGVsZXRlUXVhZHJpYykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdURlbGV0ZVF1YWRyaWNfRlVOQyk7Ci0JZ2x1RGVsZXRlUXVhZHJpYygoR0xVcXVhZHJpYyAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZVF1YWRyaWNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEZWxldGVUZXNzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGVsZXRlVGVzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdURlbGV0ZVRlc3NfRlVOQyk7Ci0JZ2x1RGVsZXRlVGVzcygoR0xVdGVzc2VsYXRvciAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZVRlc3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEaXNrCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGlzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RGlza19GVU5DKTsKLQlnbHVEaXNrKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1RGlza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZEN1cnZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RW5kQ3VydmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFbmRDdXJ2ZV9GVU5DKTsKLQlnbHVFbmRDdXJ2ZSgoR0xVbnVyYnNPYmogKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVFbmRDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZFBvbHlnb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVFbmRQb2x5Z29uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RW5kUG9seWdvbl9GVU5DKTsKLQlnbHVFbmRQb2x5Z29uKChHTFV0cmlhbmd1bGF0b3JPYmogKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVFbmRQb2x5Z29uX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1RW5kU3VyZmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUVuZFN1cmZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFbmRTdXJmYWNlX0ZVTkMpOwotCWdsdUVuZFN1cmZhY2UoKEdMVW51cmJzT2JqICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1RW5kU3VyZmFjZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZFRyaW0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVFbmRUcmltKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RW5kVHJpbV9GVU5DKTsKLQlnbHVFbmRUcmltKChHTFVudXJic09iaiAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUVuZFRyaW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVFcnJvclN0cmluZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUVycm9yU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFcnJvclN0cmluZ19GVU5DKTsKLQlyYyA9IChqaW50KWdsdUVycm9yU3RyaW5nKGFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUVycm9yU3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUdldE51cmJzUHJvcGVydHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVHZXROdXJic1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUdldE51cmJzUHJvcGVydHlfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2x1R2V0TnVyYnNQcm9wZXJ0eSgoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUdldE51cmJzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVHZXRTdHJpbmcKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xVX05BVElWRShnbHVHZXRTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUdldFN0cmluZ19GVU5DKTsKLQlyYyA9IChqaW50KWdsdUdldFN0cmluZyhhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVHZXRTdHJpbmdfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1R2V0VGVzc1Byb3BlcnR5Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1R2V0VGVzc1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlQXJyYXkgYXJnMikKLXsKLQlqZG91YmxlICpscGFyZzI9TlVMTDsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1R2V0VGVzc1Byb3BlcnR5X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbHVHZXRUZXNzUHJvcGVydHkoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVHZXRUZXNzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVMb2FkU2FtcGxpbmdNYXRyaWNlcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCWppbnQgKmxwYXJnMz1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVMb2FkU2FtcGxpbmdNYXRyaWNlc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBOVUxMKTsKLQl9Ci0JZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXMoKEdMVW51cmJzICopYXJnMCwgbHBhcmcxLCBscGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TG9va0F0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1TG9va0F0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMywgamRvdWJsZSBhcmc0LCBqZG91YmxlIGFyZzUsIGpkb3VibGUgYXJnNiwgamRvdWJsZSBhcmc3LCBqZG91YmxlIGFyZzgpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUxvb2tBdF9GVU5DKTsKLQlnbHVMb29rQXQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1TG9va0F0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3TnVyYnNSZW5kZXJlcgotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld051cmJzUmVuZGVyZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdOdXJic1JlbmRlcmVyX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3TnVyYnNSZW5kZXJlcigpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld051cmJzUmVuZGVyZXJfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3UXVhZHJpYwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld1F1YWRyaWMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdRdWFkcmljX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3UXVhZHJpYygpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld1F1YWRyaWNfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3VGVzcwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld1Rlc3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdUZXNzX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3VGVzcygpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld1Rlc3NfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV4dENvbnRvdXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOZXh0Q29udG91cikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1TmV4dENvbnRvdXJfRlVOQyk7Ci0JZ2x1TmV4dENvbnRvdXIoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVOZXh0Q29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdU51cmJzQ2FsbGJhY2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic0NhbGxiYWNrKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU51cmJzQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1TnVyYnNDYWxsYmFjaygoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCAoR0x2b2lkKCopKWFyZzIpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU51cmJzQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVOdXJic0N1cnZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1TnVyYnNDdXJ2ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludCBhcmczLCBqZmxvYXRBcnJheSBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCWpmbG9hdCAqbHBhcmc0PU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU51cmJzQ3VydmVfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQl9Ci0JZ2x1TnVyYnNDdXJ2ZSgoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCBscGFyZzIsIGFyZzMsIGxwYXJnNCwgYXJnNSwgYXJnNik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1TnVyYnNDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdU51cmJzUHJvcGVydHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1TnVyYnNQcm9wZXJ0eV9GVU5DKTsKLQlnbHVOdXJic1Byb3BlcnR5KChHTFVudXJicyAqKWFyZzAsIGFyZzEsIGFyZzIpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU51cmJzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVOdXJic1N1cmZhY2UKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic1N1cmZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIsIGppbnQgYXJnMywgamZsb2F0QXJyYXkgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGpmbG9hdEFycmF5IGFyZzcsIGppbnQgYXJnOCwgamludCBhcmc5LCBqaW50IGFyZzEwKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JamZsb2F0ICpscGFyZzQ9TlVMTDsKLQlqZmxvYXQgKmxwYXJnNz1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOdXJic1N1cmZhY2VfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQl9Ci0JZ2x1TnVyYnNTdXJmYWNlKChHTFVudXJic09iaiAqKWFyZzAsIGFyZzEsIGxwYXJnMiwgYXJnMywgbHBhcmc0LCBhcmc1LCBhcmc2LCBscGFyZzcsIGFyZzgsIGFyZzksIGFyZzEwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzcsIGxwYXJnNywgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVOdXJic1N1cmZhY2VfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVPcnRobzJECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1T3J0aG8yRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU9ydGhvMkRfRlVOQyk7Ci0JZ2x1T3J0aG8yRChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVPcnRobzJEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1UGFydGlhbERpc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVQYXJ0aWFsRGlzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamRvdWJsZSBhcmc1LCBqZG91YmxlIGFyZzYpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVBhcnRpYWxEaXNrX0ZVTkMpOwotCWdsdVBhcnRpYWxEaXNrKChHTFVxdWFkcmljICopYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UGFydGlhbERpc2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQZXJzcGVjdGl2ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVBlcnNwZWN0aXZlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UGVyc3BlY3RpdmVfRlVOQyk7Ci0JZ2x1UGVyc3BlY3RpdmUoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UGVyc3BlY3RpdmVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQaWNrTWF0cml4Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UGlja01hdHJpeCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVQaWNrTWF0cml4X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCX0KLQlnbHVQaWNrTWF0cml4KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGxwYXJnNCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVBpY2tNYXRyaXhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQcm9qZWN0Ci1KTklFWFBPUlQgamludCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UHJvamVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlQXJyYXkgYXJnMywgamRvdWJsZUFycmF5IGFyZzQsIGppbnRBcnJheSBhcmc1LCBqZG91YmxlQXJyYXkgYXJnNiwgamRvdWJsZUFycmF5IGFyZzcsIGpkb3VibGVBcnJheSBhcmc4KQotewotCWpkb3VibGUgKmxwYXJnMz1OVUxMOwotCWpkb3VibGUgKmxwYXJnND1OVUxMOwotCWppbnQgKmxwYXJnNT1OVUxMOwotCWpkb3VibGUgKmxwYXJnNj1OVUxMOwotCWpkb3VibGUgKmxwYXJnNz1OVUxMOwotCWpkb3VibGUgKmxwYXJnOD1OVUxMOwotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVByb2plY3RfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc1LCBOVUxMKTsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgTlVMTCk7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc1LCBOVUxMKTsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgTlVMTCk7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBOVUxMKTsKLQl9Ci0JcmMgPSAoamludClnbHVQcm9qZWN0KGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMywgbHBhcmc0LCBscGFyZzUsIGxwYXJnNiwgbHBhcmc3LCBscGFyZzgpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVByb2plY3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1UHdsQ3VydmUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVQd2xDdXJ2ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UHdsQ3VydmVfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2x1UHdsQ3VydmUoKEdMVW51cmJzICopYXJnMCwgYXJnMSwgbHBhcmcyLCBhcmczLCBhcmc0KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVQd2xDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVF1YWRyaWNDYWxsYmFjawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVF1YWRyaWNDYWxsYmFjaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVRdWFkcmljQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1UXVhZHJpY0NhbGxiYWNrKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSwgKEdMdm9pZCgqKSlhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljRHJhd1N0eWxlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UXVhZHJpY0RyYXdTdHlsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DKTsKLQlnbHVRdWFkcmljRHJhd1N0eWxlKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVF1YWRyaWNOb3JtYWxzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UXVhZHJpY05vcm1hbHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVF1YWRyaWNOb3JtYWxzX0ZVTkMpOwotCWdsdVF1YWRyaWNOb3JtYWxzKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UXVhZHJpY05vcm1hbHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljT3JpZW50YXRpb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVRdWFkcmljT3JpZW50YXRpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVF1YWRyaWNPcmllbnRhdGlvbl9GVU5DKTsKLQlnbHVRdWFkcmljT3JpZW50YXRpb24oKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljT3JpZW50YXRpb25fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljVGV4dHVyZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVF1YWRyaWNUZXh0dXJlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamJvb2xlYW4gYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UXVhZHJpY1RleHR1cmVfRlVOQyk7Ci0JZ2x1UXVhZHJpY1RleHR1cmUoKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljVGV4dHVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVNjYWxlSW1hZ2UKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xVX05BVElWRShnbHVTY2FsZUltYWdlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgpCi17Ci0JamludCByYzsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1U2NhbGVJbWFnZV9GVU5DKTsKLQlyYyA9IChqaW50KWdsdVNjYWxlSW1hZ2UoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKGNvbnN0IHZvaWQgKilhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCAodm9pZCAqKWFyZzgpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVNjYWxlSW1hZ2VfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1U3BoZXJlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1U3BoZXJlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamRvdWJsZSBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1U3BoZXJlX0ZVTkMpOwotCWdsdVNwaGVyZSgoR0xVcXVhZHJpYyAqKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVNwaGVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NCZWdpbkNvbnRvdXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVUZXNzQmVnaW5Db250b3VyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DKTsKLQlnbHVUZXNzQmVnaW5Db250b3VyKChHTFV0ZXNzZWxhdG9yICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NCZWdpblBvbHlnb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVUZXNzQmVnaW5Qb2x5Z29uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzQmVnaW5Qb2x5Z29uX0ZVTkMpOwotCWdsdVRlc3NCZWdpblBvbHlnb24oKEdMVXRlc3NlbGF0b3IgKilhcmcwLCAoR0x2b2lkICopYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luUG9seWdvbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NDYWxsYmFjawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NDYWxsYmFjaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1VGVzc0NhbGxiYWNrKChHTFV0ZXNzZWxhdG9yICopYXJnMCwgYXJnMSwgKEdMdm9pZCgqKSlhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVUZXNzRW5kQ29udG91cgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NFbmRDb250b3VyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1VGVzc0VuZENvbnRvdXJfRlVOQyk7Ci0JZ2x1VGVzc0VuZENvbnRvdXIoKEdMVXRlc3NlbGF0b3IgKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzRW5kQ29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NFbmRQb2x5Z29uCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc0VuZFBvbHlnb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzRW5kUG9seWdvbl9GVU5DKTsKLQlnbHVUZXNzRW5kUG9seWdvbigoR0xVdGVzc2VsYXRvciAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVRlc3NFbmRQb2x5Z29uX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1VGVzc05vcm1hbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NOb3JtYWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzTm9ybWFsX0ZVTkMpOwotCWdsdVRlc3NOb3JtYWwoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzTm9ybWFsX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1VGVzc1Byb3BlcnR5Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVRlc3NQcm9wZXJ0eV9GVU5DKTsKLQlnbHVUZXNzUHJvcGVydHkoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVUZXNzVmVydGV4Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc1ZlcnRleCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGVBcnJheSBhcmcxLCBqaW50IGFyZzIpCi17Ci0JamRvdWJsZSAqbHBhcmcxPU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVRlc3NWZXJ0ZXhfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsdVRlc3NWZXJ0ZXgoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBscGFyZzEsIChHTHZvaWQgKilhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc1ZlcnRleF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVVuUHJvamVjdAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVVuUHJvamVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlQXJyYXkgYXJnMywgamRvdWJsZUFycmF5IGFyZzQsIGppbnRBcnJheSBhcmc1LCBqZG91YmxlQXJyYXkgYXJnNiwgamRvdWJsZUFycmF5IGFyZzcsIGpkb3VibGVBcnJheSBhcmc4KQotewotCWpkb3VibGUgKmxwYXJnMz1OVUxMOwotCWpkb3VibGUgKmxwYXJnND1OVUxMOwotCWppbnQgKmxwYXJnNT1OVUxMOwotCWpkb3VibGUgKmxwYXJnNj1OVUxMOwotCWpkb3VibGUgKmxwYXJnNz1OVUxMOwotCWpkb3VibGUgKmxwYXJnOD1OVUxMOwotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVVuUHJvamVjdF9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBOVUxMKTsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIE5VTEwpOwotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNiwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBOVUxMKTsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzUsIE5VTEwpOwotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIE5VTEwpOwotCX0KLQlyYyA9IChqaW50KWdsdVVuUHJvamVjdChhcmcwLCBhcmcxLCBhcmcyLCBscGFyZzMsIGxwYXJnNCwgbHBhcmc1LCBscGFyZzYsIGxwYXJnNywgbHBhcmc4KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JCWlmIChhcmc3KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JCWlmIChhcmc3KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVVblByb2plY3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmOGIwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZkZWYgX19BUFBMRV9fCi0jaW5jbHVkZSA8T3BlbkdML2dsdS5oPgotI2Vsc2UKLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPEdML2dsdS5oPgotI2VuZGlmCi0KLWV4dGVybiBpbnQgSVNfSk5JXzFfMjsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlZmMyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0YXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x1X3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMVV9uYXRpdmVGdW5jdGlvbkNvdW50ID0gNTE7Ci1pbnQgR0xVX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WzUxXTsKLWNoYXIgKiBHTFVfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0gewotCSJnbHVCZWdpbkN1cnZlIiwgCi0JImdsdUJlZ2luUG9seWdvbiIsIAotCSJnbHVCZWdpblN1cmZhY2UiLCAKLQkiZ2x1QmVnaW5UcmltIiwgCi0JImdsdUJ1aWxkMURNaXBtYXBzIiwgCi0JImdsdUJ1aWxkMkRNaXBtYXBzIiwgCi0JImdsdUN5bGluZGVyIiwgCi0JImdsdURlbGV0ZU51cmJzUmVuZGVyZXIiLCAKLQkiZ2x1RGVsZXRlUXVhZHJpYyIsIAotCSJnbHVEZWxldGVUZXNzIiwgCi0JImdsdURpc2siLCAKLQkiZ2x1RW5kQ3VydmUiLCAKLQkiZ2x1RW5kUG9seWdvbiIsIAotCSJnbHVFbmRTdXJmYWNlIiwgCi0JImdsdUVuZFRyaW0iLCAKLQkiZ2x1RXJyb3JTdHJpbmciLCAKLQkiZ2x1R2V0TnVyYnNQcm9wZXJ0eSIsIAotCSJnbHVHZXRTdHJpbmciLCAKLQkiZ2x1R2V0VGVzc1Byb3BlcnR5IiwgCi0JImdsdUxvYWRTYW1wbGluZ01hdHJpY2VzIiwgCi0JImdsdUxvb2tBdCIsIAotCSJnbHVOZXdOdXJic1JlbmRlcmVyIiwgCi0JImdsdU5ld1F1YWRyaWMiLCAKLQkiZ2x1TmV3VGVzcyIsIAotCSJnbHVOZXh0Q29udG91ciIsIAotCSJnbHVOdXJic0NhbGxiYWNrIiwgCi0JImdsdU51cmJzQ3VydmUiLCAKLQkiZ2x1TnVyYnNQcm9wZXJ0eSIsIAotCSJnbHVOdXJic1N1cmZhY2UiLCAKLQkiZ2x1T3J0aG8yRCIsIAotCSJnbHVQYXJ0aWFsRGlzayIsIAotCSJnbHVQZXJzcGVjdGl2ZSIsIAotCSJnbHVQaWNrTWF0cml4IiwgCi0JImdsdVByb2plY3QiLCAKLQkiZ2x1UHdsQ3VydmUiLCAKLQkiZ2x1UXVhZHJpY0NhbGxiYWNrIiwgCi0JImdsdVF1YWRyaWNEcmF3U3R5bGUiLCAKLQkiZ2x1UXVhZHJpY05vcm1hbHMiLCAKLQkiZ2x1UXVhZHJpY09yaWVudGF0aW9uIiwgCi0JImdsdVF1YWRyaWNUZXh0dXJlIiwgCi0JImdsdVNjYWxlSW1hZ2UiLCAKLQkiZ2x1U3BoZXJlIiwgCi0JImdsdVRlc3NCZWdpbkNvbnRvdXIiLCAKLQkiZ2x1VGVzc0JlZ2luUG9seWdvbiIsIAotCSJnbHVUZXNzQ2FsbGJhY2siLCAKLQkiZ2x1VGVzc0VuZENvbnRvdXIiLCAKLQkiZ2x1VGVzc0VuZFBvbHlnb24iLCAKLQkiZ2x1VGVzc05vcm1hbCIsIAotCSJnbHVUZXNzUHJvcGVydHkiLCAKLQkiZ2x1VGVzc1ZlcnRleCIsIAotCSJnbHVVblByb2plY3QiLCAKLX07Ci0KLSNkZWZpbmUgU1RBVFNfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X3Rvb2xzX2ludGVybmFsX05hdGl2ZVN0YXRzXyMjZnVuYwotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTFVfMUdldEZ1bmN0aW9uQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlyZXR1cm4gR0xVX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Ci19Ci0KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgU1RBVFNfTkFUSVZFKEdMVV8xR2V0RnVuY3Rpb25OYW1lKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgR0xVX25hdGl2ZUZ1bmN0aW9uTmFtZXNbaW5kZXhdKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoR0xVXzFHZXRGdW5jdGlvbkNhbGxDb3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KQotewotCXJldHVybiBHTFVfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNzNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0YXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jaWZkZWYgTkFUSVZFX1NUQVRTCi1leHRlcm4gaW50IEdMVV9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBHTFVfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbXTsKLWV4dGVybiBjaGFyKiBHTFVfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOwotI2RlZmluZSBHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgR0xVX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Ci0jZGVmaW5lIEdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2Vsc2UKLSNkZWZpbmUgR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotCWdsdUJlZ2luQ3VydmVfRlVOQywKLQlnbHVCZWdpblBvbHlnb25fRlVOQywKLQlnbHVCZWdpblN1cmZhY2VfRlVOQywKLQlnbHVCZWdpblRyaW1fRlVOQywKLQlnbHVCdWlsZDFETWlwbWFwc19GVU5DLAotCWdsdUJ1aWxkMkRNaXBtYXBzX0ZVTkMsCi0JZ2x1Q3lsaW5kZXJfRlVOQywKLQlnbHVEZWxldGVOdXJic1JlbmRlcmVyX0ZVTkMsCi0JZ2x1RGVsZXRlUXVhZHJpY19GVU5DLAotCWdsdURlbGV0ZVRlc3NfRlVOQywKLQlnbHVEaXNrX0ZVTkMsCi0JZ2x1RW5kQ3VydmVfRlVOQywKLQlnbHVFbmRQb2x5Z29uX0ZVTkMsCi0JZ2x1RW5kU3VyZmFjZV9GVU5DLAotCWdsdUVuZFRyaW1fRlVOQywKLQlnbHVFcnJvclN0cmluZ19GVU5DLAotCWdsdUdldE51cmJzUHJvcGVydHlfRlVOQywKLQlnbHVHZXRTdHJpbmdfRlVOQywKLQlnbHVHZXRUZXNzUHJvcGVydHlfRlVOQywKLQlnbHVMb2FkU2FtcGxpbmdNYXRyaWNlc19GVU5DLAotCWdsdUxvb2tBdF9GVU5DLAotCWdsdU5ld051cmJzUmVuZGVyZXJfRlVOQywKLQlnbHVOZXdRdWFkcmljX0ZVTkMsCi0JZ2x1TmV3VGVzc19GVU5DLAotCWdsdU5leHRDb250b3VyX0ZVTkMsCi0JZ2x1TnVyYnNDYWxsYmFja19GVU5DLAotCWdsdU51cmJzQ3VydmVfRlVOQywKLQlnbHVOdXJic1Byb3BlcnR5X0ZVTkMsCi0JZ2x1TnVyYnNTdXJmYWNlX0ZVTkMsCi0JZ2x1T3J0aG8yRF9GVU5DLAotCWdsdVBhcnRpYWxEaXNrX0ZVTkMsCi0JZ2x1UGVyc3BlY3RpdmVfRlVOQywKLQlnbHVQaWNrTWF0cml4X0ZVTkMsCi0JZ2x1UHJvamVjdF9GVU5DLAotCWdsdVB3bEN1cnZlX0ZVTkMsCi0JZ2x1UXVhZHJpY0NhbGxiYWNrX0ZVTkMsCi0JZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DLAotCWdsdVF1YWRyaWNOb3JtYWxzX0ZVTkMsCi0JZ2x1UXVhZHJpY09yaWVudGF0aW9uX0ZVTkMsCi0JZ2x1UXVhZHJpY1RleHR1cmVfRlVOQywKLQlnbHVTY2FsZUltYWdlX0ZVTkMsCi0JZ2x1U3BoZXJlX0ZVTkMsCi0JZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DLAotCWdsdVRlc3NCZWdpblBvbHlnb25fRlVOQywKLQlnbHVUZXNzQ2FsbGJhY2tfRlVOQywKLQlnbHVUZXNzRW5kQ29udG91cl9GVU5DLAotCWdsdVRlc3NFbmRQb2x5Z29uX0ZVTkMsCi0JZ2x1VGVzc05vcm1hbF9GVU5DLAotCWdsdVRlc3NQcm9wZXJ0eV9GVU5DLAotCWdsdVRlc3NWZXJ0ZXhfRlVOQywKLQlnbHVVblByb2plY3RfRlVOQywKLX0gR0xVX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0cnVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwY2U0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsdV9zdHJ1Y3RzLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RydWN0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTFhY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNpbmNsdWRlICJnbHUuaCIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQwYzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9zd3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAic3d0LmgiCi0KLWludCBJU19KTklfMV8yID0gMDsKLQotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKnJlc2VydmVkKSB7Ci0JSVNfSk5JXzFfMiA9IDE7Ci0JcmV0dXJuIEpOSV9WRVJTSU9OXzFfMjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzI5MDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9zd3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSU5DX3N3dF9ICi0jZGVmaW5lIElOQ19zd3RfSAotCi0jaW5jbHVkZSAiam5pLmgiCi0KLS8qIEZvciBkZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgREVCVUdfUFJJTlRGKHgpCi0vKiNkZWZpbmUgREVCVUdfUFJJTlRGKHgpIHByaW50ZiB4OyAqLwotCi0vKiBkZWZpbmUgdGhpcyB0byBwcmludCBvdXQgZGVidWcgc3RhdGVtZW50cyAqLwotLyogI2RlZmluZSBERUJVR19DQUxMX1BSSU5UUyAqLwotLyogI2RlZmluZSBERUJVR19DSEVDS19OVUxMX0VYQ0VQVElPTlMgKi8KLQotI2lmZGVmIERFQlVHX0NBTExfUFJJTlRTCi0jZGVmaW5lIERFQlVHX0NBTEwoZnVuYykgZnByaW50ZihzdGRlcnIsIGZ1bmMpOwotI2Vsc2UKLSNkZWZpbmUgREVCVUdfQ0FMTChmdW5jKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19DSEVDS19OVUxMX0VYQ0VQVElPTlMKLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTlVMTChlbnYsIGFkZHJlc3MpIFwKLQlpZiAoYWRkcmVzcyA9PSAwKSB7IFwKLQkJamNsYXNzIGNsYXp6ID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAib3JnL2VjbGlwc2Uvc3d0L1NXVEVycm9yIik7IFwKLQkJaWYgKGNsYXp6ICE9IE5VTEwpIHsgXAotCQkJKCplbnYpLT5UaHJvd05ldyhlbnYsIGNsYXp6LCAiQXJndW1lbnQgY2Fubm90IGJlIE5VTEwiKTsgXAotCQl9IFwKLQkJcmV0dXJuOyBcCi0JfQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTlVMTChlbnYsIGFkZHJlc3MpCi0jZW5kaWYKLQotI2RlZmluZSBERUNMX0dMT0IocFN5bSkKLSNkZWZpbmUgUEdMT0IoeCkgeAotCi0jZGVmaW5lIE5BVElWRV9FTlRFUihlbnYsY2xhenosZnVuYykKLSNkZWZpbmUgTkFUSVZFX0VYSVQoZW52LGNsYXp6LGZ1bmMpCi0KLSNlbmRpZiAvKiBpZm5kZWYgSU5DX3N3dF9IICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9vcGVuZ2wvR0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDFhNGZjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmdsOwotCi1wdWJsaWMgY2xhc3MgR0wgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSU0lPTl8xXzEgPSAxOwotCi0JLyogQWNjdW1PcCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDQ1VNID0gMHgwMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPQUQgPSAweDAxMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVUVVJOID0gMHgwMTAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01VTFQgPSAweDAxMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUREID0gMHgwMTA0OwotCi0JLyogQWxwaGFGdW5jdGlvbiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FVkVSID0gMHgwMjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFU1MgPSAweDAyMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVFVQUwgPSAweDAyMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTEVRVUFMID0gMHgwMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUFURVIgPSAweDAyMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9URVFVQUwgPSAweDAyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR0VRVUFMID0gMHgwMjA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMV0FZUyA9IDB4MDIwNzsKLQotCS8qIEF0dHJpYk1hc2sgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX0JJVCA9IDB4MDAwMDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfQklUID0gMHgwMDAwMDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX0JJVCA9IDB4MDAwMDAwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9CSVQgPSAweDAwMDAwMDA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU1RJUFBMRV9CSVQgPSAweDAwMDAwMDEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01PREVfQklUID0gMHgwMDAwMDAyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVElOR19CSVQgPSAweDAwMDAwMDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19CSVQgPSAweDAwMDAwMDgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgPSAweDAwMDAwMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDQ1VNX0JVRkZFUl9CSVQgPSAweDAwMDAwMjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQlVGRkVSX0JJVCA9IDB4MDAwMDA0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlRfQklUID0gMHgwMDAwMDgwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUkFOU0ZPUk1fQklUID0gMHgwMDAwMTAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FTkFCTEVfQklUID0gMHgwMDAwMjAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9CVUZGRVJfQklUID0gMHgwMDAwNDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ISU5UX0JJVCA9IDB4MDAwMDgwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVZBTF9CSVQgPSAweDAwMDEwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJU1RfQklUID0gMHgwMDAyMDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJVCA9IDB4MDAwNDAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9CSVQgPSAweDAwMDgwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMTF9BVFRSSUJfQklUUyA9IDB4MDAwZmZmZmY7Ci0KLQkvKiBCZWdpbk1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVFMgPSAweDAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORVMgPSAweDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9MT09QID0gMHgwMDAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RSSVAgPSAweDAwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJJQU5HTEVTID0gMHgwMDA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX1NUUklQID0gMHgwMDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX0ZBTiA9IDB4MDAwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9RVUFEUyA9IDB4MDAwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9RVUFEX1NUUklQID0gMHgwMDA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT04gPSAweDAwMDk7Ci0KLQkvKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aRVJPID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19DT0xPUiA9IDB4MDMwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SID0gMHgwMzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQSA9IDB4MDMwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBID0gMHgwMzAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9BTFBIQSA9IDB4MDMwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBID0gMHgwMzA1OwotCi0JLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KLQkvKiAgICAgIEdMX1pFUk8gKi8KLQkvKiAgICAgIEdMX09ORSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9DT0xPUiA9IDB4MDMwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SID0gMHgwMzA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSA9IDB4MDMwODsKLQkvKiAgICAgIEdMX1NSQ19BTFBIQSAqLwotCS8qICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAqLwotCS8qICAgICAgR0xfRFNUX0FMUEhBICovCi0JLyogICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCi0KLQkvKiBCb29sZWFuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJVRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFMU0UgPSAwOwotCi0JLyogQ2xlYXJCdWZmZXJNYXNrICovCi0JLyogICAgICBHTF9DT0xPUl9CVUZGRVJfQklUICovCi0JLyogICAgICBHTF9BQ0NVTV9CVUZGRVJfQklUICovCi0JLyogICAgICBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgKi8KLQkvKiAgICAgIEdMX0RFUFRIX0JVRkZFUl9CSVQgKi8KLQotCS8qIENsaWVudEFycmF5VHlwZSAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0NPTE9SX0FSUkFZICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLwotCS8qICAgICAgR0xfRURHRV9GTEFHX0FSUkFZICovCi0KLQkvKiBDbGlwUGxhbmVOYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTAgPSAweDMwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTEgPSAweDMwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTIgPSAweDMwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTMgPSAweDMwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTQgPSAweDMwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTUgPSAweDMwMDU7Ci0KLQkvKiBDb2xvck1hdGVyaWFsRmFjZSAqLwotCS8qICAgICAgR0xfRlJPTlQgKi8KLQkvKiAgICAgIEdMX0JBQ0sgKi8KLQkvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLQkvKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCi0JLyogICAgICBHTF9BTUJJRU5UICovCi0JLyogICAgICBHTF9ESUZGVVNFICovCi0JLyogICAgICBHTF9TUEVDVUxBUiAqLwotCS8qICAgICAgR0xfRU1JU1NJT04gKi8KLQkvKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KLQotCS8qIENvbG9yUG9pbnRlclR5cGUgKi8KLQkvKiAgICAgIEdMX0JZVEUgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KLQkvKiAgICAgIEdMX1NIT1JUICovCi0JLyogICAgICBHTF9VTlNJR05FRF9TSE9SVCAqLwotCS8qICAgICAgR0xfSU5UICovCi0JLyogICAgICBHTF9VTlNJR05FRF9JTlQgKi8KLQkvKiAgICAgIEdMX0ZMT0FUICovCi0JLyogICAgICBHTF9ET1VCTEUgKi8KLQotCS8qIEN1bGxGYWNlTW9kZSAqLwotCS8qICAgICAgR0xfRlJPTlQgKi8KLQkvKiAgICAgIEdMX0JBQ0sgKi8KLQkvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLQkvKiBEYXRhVHlwZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JZVEUgPSAweDE0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfQllURSA9IDB4MTQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TSE9SVCA9IDB4MTQwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVCA9IDB4MTQwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlQgPSAweDE0MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfSU5UID0gMHgxNDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMT0FUID0gMHgxNDA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMXzJfQllURVMgPSAweDE0MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfM19CWVRFUyA9IDB4MTQwODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF80X0JZVEVTID0gMHgxNDA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RPVUJMRSA9IDB4MTQwQTsKLQotCS8qIERlcHRoRnVuY3Rpb24gKi8KLQkvKiAgICAgIEdMX05FVkVSICovCi0JLyogICAgICBHTF9MRVNTICovCi0JLyogICAgICBHTF9FUVVBTCAqLwotCS8qICAgICAgR0xfTEVRVUFMICovCi0JLyogICAgICBHTF9HUkVBVEVSICovCi0JLyogICAgICBHTF9OT1RFUVVBTCAqLwotCS8qICAgICAgR0xfR0VRVUFMICovCi0JLyogICAgICBHTF9BTFdBWVMgKi8KLQotCS8qIERyYXdCdWZmZXJNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfTEVGVCA9IDB4MDQwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVF9SSUdIVCA9IDB4MDQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLX0xFRlQgPSAweDA0MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkFDS19SSUdIVCA9IDB4MDQwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVCA9IDB4MDQwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLID0gMHgwNDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFRlQgPSAweDA0MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUklHSFQgPSAweDA0MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgPSAweDA0MDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYMCA9IDB4MDQwOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BVVgxID0gMHgwNDBBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FVWDIgPSAweDA0MEI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYMyA9IDB4MDQwQzsKLQotCS8qIEVuYWJsZSAqLwotCS8qICAgICAgR0xfRk9HICovCi0JLyogICAgICBHTF9MSUdIVElORyAqLwotCS8qICAgICAgR0xfVEVYVFVSRV8xRCAqLwotCS8qICAgICAgR0xfVEVYVFVSRV8yRCAqLwotCS8qICAgICAgR0xfTElORV9TVElQUExFICovCi0JLyogICAgICBHTF9QT0xZR09OX1NUSVBQTEUgKi8KLQkvKiAgICAgIEdMX0NVTExfRkFDRSAqLwotCS8qICAgICAgR0xfQUxQSEFfVEVTVCAqLwotCS8qICAgICAgR0xfQkxFTkQgKi8KLQkvKiAgICAgIEdMX0lOREVYX0xPR0lDX09QICovCi0JLyogICAgICBHTF9DT0xPUl9MT0dJQ19PUCAqLwotCS8qICAgICAgR0xfRElUSEVSICovCi0JLyogICAgICBHTF9TVEVOQ0lMX1RFU1QgKi8KLQkvKiAgICAgIEdMX0RFUFRIX1RFU1QgKi8KLQkvKiAgICAgIEdMX0NMSVBfUExBTkUwICovCi0JLyogICAgICBHTF9DTElQX1BMQU5FMSAqLwotCS8qICAgICAgR0xfQ0xJUF9QTEFORTIgKi8KLQkvKiAgICAgIEdMX0NMSVBfUExBTkUzICovCi0JLyogICAgICBHTF9DTElQX1BMQU5FNCAqLwotCS8qICAgICAgR0xfQ0xJUF9QTEFORTUgKi8KLQkvKiAgICAgIEdMX0xJR0hUMCAqLwotCS8qICAgICAgR0xfTElHSFQxICovCi0JLyogICAgICBHTF9MSUdIVDIgKi8KLQkvKiAgICAgIEdMX0xJR0hUMyAqLwotCS8qICAgICAgR0xfTElHSFQ0ICovCi0JLyogICAgICBHTF9MSUdIVDUgKi8KLQkvKiAgICAgIEdMX0xJR0hUNiAqLwotCS8qICAgICAgR0xfTElHSFQ3ICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9TICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9UICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9SICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9RICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF8zICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF80ICovCi0JLyogICAgICBHTF9NQVAxX0NPTE9SXzQgKi8KLQkvKiAgICAgIEdMX01BUDFfSU5ERVggKi8KLQkvKiAgICAgIEdMX01BUDFfTk9STUFMICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMSAqLwotCS8qICAgICAgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzIgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF8zICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfNCAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfMyAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfNCAqLwotCS8qICAgICAgR0xfTUFQMl9DT0xPUl80ICovCi0JLyogICAgICBHTF9NQVAyX0lOREVYICovCi0JLyogICAgICBHTF9NQVAyX05PUk1BTCAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzEgKi8KLQkvKiAgICAgIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMyAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzQgKi8KLQkvKiAgICAgIEdMX1BPSU5UX1NNT09USCAqLwotCS8qICAgICAgR0xfTElORV9TTU9PVEggKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fU01PT1RIICovCi0JLyogICAgICBHTF9TQ0lTU09SX1RFU1QgKi8KLQkvKiAgICAgIEdMX0NPTE9SX01BVEVSSUFMICovCi0JLyogICAgICBHTF9OT1JNQUxJWkUgKi8KLQkvKiAgICAgIEdMX0FVVE9fTk9STUFMICovCi0JLyogICAgICBHTF9WRVJURVhfQVJSQVkgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWSAqLwotCS8qICAgICAgR0xfQ09MT1JfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICovCi0JLyogICAgICBHTF9FREdFX0ZMQUdfQVJSQVkgKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9MSU5FICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9GSUxMICovCi0KLQkvKiBFcnJvckNvZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT19FUlJPUiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9FTlVNID0gMHgwNTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfVkFMVUUgPSAweDA1MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gPSAweDA1MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBQ0tfT1ZFUkZMT1cgPSAweDA1MDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBQ0tfVU5ERVJGTE9XID0gMHgwNTA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09VVF9PRl9NRU1PUlkgPSAweDA1MDU7Ci0KLQkvKiBGZWVkQmFja01vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8yRCA9IDB4MDYwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRCA9IDB4MDYwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRF9DT0xPUiA9IDB4MDYwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRF9DT0xPUl9URVhUVVJFID0gMHgwNjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMXzREX0NPTE9SX1RFWFRVUkUgPSAweDA2MDQ7Ci0KLQkvKiBGZWVkQmFja1Rva2VuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFTU19USFJPVUdIX1RPS0VOID0gMHgwNzAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1RPS0VOID0gMHgwNzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfVE9LRU4gPSAweDA3MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9UT0tFTiA9IDB4MDcwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CSVRNQVBfVE9LRU4gPSAweDA3MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFJBV19QSVhFTF9UT0tFTiA9IDB4MDcwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT1BZX1BJWEVMX1RPS0VOID0gMHgwNzA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfUkVTRVRfVE9LRU4gPSAweDA3MDc7Ci0KLQkvKiBGb2dNb2RlICovCi0JLyogICAgICBHTF9MSU5FQVIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFAgPSAweDA4MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhQMiA9IDB4MDgwMTsKLQotCS8qIEZvZ1BhcmFtZXRlciAqLwotCS8qICAgICAgR0xfRk9HX0NPTE9SICovCi0JLyogICAgICBHTF9GT0dfREVOU0lUWSAqLwotCS8qICAgICAgR0xfRk9HX0VORCAqLwotCS8qICAgICAgR0xfRk9HX0lOREVYICovCi0JLyogICAgICBHTF9GT0dfTU9ERSAqLwotCS8qICAgICAgR0xfRk9HX1NUQVJUICovCi0KLQkvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVyA9IDB4MDkwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DQ1cgPSAweDA5MDE7Ci0KLQkvKiBHZXRNYXBUYXJnZXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0VGRiA9IDB4MEEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUkRFUiA9IDB4MEEwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET01BSU4gPSAweDBBMDI7Ci0KLQkvKiBHZXRQaXhlbE1hcCAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fSSAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX1NfVE9fUyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fUiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fRyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fQiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fQSAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX1JfVE9fUiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0dfVE9fRyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0JfVE9fQiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0FfVE9fQSAqLwotCi0JLyogR2V0UG9pbnRlclRhcmdldCAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgKi8KLQkvKiAgICAgIEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSICovCi0KLQkvKiBHZXRUYXJnZXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX0NPTE9SID0gMHgwQjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVUlJFTlRfSU5ERVggPSAweDBCMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9OT1JNQUwgPSAweDBCMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyA9IDB4MEIwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9DT0xPUiA9IDB4MEIwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9JTkRFWCA9IDB4MEIwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9URVhUVVJFX0NPT1JEUyA9IDB4MEIwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTiA9IDB4MEIwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTl9WQUxJRCA9IDB4MEIwODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9ESVNUQU5DRSA9IDB4MEIwOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TTU9PVEggPSAweDBCMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRSA9IDB4MEIxMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX1JBTkdFID0gMHgwQjEyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkVfR1JBTlVMQVJJVFkgPSAweDBCMTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEggPSAweDBCMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9XSURUSCA9IDB4MEIyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX1dJRFRIX1JBTkdFID0gMHgwQjIyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfV0lEVEhfR1JBTlVMQVJJVFkgPSAweDBCMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TVElQUExFID0gMHgwQjI0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RJUFBMRV9QQVRURVJOID0gMHgwQjI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RJUFBMRV9SRVBFQVQgPSAweDBCMjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElTVF9NT0RFID0gMHgwQjMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9MSVNUX05FU1RJTkcgPSAweDBCMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElTVF9CQVNFID0gMHgwQjMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJU1RfSU5ERVggPSAweDBCMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9NT0RFID0gMHgwQjQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU01PT1RIID0gMHgwQjQxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU1RJUFBMRSA9IDB4MEI0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUcgPSAweDBCNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VMTF9GQUNFID0gMHgwQjQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVTExfRkFDRV9NT0RFID0gMHgwQjQ1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZST05UX0ZBQ0UgPSAweDBCNDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRJTkcgPSAweDBCNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSID0gMHgwQjUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX1RXT19TSURFID0gMHgwQjUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX0FNQklFTlQgPSAweDBCNTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hBREVfTU9ERUwgPSAweDBCNTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTUFURVJJQUxfRkFDRSA9IDB4MEI1NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9NQVRFUklBTF9QQVJBTUVURVIgPSAweDBCNTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTUFURVJJQUwgPSAweDBCNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HID0gMHgwQjYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19JTkRFWCA9IDB4MEI2MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfREVOU0lUWSA9IDB4MEI2MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfU1RBUlQgPSAweDBCNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX0VORCA9IDB4MEI2NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfTU9ERSA9IDB4MEI2NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfQ09MT1IgPSAweDBCNjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfUkFOR0UgPSAweDBCNzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfVEVTVCA9IDB4MEI3MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9XUklURU1BU0sgPSAweDBCNzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQ0xFQVJfVkFMVUUgPSAweDBCNzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfRlVOQyA9IDB4MEI3NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BQ0NVTV9DTEVBUl9WQUxVRSA9IDB4MEI4MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1RFU1QgPSAweDBCOTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSA9IDB4MEI5MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0ZVTkMgPSAweDBCOTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9WQUxVRV9NQVNLID0gMHgwQjkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfRkFJTCA9IDB4MEI5NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCA9IDB4MEI5NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyA9IDB4MEI5NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1JFRiA9IDB4MEI5NzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyA9IDB4MEI5ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfTU9ERSA9IDB4MEJBMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxJWkUgPSAweDBCQTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlQgPSAweDBCQTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIID0gMHgwQkEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggPSAweDBCQTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9TVEFDS19ERVBUSCA9IDB4MEJBNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NT0RFTFZJRVdfTUFUUklYID0gMHgwQkE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYID0gMHgwQkE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUFUUklYID0gMHgwQkE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FUVFJJQl9TVEFDS19ERVBUSCA9IDB4MEJCMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElFTlRfQVRUUklCX1NUQUNLX0RFUFRIID0gMHgwQkIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1QgPSAweDBCQzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfVEVTVF9GVU5DID0gMHgwQkMxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1RfUkVGID0gMHgwQkMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RJVEhFUiA9IDB4MEJEMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1QgPSAweDBCRTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfU1JDID0gMHgwQkUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EID0gMHgwQkUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPR0lDX09QX01PREUgPSAweDBCRjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfTE9HSUNfT1AgPSAweDBCRjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTE9HSUNfT1AgPSAweDBCRjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYX0JVRkZFUlMgPSAweDBDMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFJBV19CVUZGRVIgPSAweDBDMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVBRF9CVUZGRVIgPSAweDBDMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9CT1ggPSAweDBDMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9URVNUID0gMHgwQzExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0NMRUFSX1ZBTFVFID0gMHgwQzIwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX1dSSVRFTUFTSyA9IDB4MEMyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRSA9IDB4MEMyMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9XUklURU1BU0sgPSAweDBDMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfTU9ERSA9IDB4MEMzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0JBX01PREUgPSAweDBDMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9VQkxFQlVGRkVSID0gMHgwQzMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURVJFTyA9IDB4MEMzMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJfTU9ERSA9IDB4MEM0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgPSAweDBDNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU01PT1RIX0hJTlQgPSAweDBDNTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEhfSElOVCA9IDB4MEM1MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX1NNT09USF9ISU5UID0gMHgwQzUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19ISU5UID0gMHgwQzU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1MgPSAweDBDNjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9HRU5fVCA9IDB4MEM2MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0dFTl9SID0gMHgwQzYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1EgPSAweDBDNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fSSA9IDB4MEM3MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfU19UT19TID0gMHgwQzcxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX1IgPSAweDBDNzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fRyA9IDB4MEM3MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19CID0gMHgwQzc0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX0EgPSAweDBDNzU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX1JfVE9fUiA9IDB4MEM3NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfR19UT19HID0gMHgwQzc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9CX1RPX0IgPSAweDBDNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0FfVE9fQSA9IDB4MEM3OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19JX1NJWkUgPSAweDBDQjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX1NfVE9fU19TSVpFID0gMHgwQ0IxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX1JfU0laRSA9IDB4MENCMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19HX1NJWkUgPSAweDBDQjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fQl9TSVpFID0gMHgwQ0I0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX0FfU0laRSA9IDB4MENCNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfUl9UT19SX1NJWkUgPSAweDBDQjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0dfVE9fR19TSVpFID0gMHgwQ0I3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9CX1RPX0JfU0laRSA9IDB4MENCODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfQV9UT19BX1NJWkUgPSAweDBDQjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5QQUNLX1NXQVBfQllURVMgPSAweDBDRjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5QQUNLX0xTQl9GSVJTVCA9IDB4MENGMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfUk9XX0xFTkdUSCA9IDB4MENGMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfU0tJUF9ST1dTID0gMHgwQ0YzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOUEFDS19TS0lQX1BJWEVMUyA9IDB4MENGNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UID0gMHgwQ0Y1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBQ0tfU1dBUF9CWVRFUyA9IDB4MEQwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX0xTQl9GSVJTVCA9IDB4MEQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX1JPV19MRU5HVEggPSAweDBEMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19TS0lQX1JPV1MgPSAweDBEMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19TS0lQX1BJWEVMUyA9IDB4MEQwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX0FMSUdOTUVOVCA9IDB4MEQwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVBfQ09MT1IgPSAweDBEMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQX1NURU5DSUwgPSAweDBEMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfU0hJRlQgPSAweDBEMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfT0ZGU0VUID0gMHgwRDEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRF9TQ0FMRSA9IDB4MEQxNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRURfQklBUyA9IDB4MEQxNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aT09NX1ggPSAweDBEMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfWk9PTV9ZID0gMHgwRDE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX1NDQUxFID0gMHgwRDE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX0JJQVMgPSAweDBEMTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9TQ0FMRSA9IDB4MEQxQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTFVFX0JJQVMgPSAweDBEMUI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfU0NBTEUgPSAweDBEMUM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfQklBUyA9IDB4MEQxRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9TQ0FMRSA9IDB4MEQxRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9CSUFTID0gMHgwRDFGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9FVkFMX09SREVSID0gMHgwRDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9MSUdIVFMgPSAweDBEMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NMSVBfUExBTkVTID0gMHgwRDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9URVhUVVJFX1NJWkUgPSAweDBEMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1BJWEVMX01BUF9UQUJMRSA9IDB4MEQzNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfQVRUUklCX1NUQUNLX0RFUFRIID0gMHgwRDM1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggPSAweDBEMzY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX05BTUVfU1RBQ0tfREVQVEggPSAweDBEMzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggPSAweDBEMzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggPSAweDBEMzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgPSAweDBEM0E7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEggPSAweDBEM0I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1VCUElYRUxfQklUUyA9IDB4MEQ1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9CSVRTID0gMHgwRDUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRF9CSVRTID0gMHgwRDUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX0JJVFMgPSAweDBENTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9CSVRTID0gMHgwRDU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX0JJVFMgPSAweDBENTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQklUUyA9IDB4MEQ1NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JJVFMgPSAweDBENTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fUkVEX0JJVFMgPSAweDBENTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fR1JFRU5fQklUUyA9IDB4MEQ1OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BQ0NVTV9CTFVFX0JJVFMgPSAweDBENUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fQUxQSEFfQklUUyA9IDB4MEQ1QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OQU1FX1NUQUNLX0RFUFRIID0gMHgwRDcwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FVVE9fTk9STUFMID0gMHgwRDgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfQ09MT1JfNCA9IDB4MEQ5MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAxX0lOREVYID0gMHgwRDkxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfTk9STUFMID0gMHgwRDkyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8xID0gMHgwRDkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8yID0gMHgwRDk0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8zID0gMHgwRDk1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF80ID0gMHgwRDk2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVkVSVEVYXzMgPSAweDBEOTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMV9WRVJURVhfNCA9IDB4MEQ5ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX0NPTE9SXzQgPSAweDBEQjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMl9JTkRFWCA9IDB4MERCMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX05PUk1BTCA9IDB4MERCMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMSA9IDB4MERCMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMiA9IDB4MERCNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMyA9IDB4MERCNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNCA9IDB4MERCNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1ZFUlRFWF8zID0gMHgwREI3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDJfVkVSVEVYXzQgPSAweDBEQjg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMV9HUklEX0RPTUFJTiA9IDB4MEREMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAxX0dSSURfU0VHTUVOVFMgPSAweDBERDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMl9HUklEX0RPTUFJTiA9IDB4MEREMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX0dSSURfU0VHTUVOVFMgPSAweDBERDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV8xRCA9IDB4MERFMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFXzJEID0gMHgwREUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9QT0lOVEVSID0gMHgwREYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9TSVpFID0gMHgwREYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9UWVBFID0gMHgwREYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NFTEVDVElPTl9CVUZGRVJfUE9JTlRFUiA9IDB4MERGMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRUxFQ1RJT05fQlVGRkVSX1NJWkUgPSAweDBERjQ7Ci0JLyogICAgICBHTF9URVhUVVJFX0JJTkRJTkdfMUQgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQklORElOR18yRCAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0NPTE9SX0FSUkFZICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLwotCS8qICAgICAgR0xfRURHRV9GTEFHX0FSUkFZICovCi0JLyogICAgICBHTF9WRVJURVhfQVJSQVlfU0laRSAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWV9UWVBFICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9TSVpFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9UWVBFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9TVFJJREUgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZX1NUUklERSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICovCi0KLQkvKiBHZXRUZXh0dXJlUGFyYW1ldGVyICovCi0JLyogICAgICBHTF9URVhUVVJFX01BR19GSUxURVIgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1MgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9UICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9XSURUSCA9IDB4MTAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0hFSUdIVCA9IDB4MTAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVCA9IDB4MTAwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUiA9IDB4MTAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JPUkRFUiA9IDB4MTAwNTsKLQkvKiAgICAgIEdMX1RFWFRVUkVfUkVEX1NJWkUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfR1JFRU5fU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9CTFVFX1NJWkUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQUxQSEFfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9JTlRFTlNJVFlfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9QUklPUklUWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9SRVNJREVOVCAqLwotCi0JLyogSGludE1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET05UX0NBUkUgPSAweDExMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFTVEVTVCA9IDB4MTEwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OSUNFU1QgPSAweDExMDI7Ci0KLQkvKiBIaW50VGFyZ2V0ICovCi0JLyogICAgICBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgKi8KLQkvKiAgICAgIEdMX1BPSU5UX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9MSU5FX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9QT0xZR09OX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9GT0dfSElOVCAqLwotCS8qICAgICAgR0xfUEhPTkdfSElOVCAqLwotCi0JLyogSW5kZXhQb2ludGVyVHlwZSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMX0RPVUJMRSAqLwotCi0JLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLwotCS8qICAgICAgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAqLwotCS8qICAgICAgR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSICovCi0JLyogICAgICBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAqLwotCi0JLyogTGlnaHROYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQwID0gMHg0MDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUMSA9IDB4NDAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDIgPSAweDQwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQzID0gMHg0MDAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNCA9IDB4NDAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDUgPSAweDQwMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQ2ID0gMHg0MDA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNyA9IDB4NDAwNzsKLQotCS8qIExpZ2h0UGFyYW1ldGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU1CSUVOVCA9IDB4MTIwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ESUZGVVNFID0gMHgxMjAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQRUNVTEFSID0gMHgxMjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPU0lUSU9OID0gMHgxMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRElSRUNUSU9OID0gMHgxMjA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRVhQT05FTlQgPSAweDEyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1BPVF9DVVRPRkYgPSAweDEyMDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gPSAweDEyMDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX0FUVEVOVUFUSU9OID0gMHgxMjA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiA9IDB4MTIwOTsKLQotCS8qIEludGVybGVhdmVkQXJyYXlzICovCi0JLyogICAgICBHTF9WMkYgKi8KLQkvKiAgICAgIEdMX1YzRiAqLwotCS8qICAgICAgR0xfQzRVQl9WMkYgKi8KLQkvKiAgICAgIEdMX0M0VUJfVjNGICovCi0JLyogICAgICBHTF9DM0ZfVjNGICovCi0JLyogICAgICBHTF9OM0ZfVjNGICovCi0JLyogICAgICBHTF9DNEZfTjNGX1YzRiAqLwotCS8qICAgICAgR0xfVDJGX1YzRiAqLwotCS8qICAgICAgR0xfVDRGX1Y0RiAqLwotCS8qICAgICAgR0xfVDJGX0M0VUJfVjNGICovCi0JLyogICAgICBHTF9UMkZfQzNGX1YzRiAqLwotCS8qICAgICAgR0xfVDJGX04zRl9WM0YgKi8KLQkvKiAgICAgIEdMX1QyRl9DNEZfTjNGX1YzRiAqLwotCS8qICAgICAgR0xfVDRGX0M0Rl9OM0ZfVjRGICovCi0KLQkvKiBMaXN0TW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTVBJTEUgPSAweDEzMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09NUElMRV9BTkRfRVhFQ1VURSA9IDB4MTMwMTsKLQotCS8qIExpc3ROYW1lVHlwZSAqLwotCS8qICAgICAgR0xfQllURSAqLwotCS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMXzJfQllURVMgKi8KLQkvKiAgICAgIEdMXzNfQllURVMgKi8KLQkvKiAgICAgIEdMXzRfQllURVMgKi8KLQotCS8qIExvZ2ljT3AgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTEVBUiA9IDB4MTUwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkQgPSAweDE1MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU5EX1JFVkVSU0UgPSAweDE1MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09QWSA9IDB4MTUwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkRfSU5WRVJURUQgPSAweDE1MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9PUCA9IDB4MTUwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9YT1IgPSAweDE1MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1IgPSAweDE1MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9SID0gMHgxNTA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VRVUlWID0gMHgxNTA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkVSVCA9IDB4MTUwQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUl9SRVZFUlNFID0gMHgxNTBCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPUFlfSU5WRVJURUQgPSAweDE1MEM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1JfSU5WRVJURUQgPSAweDE1MEQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkFORCA9IDB4MTUwRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRVQgPSAweDE1MEY7Ci0KLQkvKiBNYXBUYXJnZXQgKi8KLQkvKiAgICAgIEdMX01BUDFfQ09MT1JfNCAqLwotCS8qICAgICAgR0xfTUFQMV9JTkRFWCAqLwotCS8qICAgICAgR0xfTUFQMV9OT1JNQUwgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF8xICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMiAqLwotCS8qICAgICAgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzMgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF80ICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF8zICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF80ICovCi0JLyogICAgICBHTF9NQVAyX0NPTE9SXzQgKi8KLQkvKiAgICAgIEdMX01BUDJfSU5ERVggKi8KLQkvKiAgICAgIEdMX01BUDJfTk9STUFMICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMSAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzIgKi8KLQkvKiAgICAgIEdMX01BUDJfVEVYVFVSRV9DT09SRF8zICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNCAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfMyAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfNCAqLwotCi0JLyogTWF0ZXJpYWxGYWNlICovCi0JLyogICAgICBHTF9GUk9OVCAqLwotCS8qICAgICAgR0xfQkFDSyAqLwotCS8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KLQotCS8qIE1hdGVyaWFsUGFyYW1ldGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRU1JU1NJT04gPSAweDE2MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hJTklORVNTID0gMHgxNjAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgPSAweDE2MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVhFUyA9IDB4MTYwMzsKLQkvKiAgICAgIEdMX0FNQklFTlQgKi8KLQkvKiAgICAgIEdMX0RJRkZVU0UgKi8KLQkvKiAgICAgIEdMX1NQRUNVTEFSICovCi0KLQkvKiBNYXRyaXhNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXID0gMHgxNzAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT04gPSAweDE3MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRSA9IDB4MTcwMjsKLQotCS8qIE1lc2hNb2RlMSAqLwotCS8qICAgICAgR0xfUE9JTlQgKi8KLQkvKiAgICAgIEdMX0xJTkUgKi8KLQotCS8qIE1lc2hNb2RlMiAqLwotCS8qICAgICAgR0xfUE9JTlQgKi8KLQkvKiAgICAgIEdMX0xJTkUgKi8KLQkvKiAgICAgIEdMX0ZJTEwgKi8KLQotCS8qIE5vcm1hbFBvaW50ZXJUeXBlICovCi0JLyogICAgICBHTF9CWVRFICovCi0JLyogICAgICBHTF9TSE9SVCAqLwotCS8qICAgICAgR0xfSU5UICovCi0JLyogICAgICBHTF9GTE9BVCAqLwotCS8qICAgICAgR0xfRE9VQkxFICovCi0KLQkvKiBQaXhlbENvcHlUeXBlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1IgPSAweDE4MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEggPSAweDE4MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTCA9IDB4MTgwMjsKLQotCS8qIFBpeGVsRm9ybWF0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVggPSAweDE5MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9JTkRFWCA9IDB4MTkwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DT01QT05FTlQgPSAweDE5MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVEID0gMHgxOTAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOID0gMHgxOTA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMVUUgPSAweDE5MDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEEgPSAweDE5MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCID0gMHgxOTA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEgPSAweDE5MDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFID0gMHgxOTA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRV9BTFBIQSA9IDB4MTkwQTsKLQotCS8qIFBpeGVsTWFwICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19JICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfU19UT19TICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19SICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19HICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19CICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19BICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfUl9UT19SICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfR19UT19HICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfQl9UT19CICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfQV9UT19BICovCi0KLQkvKiBQaXhlbFN0b3JlICovCi0JLyogICAgICBHTF9VTlBBQ0tfU1dBUF9CWVRFUyAqLwotCS8qICAgICAgR0xfVU5QQUNLX0xTQl9GSVJTVCAqLwotCS8qICAgICAgR0xfVU5QQUNLX1JPV19MRU5HVEggKi8KLQkvKiAgICAgIEdMX1VOUEFDS19TS0lQX1JPV1MgKi8KLQkvKiAgICAgIEdMX1VOUEFDS19TS0lQX1BJWEVMUyAqLwotCS8qICAgICAgR0xfVU5QQUNLX0FMSUdOTUVOVCAqLwotCS8qICAgICAgR0xfUEFDS19TV0FQX0JZVEVTICovCi0JLyogICAgICBHTF9QQUNLX0xTQl9GSVJTVCAqLwotCS8qICAgICAgR0xfUEFDS19ST1dfTEVOR1RIICovCi0JLyogICAgICBHTF9QQUNLX1NLSVBfUk9XUyAqLwotCS8qICAgICAgR0xfUEFDS19TS0lQX1BJWEVMUyAqLwotCS8qICAgICAgR0xfUEFDS19BTElHTk1FTlQgKi8KLQotCS8qIFBpeGVsVHJhbnNmZXIgKi8KLQkvKiAgICAgIEdMX01BUF9DT0xPUiAqLwotCS8qICAgICAgR0xfTUFQX1NURU5DSUwgKi8KLQkvKiAgICAgIEdMX0lOREVYX1NISUZUICovCi0JLyogICAgICBHTF9JTkRFWF9PRkZTRVQgKi8KLQkvKiAgICAgIEdMX1JFRF9TQ0FMRSAqLwotCS8qICAgICAgR0xfUkVEX0JJQVMgKi8KLQkvKiAgICAgIEdMX0dSRUVOX1NDQUxFICovCi0JLyogICAgICBHTF9HUkVFTl9CSUFTICovCi0JLyogICAgICBHTF9CTFVFX1NDQUxFICovCi0JLyogICAgICBHTF9CTFVFX0JJQVMgKi8KLQkvKiAgICAgIEdMX0FMUEhBX1NDQUxFICovCi0JLyogICAgICBHTF9BTFBIQV9CSUFTICovCi0JLyogICAgICBHTF9ERVBUSF9TQ0FMRSAqLwotCS8qICAgICAgR0xfREVQVEhfQklBUyAqLwotCi0JLyogUGl4ZWxUeXBlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQklUTUFQID0gMHgxQTAwOwotCS8qICAgICAgR0xfQllURSAqLwotCS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQotCS8qIFBvbHlnb25Nb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlQgPSAweDFCMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORSA9IDB4MUIwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GSUxMID0gMHgxQjAyOwotCi0JLyogUmVhZEJ1ZmZlck1vZGUgKi8KLQkvKiAgICAgIEdMX0ZST05UX0xFRlQgKi8KLQkvKiAgICAgIEdMX0ZST05UX1JJR0hUICovCi0JLyogICAgICBHTF9CQUNLX0xFRlQgKi8KLQkvKiAgICAgIEdMX0JBQ0tfUklHSFQgKi8KLQkvKiAgICAgIEdMX0ZST05UICovCi0JLyogICAgICBHTF9CQUNLICovCi0JLyogICAgICBHTF9MRUZUICovCi0JLyogICAgICBHTF9SSUdIVCAqLwotCS8qICAgICAgR0xfQVVYMCAqLwotCS8qICAgICAgR0xfQVVYMSAqLwotCS8qICAgICAgR0xfQVVYMiAqLwotCS8qICAgICAgR0xfQVVYMyAqLwotCi0JLyogUmVuZGVyaW5nTW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUiA9IDB4MUMwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GRUVEQkFDSyA9IDB4MUMwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRUxFQ1QgPSAweDFDMDI7Ci0KLQkvKiBTaGFkaW5nTW9kZWwgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTEFUID0gMHgxRDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NNT09USCA9IDB4MUQwMTsKLQotCS8qIFN0ZW5jaWxGdW5jdGlvbiAqLwotCS8qICAgICAgR0xfTkVWRVIgKi8KLQkvKiAgICAgIEdMX0xFU1MgKi8KLQkvKiAgICAgIEdMX0VRVUFMICovCi0JLyogICAgICBHTF9MRVFVQUwgKi8KLQkvKiAgICAgIEdMX0dSRUFURVIgKi8KLQkvKiAgICAgIEdMX05PVEVRVUFMICovCi0JLyogICAgICBHTF9HRVFVQUwgKi8KLQkvKiAgICAgIEdMX0FMV0FZUyAqLwotCi0JLyogU3RlbmNpbE9wICovCi0JLyogICAgICBHTF9aRVJPICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfS0VFUCA9IDB4MUUwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBMQUNFID0gMHgxRTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOQ1IgPSAweDFFMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDUiA9IDB4MUUwMzsKLQkvKiAgICAgIEdMX0lOVkVSVCAqLwotCi0JLyogU3RyaW5nTmFtZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFTkRPUiA9IDB4MUYwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJFUiA9IDB4MUYwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJTSU9OID0gMHgxRjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VYVEVOU0lPTlMgPSAweDFGMDM7Ci0KLQkvKiBUZXh0dXJlQ29vcmROYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUyA9IDB4MjAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UID0gMHgyMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1IgPSAweDIwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUSA9IDB4MjAwMzsKLQotCS8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KLQkvKiAgICAgIEdMX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX0ZMT0FUICovCi0JLyogICAgICBHTF9ET1VCTEUgKi8KLQotCS8qIFRleHR1cmVFbnZNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9EVUxBVEUgPSAweDIxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDQUwgPSAweDIxMDE7Ci0JLyogICAgICBHTF9CTEVORCAqLwotCS8qICAgICAgR0xfUkVQTEFDRSAqLwotCi0JLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfRU5WX01PREUgPSAweDIyMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlZfQ09MT1IgPSAweDIyMDE7Ci0KLQkvKiBUZXh0dXJlRW52VGFyZ2V0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlYgPSAweDIzMDA7Ci0KLQkvKiBUZXh0dXJlR2VuTW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VZRV9MSU5FQVIgPSAweDI0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT0JKRUNUX0xJTkVBUiA9IDB4MjQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUEhFUkVfTUFQID0gMHgyNDAyOwotCi0JLyogVGV4dHVyZUdlblBhcmFtZXRlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX01PREUgPSAweDI1MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT0JKRUNUX1BMQU5FID0gMHgyNTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VZRV9QTEFORSA9IDB4MjUwMjsKLQotCS8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORUFSRVNUID0gMHgyNjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUiA9IDB4MjYwMTsKLQotCS8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KLQkvKiAgICAgIEdMX05FQVJFU1QgKi8KLQkvKiAgICAgIEdMX0xJTkVBUiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgPSAweDI3MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUID0gMHgyNzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMzsKLQotCS8qIFRleHR1cmVQYXJhbWV0ZXJOYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NQUdfRklMVEVSID0gMHgyODAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiA9IDB4MjgwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfUyA9IDB4MjgwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfVCA9IDB4MjgwMzsKLQkvKiAgICAgIEdMX1RFWFRVUkVfQk9SREVSX0NPTE9SICovCi0JLyogICAgICBHTF9URVhUVVJFX1BSSU9SSVRZICovCi0KLQkvKiBUZXh0dXJlVGFyZ2V0ICovCi0JLyogICAgICBHTF9URVhUVVJFXzFEICovCi0JLyogICAgICBHTF9URVhUVVJFXzJEICovCi0JLyogICAgICBHTF9QUk9YWV9URVhUVVJFXzFEICovCi0JLyogICAgICBHTF9QUk9YWV9URVhUVVJFXzJEICovCi0KLQkvKiBUZXh0dXJlV3JhcE1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTEFNUCA9IDB4MjkwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBFQVQgPSAweDI5MDE7Ci0KLQkvKiBWZXJ0ZXhQb2ludGVyVHlwZSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMX0RPVUJMRSAqLwotCi0JLyogQ2xpZW50QXR0cmliTWFzayAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSUVOVF9QSVhFTF9TVE9SRV9CSVQgPSAweDAwMDAwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSUVOVF9WRVJURVhfQVJSQVlfQklUID0gMHgwMDAwMDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElFTlRfQUxMX0FUVFJJQl9CSVRTID0gMHhmZmZmZmZmZjsKLQotCS8qIHBvbHlnb25fb2Zmc2V0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SID0gMHg4MDM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTID0gMHgyQTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UID0gMHgyQTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUgPSAweDJBMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCA9IDB4ODAzNzsKLQotCS8qIHRleHR1cmUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQTQgPSAweDgwM0I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEE4ID0gMHg4MDNDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBMTIgPSAweDgwM0Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEExNiA9IDB4ODAzRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MVU1JTkFOQ0U0ID0gMHg4MDNGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRTggPSAweDgwNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTIgPSAweDgwNDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTYgPSAweDgwNDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFNF9BTFBIQTQgPSAweDgwNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFNl9BTFBIQTIgPSAweDgwNDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFOF9BTFBIQTggPSAweDgwNDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTJfQUxQSEE0ID0gMHg4MDQ2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRTEyX0FMUEhBMTIgPSAweDgwNDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTZfQUxQSEExNiA9IDB4ODA0ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRFTlNJVFkgPSAweDgwNDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5URU5TSVRZNCA9IDB4ODA0QTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRFTlNJVFk4ID0gMHg4MDRCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVEVOU0lUWTEyID0gMHg4MDRDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVEVOU0lUWTE2ID0gMHg4MDREOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1IzX0czX0IyID0gMHgyQTEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjQgPSAweDgwNEY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCNSA9IDB4ODA1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0I4ID0gMHg4MDUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjEwID0gMHg4MDUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjEyID0gMHg4MDUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjE2ID0gMHg4MDU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEyID0gMHg4MDU1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkE0ID0gMHg4MDU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjVfQTEgPSAweDgwNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTggPSAweDgwNTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCMTBfQTIgPSAweDgwNTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTEyID0gMHg4MDVBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkExNiA9IDB4ODA1QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1JFRF9TSVpFID0gMHg4MDVDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR1JFRU5fU0laRSA9IDB4ODA1RDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JMVUVfU0laRSA9IDB4ODA1RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0FMUEhBX1NJWkUgPSAweDgwNUY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRSA9IDB4ODA2MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFID0gMHg4MDYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST1hZX1RFWFRVUkVfMUQgPSAweDgwNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUFJPWFlfVEVYVFVSRV8yRCA9IDB4ODA2NDsKLQotCS8qIHRleHR1cmVfb2JqZWN0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9QUklPUklUWSA9IDB4ODA2NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1JFU0lERU5UID0gMHg4MDY3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQklORElOR18xRCA9IDB4ODA2ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfMkQgPSAweDgwNjk7Ci0KLQkvKiB2ZXJ0ZXhfYXJyYXkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVkgPSAweDgwNzQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZID0gMHg4MDc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZID0gMHg4MDc2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZID0gMHg4MDc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgPSAweDgwNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZID0gMHg4MDc5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFID0gMHg4MDdBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9UWVBFID0gMHg4MDdCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgPSAweDgwN0M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEUgPSAweDgwN0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1NUUklERSA9IDB4ODA3RjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9TSVpFID0gMHg4MDgxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX1RZUEUgPSAweDgwODI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFID0gMHg4MDgzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZX1RZUEUgPSAweDgwODU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfU1RSSURFID0gMHg4MDg2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSA9IDB4ODA4ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgPSAweDgwODk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgPSAweDgwOEE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZX1NUUklERSA9IDB4ODA4QzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiA9IDB4ODA4RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiA9IDB4ODA4RjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSID0gMHg4MDkwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZX1BPSU5URVIgPSAweDgwOTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSID0gMHg4MDkyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSID0gMHg4MDkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1YyRiA9IDB4MkEyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WM0YgPSAweDJBMjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzRVQl9WMkYgPSAweDJBMjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzRVQl9WM0YgPSAweDJBMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzNGX1YzRiA9IDB4MkEyNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OM0ZfVjNGID0gMHgyQTI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0M0Rl9OM0ZfVjNGID0gMHgyQTI2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1QyRl9WM0YgPSAweDJBMjc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDRGX1Y0RiA9IDB4MkEyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UMkZfQzRVQl9WM0YgPSAweDJBMjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX0MzRl9WM0YgPSAweDJBMkE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX04zRl9WM0YgPSAweDJBMkI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX0M0Rl9OM0ZfVjNGID0gMHgyQTJDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1Q0Rl9DNEZfTjNGX1Y0RiA9IDB4MkEyRDsKLQotCS8qIEV4dGVuc2lvbnMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFRfdmVydGV4X2FycmF5ID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFRfYmdyYSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9zd2FwX2hpbnQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9kcmF3X3JhbmdlX2VsZW1lbnRzID0gMTsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XSU5fcGhvbmdfc2hhZGluZyAgICAgICAgICAgICAgPSAxOwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9zcGVjdWxhcl9mb2cgICAgICAgICAgICAgICA9IDE7Ci0KLQkvKiBFWFRfdmVydGV4X2FycmF5ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX0VYVCA9IDB4ODA3NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfRVhUID0gMHg4MDc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX0VYVCA9IDB4ODA3NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9BUlJBWV9FWFQgPSAweDgwNzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9FWFQgPSAweDgwNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZX0VYVCA9IDB4ODA3OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfU0laRV9FWFQgPSAweDgwN0E7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEVfRVhUID0gMHg4MDdCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREVfRVhUID0gMHg4MDdDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwN0Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEVfRVhUID0gMHg4MDdFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9TVFJJREVfRVhUID0gMHg4MDdGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU0laRV9FWFQgPSAweDgwODE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRV9FWFQgPSAweDgwODI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfVFlQRV9FWFQgPSAweDgwODU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFX0VYVCA9IDB4ODA4ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEVfRVhUID0gMHg4MDg5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4QTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0NPVU5UX0VYVCA9IDB4ODA4QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4QzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfQ09VTlRfRVhUID0gMHg4MDhEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSX0VYVCA9IDB4ODA4RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOEY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSX0VYVCA9IDB4ODA5MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9VQkxFX0VYVCA9IEdMX0RPVUJMRTsKLQotCS8qIEVYVF9iZ3JhICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkdSX0VYVCA9IDB4ODBFMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CR1JBX0VYVCA9IDB4ODBFMTsKLQotCS8qIEVYVF9wYWxldHRlZF90ZXh0dXJlICovCi0KLQkvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBHTF9DT0xPUl9UQUJMRV8qX1NHSSBlbnVtZXJhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfRk9STUFUX0VYVCA9IDB4ODBEODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9UQUJMRV9XSURUSF9FWFQgPSAweDgwRDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkVfRVhUID0gMHg4MERBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkVfRVhUID0gMHg4MERCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRV9FWFQgPSAweDgwREM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRV9FWFQgPSAweDgwREQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkVfRVhUID0gMHg4MERFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFX0VYVCA9IDB4ODBERjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0lOREVYMV9FWFQgPSAweDgwRTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgyX0VYVCA9IDB4ODBFMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9JTkRFWDRfRVhUID0gMHg4MEU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0lOREVYOF9FWFQgPSAweDgwRTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgxMl9FWFQgPSAweDgwRTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgxNl9FWFQgPSAweDgwRTc7Ci0KLQkvKiBXSU5fZHJhd19yYW5nZV9lbGVtZW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9FTEVNRU5UU19WRVJUSUNFU19XSU4gPSAweDgwRTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0VMRU1FTlRTX0lORElDRVNfV0lOID0gMHg4MEU5OwotCi0JLyogV0lOX3Bob25nX3NoYWRpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSE9OR19XSU4gPSAweDgwRUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEhPTkdfSElOVF9XSU4gPSAweDgwRUI7Ci0KLQkvKiBXSU5fc3BlY3VsYXJfZm9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX1NQRUNVTEFSX1RFWFRVUkVfV0lOID0gMHg4MEVDOwotCi0JLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBPcGVuR0wgdjEuMCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPR0lDX09QID0gR0xfSU5ERVhfTE9HSUNfT1A7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT01QT05FTlRTID0gR0xfVEVYVFVSRV9JTlRFUk5BTF9GT1JNQVQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQWNjdW0gKGludCBvcCwgZmxvYXQgdmFsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xBbHBoYUZ1bmMgKGludCBmdW5jLCBmbG9hdCByZWYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gZ2xBcmVUZXh0dXJlc1Jlc2lkZW50IChpbnQgbiwgaW50W10gdGV4dHVyZXMsIGJvb2xlYW5bXSByZXNpZGVuY2VzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQXJyYXlFbGVtZW50IChpbnQgaW5kZXgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xCZWdpbiAoaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFbmQgKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJpbmRUZXh0dXJlIChpbnQgdGFyZ2V0LCBpbnQgdGV4dHVyZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJpdG1hcCAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBmbG9hdCB4b3JpZywgZmxvYXQgeW9yaWcsIGZsb2F0IHhtb3ZlLCBmbG9hdCB5bW92ZSwgYnl0ZVtdIGJpdG1hcCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJsZW5kRnVuYyAoaW50IHNmYWN0b3IsIGludCBkZmFjdG9yKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2FsbExpc3QgKGludCBsaXN0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2FsbExpc3RzIChpbnQgbiwgaW50IHR5cGUsIGJ5dGVbXSBsaXN0cyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENhbGxMaXN0cyAoaW50IG4sIGludCB0eXBlLCBjaGFyW10gbGlzdHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDYWxsTGlzdHMgKGludCBuLCBpbnQgdHlwZSwgaW50W10gbGlzdHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGVhciAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGVhckFjY3VtIChmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENsZWFyQ29sb3IgKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2xlYXJEZXB0aCAoZG91YmxlIGRlcHRoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2xlYXJJbmRleCAoZmxvYXQgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENsZWFyU3RlbmNpbCAoaW50IHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGlwUGxhbmUgKGludCBwbGFuZSwgZG91YmxlW10gZXF1YXRpb24pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNiIChieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzZCAoZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM2YgKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNpIChpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzcyAoc2hvcnQgcmVkLCBzaG9ydCBncmVlbiwgc2hvcnQgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3ViIChieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzdWkgKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjN1cyAoc2hvcnQgcmVkLCBzaG9ydCBncmVlbiwgc2hvcnQgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNGIgKGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGJ5dGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRkIChkb3VibGUgcmVkLCBkb3VibGUgZ3JlZW4sIGRvdWJsZSBibHVlLCBkb3VibGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRmIChmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNGkgKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUsIGludCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNHMgKHNob3J0IHJlZCwgc2hvcnQgZ3JlZW4sIHNob3J0IGJsdWUsIHNob3J0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dWIgKGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGJ5dGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjR1aSAoaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSwgaW50IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dXMgKHNob3J0IHJlZCwgc2hvcnQgZ3JlZW4sIHNob3J0IGJsdWUsIHNob3J0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzYnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzdWJ2IChieXRlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3VpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3VzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0YnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0ZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0aXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjR1YnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dWl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dXN2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvck1hc2sgKGJvb2xlYW4gcmVkLCBib29sZWFuIGdyZWVuLCBib29sZWFuIGJsdWUsIGJvb2xlYW4gYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvck1hdGVyaWFsIChpbnQgZmFjZSwgaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvclBvaW50ZXIgKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgaW50W10gcG9pbnRlcik7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3JUYWJsZUVYVCAoaW50IHRhcmdldCwgaW50IGludGVybmFsRm9ybWF0LCBpbnQgd2lkdGgsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBkYXRhKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvclN1YlRhYmxlRVhUIChpbnQgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGZvcm1hdCwgaW50IHR5cGUsIGludFtdIGRhdGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5UGl4ZWxzIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHR5cGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5VGV4SW1hZ2UxRCAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgaW50ZXJuYWxGb3JtYXQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgYm9yZGVyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29weVRleEltYWdlMkQgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IGludGVybmFsRm9ybWF0LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJvcmRlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvcHlUZXhTdWJJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCk7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgeG9mZnNldCwgaW50IHlvZmZzZXQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ3VsbEZhY2UgKGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVsZXRlTGlzdHMgKGludCBsaXN0LCBpbnQgcmFuZ2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEZWxldGVUZXh0dXJlcyAoaW50IG4sIGludFtdIHRleHR1cmVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVwdGhGdW5jIChpbnQgZnVuYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERlcHRoTWFzayAoYm9vbGVhbiBmbGFnKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVwdGhSYW5nZSAoZG91YmxlIHpuZWFyLCBkb3VibGUgemZhcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERyYXdBcnJheXMgKGludCBtb2RlLCBpbnQgZmlyc3QsIGludCBjb3VudCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERyYXdCdWZmZXIgKGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRHJhd0VsZW1lbnRzIChpbnQgbW9kZSwgaW50IGNvdW50LCBpbnQgdHlwZSwgaW50W10gaW5kaWNlcyk7IC8qIE1VTFRJUExFUyBUWVBFUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEcmF3UGl4ZWxzIChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgVFlQRVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRWRnZUZsYWcgKGJvb2xlYW4gZmxhZyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVkZ2VGbGFndiAoYm9vbGVhbltdIGZsYWcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFZGdlRmxhZ1BvaW50ZXIgKGludCBzdHJpZGUsIGJvb2xlYW5bXSBwb2ludGVyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRW5hYmxlIChpbnQgY2FwKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGlzYWJsZSAoaW50IGNhcCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlIChpbnQgYXJyYXkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKGludCBhcnJheSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDFkIChkb3VibGUgdSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDFmIChmbG9hdCB1KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMmQgKGRvdWJsZSB1LCBkb3VibGUgdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDJmIChmbG9hdCB1LCBmbG9hdCB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMWR2IChkb3VibGVbXSB1KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMWZ2IChmbG9hdFtdIHUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsQ29vcmQyZHYgKGRvdWJsZVtdIHUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsQ29vcmQyZnYgKGZsb2F0W10gdSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxNZXNoMSAoaW50IG1vZGUsIGludCBpMSwgaW50IGkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbE1lc2gyIChpbnQgbW9kZSwgaW50IGkxLCBpbnQgaTIsIGludCBqMSwgaW50IGoyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbFBvaW50MSAoaW50IGkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsUG9pbnQyIChpbnQgaSwgaW50IGopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xGZWVkYmFja0J1ZmZlciAoaW50IHNpemUsIGludCB0eXBlLCBmbG9hdFtdIGJ1ZmZlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZpbmlzaCAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRmx1c2ggKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZvZ2YgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xGb2dpIChpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZvZ2Z2IChpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRm9naXYgKGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRnJvbnRGYWNlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZydXN0dW0gKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sIGRvdWJsZSB0b3AsIGRvdWJsZSB6bmVhciwgZG91YmxlIHpmYXIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbEdlbkxpc3RzIChpbnQgcmFuZ2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZW5UZXh0dXJlcyAoaW50IG4sIGludFtdIHRleHR1cmVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Qm9vbGVhbnYgKGludCBwbmFtZSwgYm9vbGVhbltdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldERvdWJsZXYgKGludCBwbmFtZSwgZG91YmxlW10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0RmxvYXR2IChpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0SW50ZWdlcnYgKGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Q2xpcFBsYW5lIChpbnQgcGxhbmUsIGRvdWJsZVtdIGVxdWF0aW9uKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRDb2xvclRhYmxlRVhUIChpbnQgdGFyZ2V0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gZGF0YSk7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2RVhUIChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZFWFQgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xHZXRFcnJvciAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRmdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRpdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldE1hcGR2IChpbnQgdGFnZXJ0LCBpbnQgcXVlcnksIGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXBmdiAoaW50IHRhZ2VydCwgaW50IHF1ZXJ5LCBmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXBpdiAoaW50IHRhZ2VydCwgaW50IHF1ZXJ5LCBpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TWF0ZXJpYWxmdiAoaW50IGZhY2UsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXRlcmlhbGl2IChpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQaXhlbE1hcGZ2IChpbnQgbWFwLCBmbG9hdFtdIHZhbHVlcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFBpeGVsTWFwdWl2IChpbnQgbWFwLCBpbnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQaXhlbE1hcHVzdiAoaW50IG1hcCwgc2hvcnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQb2ludGVydiAoaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCS8qIFRFU1QgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0UG9seWdvblN0aXBwbGUgKGJ5dGVbXSBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xHZXRTdHJpbmcgKGludCBuYW1lKTsKLQkvKiBTSE9VTEQgUkVUVVJOIEEgU1RSSU5HICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleEVudmZ2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4RW52aXYgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VuZHYgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGVbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhHZW5mdiAoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VuaXYgKGludCBjb29yZCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhJbWFnZSAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleExldmVsUGFyYW1ldGVyZnYgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleExldmVsUGFyYW1ldGVyaXYgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleFBhcmFtZXRlcml2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEhpbnQgKGludCB0YXJnZXQsIGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhkIChkb3VibGUgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4ZiAoZmxvYXQgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4aSAoaW50IGMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleHMgKHNob3J0IGMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleGR2IChkb3VibGVbXSBjKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhmdiAoZmxvYXRbXSBjKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhpdiAoaW50W10gYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4c3YgKHNob3J0W10gYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4TWFzayAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleFBvaW50ZXIgKGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsKLQkvKiBNVUxUSVBMRVMgVFlQRVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5pdE5hbWVzICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbnRlcmxlYXZlZEFycmF5cyAoaW50IGZvcm1hdCwgaW50IHN0cmlkZSwgaW50W10gcG9pbnRlcik7Ci0JLyogQ0hFQ0sgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsSXNFbmFibGVkIChpbnQgY2FwKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsSXNMaXN0IChpbnQgbGlzdCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbElzVGV4dHVyZSAoaW50IHRleHR1cmUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodGYgKGludCBsaWdodCwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0aSAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0ZnYgKGludCBsaWdodCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodGZ2IChpbnQgbGlnaHQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGlnaHRpdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGlnaHRNb2RlbGYgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsaSAoaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsZnYgKGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWxpdiAoaW50IHBuYW1lLCBpbnRbXSBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpbmVTdGlwcGxlIChpbnQgZmFjdG9yLCBzaG9ydCBwYXR0ZXJuKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGluZVdpZHRoIChmbG9hdCB3aWR0aCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpc3RCYXNlIChpbnQgYmFzZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExvYWRJZGVudGl0eSAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9hZE1hdHJpeGQgKGRvdWJsZVtdIG0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMb2FkTWF0cml4ZiAoZmxvYXRbXSBtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9hZE5hbWUgKGludCBuYW1lKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9naWNPcCAoaW50IG9wY29kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE1hcDFkIChpbnQgdGFyZ2V0LCBkb3VibGUgdTEsIGRvdWJsZSB1MiwgaW50IHN0cmlkZSwgaW50IG9yZGVyLCBkb3VibGVbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXAxZiAoaW50IHRhcmdldCwgZmxvYXQgdTEsIGZsb2F0IHUyLCBpbnQgc3RyaWRlLCBpbnQgb3JkZXIsIGZsb2F0W10gcG9pbnRzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwMmQgKGludCB0YXJnZXQsIGRvdWJsZSB1MSwgZG91YmxlIHUyLCBpbnQgdXN0cmlkZSwgaW50IHVvcmRlciwgZG91YmxlIHYxLCBkb3VibGUgdjIsIGludCB2c3RyaWRlLCBpbnQgdm9yZGVyLCBkb3VibGVbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXAyZiAoaW50IHRhcmdldCwgZmxvYXQgdTEsIGZsb2F0IHUyLCBpbnQgdXN0cmlkZSwgaW50IHVvcmRlciwgZmxvYXQgdjEsIGZsb2F0IHYyLCBpbnQgdnN0cmlkZSwgaW50IHZvcmRlciwgZmxvYXRbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXBHcmlkMWQgKGludCB1biwgZG91YmxlIHUxLCBkb3VibGUgdTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXBHcmlkMWYgKGludCB1biwgZmxvYXQgdTEsIGZsb2F0IHUyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwR3JpZDJkIChpbnQgdW4sIGRvdWJsZSB1MSwgZG91YmxlIHUyLCBpbnQgdm0sIGRvdWJsZSB2MSwgZG91YmxlIHYyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwR3JpZDJmIChpbnQgdW4sIGZsb2F0IHUxLCBmbG9hdCB1MiwgaW50IHZtLCBmbG9hdCB2MSwgZmxvYXQgdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbGYgKGludCBmYWNlLCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxpIChpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbGZ2IChpbnQgZmFjZSwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxpdiAoaW50IGZhY2UsIGludCBwbmFtZSwgaW50W10gcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRyaXhNb2RlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE11bHRNYXRyaXhkIChkb3VibGVbXSBtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTXVsdE1hdHJpeGYgKGZsb2F0W10gbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5ld0xpc3QgKGludCBsaXN0LCBpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVuZExpc3QgKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbDNiIChieXRlIG54LCBieXRlIG55LCBieXRlIG56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2QgKGRvdWJsZSBueCwgZG91YmxlIG55LCBkb3VibGUgbnopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzZiAoZmxvYXQgbngsIGZsb2F0IG55LCBmbG9hdCBueik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbDNpIChpbnQgbngsIGludCBueSwgaW50IG56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM3MgKHNob3J0IG54LCBzaG9ydCBueSwgc2hvcnQgbnopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzYnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2Z2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbFBvaW50ZXIgKGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE9ydGhvIChkb3VibGUgbGVmdCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tLCBkb3VibGUgdG9wLCBkb3VibGUgem5lYXIsIGRvdWJsZSB6ZmFyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGFzc1Rocm91Z2ggKGZsb2F0IHRva2VuKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxNYXBmdiAoaW50IG1hcCwgaW50IG1hcHNpemUsIGZsb2F0W10gdmFsdWVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxNYXB1aXYgKGludCBtYXAsIGludCBtYXBzaXplLCBpbnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbE1hcHVzdiAoaW50IG1hcCwgaW50IG1hcHNpemUsIHNob3J0W10gdmFsdWVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxTdG9yZWYgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbFN0b3JlaSAoaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbFRyYW5zZmVyZiAoaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBpeGVsVHJhbnNmZXJpIChpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBpeGVsWm9vbSAoZmxvYXQgeGZhY3RvciwgZmxvYXQgeWZhY3Rvcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvaW50U2l6ZSAoZmxvYXQgc2l6ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvbHlnb25Nb2RlIChpbnQgZmFjZSwgaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0IChmbG9hdCBmYWN0b3IsIGZsb2F0IHVuaXRzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9seWdvblN0aXBwbGUgKGJ5dGVbXSBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUHJpb3JpdGl6ZVRleHR1cmVzIChpbnQgbiwgaW50W10gdGV4dHVyZXMsIGZsb2F0W10gcHJpb3JpdGllcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFB1c2hBdHRyaWIgKGludCBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9wQXR0cmliICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQdXNoQ2xpZW50QXR0cmliIChpbnQgbWFzayk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvcENsaWVudEF0dHJpYiAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUHVzaE1hdHJpeCAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9wTWF0cml4ICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQdXNoTmFtZSAoaW50IG5hbWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQb3BOYW1lICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZCAoZG91YmxlIHgsIGRvdWJsZSB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zMmYgKGZsb2F0IHgsIGZsb2F0IHkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyaSAoaW50IHgsIGludCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zMnMgKHNob3J0IHgsIHNob3J0IHkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzZCAoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczNmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2kgKGludCB4LCBpbnQgeSwgaW50IHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzcyAoc2hvcnQgeCwgc2hvcnQgeSwgc2hvcnQgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRkIChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6LCBkb3VibGUgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNGkgKGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNHMgKHNob3J0IHgsIHNob3J0IHksIHNob3J0IHosIHNob3J0IHcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczJpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczJzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2Z2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3Mzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRkdiAoZG91YmxlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNGl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNHN2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWFkQnVmZmVyIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlYWRQaXhlbHMgKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlY3RkIChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0ZiAoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0aSAoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmVjdHMgKHNob3J0IHgxLCBzaG9ydCB5MSwgc2hvcnQgeDIsIHNob3J0IHkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmVjdGR2IChkb3VibGVbXSB2MSwgZG91YmxlW10gdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0ZnYgKGZsb2F0W10gdjEsIGZsb2F0W10gdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0aXYgKGludFtdIHYxLCBpbnRbXSB2Mik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlY3RzdiAoc2hvcnRbXSB2LCBzaG9ydFtdIHYyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xSZW5kZXJNb2RlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJvdGF0ZWQgKGRvdWJsZSBhbmdsZSwgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJvdGF0ZWYgKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2NhbGVkIChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2NhbGVmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2Npc3NvciAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFNlbGVjdEJ1ZmZlciAoaW50IHNpemUsIGludFtdIGJ1ZmZlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFNlbGVjdEJ1ZmZlciAoaW50IHNpemUsIGludCBidWZmZXIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTaGFkZU1vZGVsIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFN0ZW5jaWxGdW5jIChpbnQgZnVuYywgaW50IHJlZiwgaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsTWFzayAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsT3AgKGludCBmYWlsLCBpbnQgemZhaWwsIGludCB6cGFzcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWQgKGRvdWJsZSBzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxZiAoZmxvYXQgcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWkgKGludCBzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxcyAoc2hvcnQgcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmQgKGRvdWJsZSBzLCBkb3VibGUgdCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmYgKGZsb2F0IHMsIGZsb2F0IHQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDJpIChpbnQgcywgaW50IHQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDJzIChzaG9ydCBzLCBzaG9ydCB0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzZCAoZG91YmxlIHMsIGRvdWJsZSB0LCBkb3VibGUgcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2YgKGZsb2F0IHMsIGZsb2F0IHQsIGZsb2F0IHIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDNpIChpbnQgcywgaW50IHQsIGludCByKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzcyAoc2hvcnQgcywgc2hvcnQgdCwgc2hvcnQgcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGQgKGRvdWJsZSBzLCBkb3VibGUgdCwgZG91YmxlIHIsIGRvdWJsZSBxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0ZiAoZmxvYXQgcywgZmxvYXQgdCwgZmxvYXQgciwgZmxvYXQgcSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGkgKGludCBzLCBpbnQgdCwgaW50IHIsIGludCBxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0cyAoc2hvcnQgcywgc2hvcnQgdCwgc2hvcnQgciwgc2hvcnQgcSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQyZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMml2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQyc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2l2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0ZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0c3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkUG9pbnRlciAoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLypNVUxUSVBMRVMgQVJSQVlTIC0gQ0hFQ0sgTVNESywgQ09VTlQgUEFSQU0gTUlTU0lORyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhFbnZmIChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4RW52aSAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhFbnZmdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleEVudml2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleEdlbmQgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGUgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5mIChpbnQgY29vcmQsIGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5pIChpbnQgY29vcmQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4R2VuZHYgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGVbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5mdiAoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4R2VuaXYgKGludCBjb29yZCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbEZvcm1hdCwgaW50IHdpZHRoLCBpbnQgYm9yZGVyLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIEFSUkFZUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhJbWFnZTJEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbEZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYm9yZGVyLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgYnl0ZVtdIHBpeGVscyk7IC8qIE1VTFRJUExFUyBBUlJBWVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyZiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcmkgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyZnYgKGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhTdWJJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgQVJSQVlTICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleFN1YkltYWdlMkQgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHhvZmZzZXQsIGludCB5b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgQVJSQVlTICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRyYW5zbGF0ZWQgKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUcmFuc2xhdGVmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmQgKGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDJmIChmbG9hdCB4LCBmbG9hdCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmkgKGludCB4LCBpbnQgeSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDJzIChzaG9ydCB4LCBzaG9ydCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M2QgKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgzZiAoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNpIChpbnQgeCwgaW50IHksIGludCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M3MgKHNob3J0IHgsIHNob3J0IHksIHNob3J0IHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZCAoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZiAoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRpIChpbnQgeCwgaW50IHksIGludCB6LCBpbnQgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRzIChzaG9ydCB4LCBzaG9ydCB5LCBzaG9ydCB6LCBzaG9ydCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmZ2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgyaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgyc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNkdiAoZG91YmxlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M2l2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M3N2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4UG9pbnRlciAoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLyogTVVMVElQTEVTIEFSUkFZUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWaWV3cG9ydCAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9vcGVuZ2wvR0xVLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTFUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGMxZTMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTFUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmdsOwotCi0KLXB1YmxpYyBjbGFzcyBHTFUgewotCi0JLyogVmVyc2lvbiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9WRVJTSU9OXzFfMSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1ZFUlNJT05fMV8yID0gMTsKLQkKLQkvKiBFcnJvcnM6IChyZXR1cm4gdmFsdWUgMCA9IG5vIGVycm9yKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9JTlZBTElEX0VOVU0gPSAxMDA5MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOVkFMSURfVkFMVUUgPSAxMDA5MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVF9PRl9NRU1PUlkgPSAxMDA5MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOQ09NUEFUSUJMRV9HTF9WRVJTSU9OID0gMTAwOTAzOwotCQotCS8qIFN0cmluZ05hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVkVSU0lPTiA9IDEwMDgwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVhURU5TSU9OUyA9IDEwMDgwMTsKLQkKLQkKLQkvKioqKiAgICAgICAgICAgUXVhZHJpYyBjb25zdGFudHMgICAgICAgICAgICAgICAqKioqLwotCQotCS8qIFF1YWRyaWNOb3JtYWwgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfU01PT1RIID0gMTAwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9GTEFUID0gMTAwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OT05FID0gMTAwMDAyOwotCQotCS8qIFF1YWRyaWNEcmF3U3R5bGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfUE9JTlQgPSAxMDAwMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0xJTkUgPSAxMDAwMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0ZJTEwgPSAxMDAwMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1NJTEhPVUVUVEUgPSAxMDAwMTM7Ci0JCi0JLyogUXVhZHJpY09yaWVudGF0aW9uICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVFNJREUgPSAxMDAwMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOU0lERSA9IDEwMDAyMTsKLQkKLQkvKiBDYWxsYmFjayB0eXBlczogKi8KLQkvKiAgICAgIEdMVV9FUlJPUiAgICAgICAgICAgICAgIDEwMDEwMyAqLwotCQotCQotCS8qKioqICAgICAgICAgICBUZXNzZWxhdGlvbiBjb25zdGFudHMgICAgICAgICAgICoqKiovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgR0xVX1RFU1NfTUFYX0NPT1JEID0gMS4wZTE1MDsKLQkKLQkvKiBUZXNzUHJvcGVydHkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX1JVTEUgPSAxMDAxNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQk9VTkRBUllfT05MWSA9IDEwMDE0MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19UT0xFUkFOQ0UgPSAxMDAxNDI7Ci0JCi0JLyogVGVzc1dpbmRpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX09ERCA9IDEwMDEzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX05PTlpFUk8gPSAxMDAxMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfV0lORElOR19QT1NJVElWRSA9IDEwMDEzMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX05FR0FUSVZFID0gMTAwMTMzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX1dJTkRJTkdfQUJTX0dFUV9UV08gPSAxMDAxMzQ7Ci0JCi0JLyogVGVzc0NhbGxiYWNrICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQkVHSU4gPSAxMDAxMDA7ICAvKiB2b2lkIChDQUxMQkFDSyopKEdMZW51bSAgICB0eXBlKSAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19WRVJURVggPSAxMDAxMDE7ICAvKiB2b2lkIChDQUxMQkFDSyopKHZvaWQgICAgICAqZGF0YSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FTkQgPSAxMDAxMDI7ICAvKiB2b2lkIChDQUxMQkFDSyopKHZvaWQpICAgICAgICAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUiA9IDEwMDEwMzsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xlbnVtICAgIGVycm5vKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VER0VfRkxBRyA9IDEwMDEwNDsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xib29sZWFuIGJvdW5kYXJ5RWRnZSkgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQ09NQklORSA9IDEwMDEwNTsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xkb3VibGUgIGNvb3Jkc1szXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGFbNF0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAgIHdlaWdodFs0XSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKipkYXRhT3V0KSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19CRUdJTl9EQVRBID0gMTAwMTA2OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGVudW0gICAgdHlwZSwgIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX1ZFUlRFWF9EQVRBID0gMTAwMTA3OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKSh2b2lkICAgICAgKmRhdGEsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VORF9EQVRBID0gMTAwMTA4OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKSh2b2lkICAgICAgKnBvbHlnb25fZGF0YSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUl9EQVRBID0gMTAwMTA5OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGVudW0gICAgZXJybm8sIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VER0VfRkxBR19EQVRBID0gMTAwMTEwOyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGJvb2xlYW4gYm91bmRhcnlFZGdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0NPTUJJTkVfREFUQSA9IDEwMDExMTsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xkb3VibGUgIGNvb3Jkc1szXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGFbNF0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAgIHdlaWdodFs0XSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKipkYXRhT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCQotCS8qIFRlc3NFcnJvciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SMSA9IDEwMDE1MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjIgPSAxMDAxNTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfRVJST1IzID0gMTAwMTUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SNCA9IDEwMDE1NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjUgPSAxMDAxNTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfRVJST1I2ID0gMTAwMTU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SNyA9IDEwMDE1NzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjggPSAxMDAxNTg7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfTUlTU0lOR19CRUdJTl9QT0xZR09OID0gR0xVX1RFU1NfRVJST1IxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX01JU1NJTkdfQkVHSU5fQ09OVE9VUiA9IEdMVV9URVNTX0VSUk9SMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19NSVNTSU5HX0VORF9QT0xZR09OID0gR0xVX1RFU1NfRVJST1IzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX01JU1NJTkdfRU5EX0NPTlRPVVIgPSBHTFVfVEVTU19FUlJPUjQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQ09PUkRfVE9PX0xBUkdFID0gR0xVX1RFU1NfRVJST1I1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX05FRURfQ09NQklORV9DQUxMQkFDSyA9IEdMVV9URVNTX0VSUk9SNjsKLQkKLQkvKioqKiAgICAgICAgICAgTlVSQlMgY29uc3RhbnRzICAgICAgICAgICAgICAgICAqKioqLwotCQotCS8qIE51cmJzUHJvcGVydHkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQVVUT19MT0FEX01BVFJJWCA9IDEwMDIwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQ1VMTElORyA9IDEwMDIwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfU0FNUExJTkdfVE9MRVJBTkNFID0gMTAwMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9ESVNQTEFZX01PREUgPSAxMDAyMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1BBUkFNRVRSSUNfVE9MRVJBTkNFID0gMTAwMjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9TQU1QTElOR19NRVRIT0QgPSAxMDAyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1VfU1RFUCA9IDEwMDIwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVl9TVEVQID0gMTAwMjA3OwotCQotCS8qIE51cmJzU2FtcGxpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfUEFUSF9MRU5HVEggPSAxMDAyMTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1BBUkFNRVRSSUNfRVJST1IgPSAxMDAyMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0RPTUFJTl9ESVNUQU5DRSA9IDEwMDIxNzsKLQkKLQkKLQkvKiBOdXJic1RyaW0gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTUFQMV9UUklNXzIgPSAxMDAyMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX01BUDFfVFJJTV8zID0gMTAwMjExOwotCQotCS8qIE51cmJzRGlzcGxheSAqLwotCS8qICAgICAgR0xVX0ZJTEwgICAgICAgICAgICAgICAgMTAwMDEyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVExJTkVfUE9MWUdPTiA9IDEwMDI0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfT1VUTElORV9QQVRDSCA9IDEwMDI0MTsKLQkKLQkvKiBOdXJic0NhbGxiYWNrICovCi0JLyogICAgICBHTFVfRVJST1IgICAgICAgICAgICAgICAxMDAxMDMgKi8KLQkKLQkvKiBOdXJic0Vycm9ycyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEgPSAxMDAyNTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SMiA9IDEwMDI1MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1IzID0gMTAwMjUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjQgPSAxMDAyNTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SNSA9IDEwMDI1NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1I2ID0gMTAwMjU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjcgPSAxMDAyNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SOCA9IDEwMDI1ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1I5ID0gMTAwMjU5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEwID0gMTAwMjYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjExID0gMTAwMjYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEyID0gMTAwMjYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEzID0gMTAwMjYzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE0ID0gMTAwMjY0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE1ID0gMTAwMjY1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE2ID0gMTAwMjY2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE3ID0gMTAwMjY3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE4ID0gMTAwMjY4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE5ID0gMTAwMjY5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIwID0gMTAwMjcwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIxID0gMTAwMjcxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIyID0gMTAwMjcyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIzID0gMTAwMjczOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI0ID0gMTAwMjc0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI1ID0gMTAwMjc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI2ID0gMTAwMjc2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI3ID0gMTAwMjc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI4ID0gMTAwMjc4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI5ID0gMTAwMjc5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMwID0gMTAwMjgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMxID0gMTAwMjgxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMyID0gMTAwMjgyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMzID0gMTAwMjgzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM0ID0gMTAwMjg0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM1ID0gMTAwMjg1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM2ID0gMTAwMjg2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM3ID0gMTAwMjg3OwotCQotCS8qIENvbnRvdXJzIHR5cGVzIC0tIG9ic29sZXRlISAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9DVyA9IDEwMDEyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQ0NXID0gMTAwMTIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9JTlRFUklPUiA9IDEwMDEyMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVhURVJJT1IgPSAxMDAxMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1VOS05PV04gPSAxMDAxMjQ7Ci0JCi0JLyogTmFtZXMgd2l0aG91dCAiVEVTU18iIHByZWZpeCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9CRUdJTiA9IEdMVV9URVNTX0JFR0lOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9WRVJURVggPSBHTFVfVEVTU19WRVJURVg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0VORCA9IEdMVV9URVNTX0VORDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVJST1IgPSBHTFVfVEVTU19FUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRURHRV9GTEFHID0gR0xVX1RFU1NfRURHRV9GTEFHOwotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1QmVnaW5DdXJ2ZSAoaW50IG5vYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RW5kQ3VydmUgKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUJlZ2luUG9seWdvbiAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RW5kUG9seWdvbiAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1QmVnaW5TdXJmYWNlIChpbnQgbm9iaik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVFbmRTdXJmYWNlIChpbnQgbm9iaik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVCZWdpblRyaW0gKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUVuZFRyaW0gKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1QnVpbGQxRE1pcG1hcHMgKGludCB0YXJnZXQsIGludCBjb21wb25lbmV0cywgaW50IHdpZHRoLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50IGRhdGEpOyAvKiBNVUxUSVBMRVMgVFlQRVMgQVJSQVkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1QnVpbGQyRE1pcG1hcHMgKGludCB0YXJnZXQsIGludCBjb21wb25lbmV0cywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgYnl0ZVtdIGRhdGEpOyAvKiBNVUxUSVBMRVMgVFlQRVMgQVJSQVkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUN5bGluZGVyIChpbnQgcW9iaiwgZG91YmxlIGJhc2VSYWRpdXMsIGRvdWJsZSB0b3BSYWRpdXMsIGRvdWJsZSBoZWlnaHQsIGludCBzbGljZXMsIGludCBzdGFja3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlTnVyYnNSZW5kZXJlciAoaW50IG5vYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlUXVhZHJpYyAoaW50IHFvYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlVGVzcyAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGlzayAoaW50IHFvYmosIGRvdWJsZSBpbm5lclJhZGl1cywgZG91YmxlIG91dGVyUmFkaXVzLCBpbnQgc2xpY2VzLCBpbnQgbG9vcHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVFcnJvclN0cmluZyAoaW50IGVyckNvZGUpOyAgLyogU0hPVUxEIFJFVFVSTiBBIFNUUklORyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1R2V0TnVyYnNQcm9wZXJ0eSAoaW50IG5vYmosIGludCBwcm9wZXJ0eSwgZmxvYXRbXSB2YWx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdUdldFN0cmluZyAoaW50IG5hbWUpOyAvKiBTSE9VTEQgUkVUVVJOIEEgU1RSSU5HICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVHZXRUZXNzUHJvcGVydHkgKGludCB0ZXNzLCBpbnQgd2hpY2gsIGRvdWJsZVtdIHZhbHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzIChpbnQgbm9iaiwgZmxvYXRbXSBtb2RlbE1hdHJpeCwgZmxvYXRbXSBwcm9qTWF0cml4LCBpbnRbXSB2aWV3cG9ydCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVMb29rQXQgKGRvdWJsZSBleWV4LCBkb3VibGUgZXlleSwgZG91YmxlIGV5ZXosIGRvdWJsZSBjZW50ZXJ4LCBkb3VibGUgY2VudGVyeSwgZG91YmxlIGNlbnRlcnosIGRvdWJsZSB1cHgsIGRvdWJsZSB1cHksIGRvdWJsZSB1cHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdOdXJic1JlbmRlcmVyICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdRdWFkcmljICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdUZXNzICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1TmV4dENvbnRvdXIgKGludCB0ZXNzLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic0NhbGxiYWNrIChpbnQgbm9iaiwgaW50IHdoaWNoLCBpbnQgZm4pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1TnVyYnNDdXJ2ZSAoaW50IG5vYmosIGludCBua25vdHMsIGZsb2F0W10ga25vdCwgaW50IHN0cmlkZSwgZmxvYXRbXSBjdGxhcnJheSwgaW50IG9yZGVyLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic1Byb3BlcnR5IChpbnQgbm9iaiwgaW50IHByb3BlcnR5LCBmbG9hdCB2YWx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic1N1cmZhY2UgKGludCBub2JqLCBpbnQgc2tub3RfY291bnQsIGZsb2F0W10gc2tub3QsIGludCB0a25vdF9jb3VudCwgZmxvYXRbXSB0a25vdCwgaW50IHNfc3RyaWRlLCBpbnQgdF9zdHJpZGUsIGZsb2F0W10gY3RsYXJyYXksIGludCBzb3JkZXIsIGludCB0b3JkZXIsIGludCB0eXBlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdU9ydGhvMkQgKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sIGRvdWJsZSB0b3ApOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1UGFydGlhbERpc2sgKGludCBxb2JqLCBkb3VibGUgaW5uZXJSYWRpdXMsIGRvdWJsZSBvdXRlclJhZGl1cywgaW50IHNsaWNlcywgaW50IGxvb3BzLCBkb3VibGUgc3RhcnRBbmdsZSwgZG91YmxlIHN3ZWVwQW5nbGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1UGVyc3BlY3RpdmUgKGRvdWJsZSBmb3Z5LCBkb3VibGUgYXNwZWN0LCBkb3VibGUgek5lYXIsIGRvdWJsZSB6RmFyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVBpY2tNYXRyaXggKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBpbnRbXSB2aWV3cG9ydCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdVByb2plY3QgKGRvdWJsZSBvYmp4LCBkb3VibGUgb2JqeSwgZG91YmxlIG9ianosZG91YmxlW10gbW9kZWxNYXRyaXgsIGRvdWJsZVtdIHByb2pNYXRyaXgsIGludFtdIHZpZXdwb3J0LCBkb3VibGVbXSB3aW54LCBkb3VibGVbXSB3aW55LCBkb3VibGVbXSB3aW56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVB3bEN1cnZlIChpbnQgbm9iaiwgaW50IGNvdW50LCBmbG9hdFtdIGFycmF5LCBpbnQgc3RyaWRlLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljQ2FsbGJhY2sgKGludCBxb2JqLCBpbnQgd2hpY2gsIGludCBmbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljRHJhd1N0eWxlIChpbnQgcW9iaiwgaW50IGRyYXdTdHlsZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljTm9ybWFscyAoaW50IHFvYmosIGludCBub3JtYWxzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVF1YWRyaWNPcmllbnRhdGlvbiAoaW50IHFvYmosIGludCBvcmllbnRhdGlvbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljVGV4dHVyZSAoaW50IHFvYmosIGJvb2xlYW4gdGV4dHVyZUNvb3Jkcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdVNjYWxlSW1hZ2UgKGludCBmb3JtYXQsIGludCB3aWR0aGluLCBpbnQgaGVpZ2h0aW4sIGludCB0eXBlaW4sIGludCBkYXRhaW4sIGludCB3aWR0aG91dCwgaW50IGhlaWdodG91dCwgaW50IHR5cGVvdXQsIGludCBkYXRhb3V0KTsgLypNVUxUSVBMRVMgVFlQRVMgQVJSQVlTKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVNwaGVyZSAoaW50IHFvYmosIGRvdWJsZSByYWRpdXMsIGludCBzbGljZXMsIGludCBzdGFja3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1VGVzc0JlZ2luQ29udG91ciAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1VGVzc0VuZENvbnRvdXIgKGludCB0ZXNzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NCZWdpblBvbHlnb24gKGludCB0ZXNzLCBpbnQgcG9seWdvbl9kYXRhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NFbmRQb2x5Z29uIChpbnQgdGVzcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzQ2FsbGJhY2sgKGludCB0ZXNzLCBpbnQgd2hpY2gsIGludCBmbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzTm9ybWFsIChpbnQgdGVzcywgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzUHJvcGVydHkgKGludCB0ZXNzLCBpbnQgcHJvcGVydHksIGRvdWJsZSB2YWx1ZSk7IC8qIENIRUNLIE1TRE4sIFZBTFVFJ1MgVFlQRSBJUyBET1VCTEUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NWZXJ0ZXggKGludCB0ZXNzLCBkb3VibGVbXSBjb29yZHMsIGludCBkYXRhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1VW5Qcm9qZWN0IChkb3VibGUgd2lueCwgZG91YmxlIHdpbnksIGRvdWJsZSB3aW56LCBkb3VibGVbXSBtb2RlbE1hdHJpeCwgZG91YmxlW10gcHJvak1hdHJpeCwgaW50W10gdmlld3BvcnQsIGRvdWJsZVtdIG9iangsIGRvdWJsZVtdIG9ianksIGRvdWJsZVtdIG9ianopOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVmMTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbDsKLQotLyoqCi0gKiBUaGUgR0xEYXRhIGNsYXNzIGlzIGEgZGV2aWNlLWluZGVwZW5kZW50IGRlc2NyaXB0aW9uCi0gKiBvZiB0aGUgcGl4ZWwgZm9ybWF0IGF0dHJpYnV0ZXMgb2YgYSBHTCBkcmF3YWJsZS4KLSAqCi0gKiBAc2VlIEdMQ2FudmFzCi0gKi8KLQotcHVibGljIGNsYXNzIEdMRGF0YSB7Ci0JLyoqCi0JICogU3BlY2lmaWVzIGEgZG91YmxlLWJ1ZmZlcmVkIHN1cmZhY2UuICBEdXJpbmcgY29udGV4dAotCSAqIGNyZWF0aW9uLCBvbmx5IGRvdWJsZS1idWZmZXJlZCBmb3JtYXRzIGFyZSBjb25zaWRlcmVkCi0JICogd2hlbiBzZXQgdG8gdHJ1ZS4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG91YmxlQnVmZmVyOwotCi0JLyoqCi0JICogU3BlY2lmaWVzIGEgc3RlcmVvIHN1cmZhY2UuICBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwKLQkgKiBvbmx5IHN0ZXJlbyBmb3JtYXRzIGFyZSBjb25zaWRlcmVkIHdoZW4gc2V0IHRvIHRydWUuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN0ZXJlbzsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIHJlZCBjaGFubmVsLgotCSAqIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUgbWluaW11bQotCSAqIHJlcXVpcmVkIHJlZCBiaXRzLgotCSAqLwotCXB1YmxpYyBpbnQgcmVkU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGdyZWVuIGNoYW5uZWwuCi0JICogRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZSBtaW5pbXVtCi0JICogcmVxdWlyZWQgZ3JlZW4gYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGJsdWUgY2hhbm5lbC4KLQkgKiBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwgdGhpcyBzcGVjaWZpZXMgdGhlIG1pbmltdW0KLQkgKiByZXF1aXJlZCBibHVlIGJpdHMuCi0JICovCi0JcHVibGljIGludCBibHVlU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGFscGhhIGNoYW5uZWwuCi0JICogRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZSBtaW5pbXVtCi0JICogcmVxdWlyZWQgYWxwaGEgYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFscGhhU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGRlcHRoIGJ1ZmZlci4gIER1cmluZyBjb250ZXh0Ci0JICogY3JlYXRpb24sIHRoZSBzbWFsbGVzdCBkZXB0aCBidWZmZXIgb2YgYXQgbGVhc3QgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGlzIHByZWZlcnJlZCwgb3IgemVybyBmb3Igbm8gZGVwdGgKLQkgKiBidWZmZXIuCi0JICovCi0JcHVibGljIGludCBkZXB0aFNpemU7Ci0KLQkvKioKLQkgKiBUaGUgZGVzaXJlZCBudW1iZXIgb2Ygc3RlbmNpbCBiaXRwbGFuZXMuICBEdXJpbmcKLQkgKiBjb250ZXh0IGNyZWF0aW9uLCB0aGUgc21hbGxlc3Qgc3RlbmNpbCBidWZmZXIgb2YgYXQKLQkgKiBsZWFzdCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHByZWZlcnJlZCwgb3IgemVybyBmb3IKLQkgKiBubyBzdGVuY2lsIGJ1ZmZlci4KLQkgKi8KLQlwdWJsaWMgaW50IHN0ZW5jaWxTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIHJlZAotCSAqIGNoYW5uZWwuIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUKLQkgKiBtaW5pbXVtIHJlcXVpcmVkIHJlZCBiaXRzLgotCSAqLwotCXB1YmxpYyBpbnQgYWNjdW1SZWRTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGdyZWVuCi0JICogY2hhbm5lbC4gRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZQotCSAqIG1pbmltdW0gcmVxdWlyZWQgZ3JlZW4gYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFjY3VtR3JlZW5TaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGJsdWUKLQkgKiBjaGFubmVsLiBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwgdGhpcyBzcGVjaWZpZXMgdGhlCi0JICogbWluaW11bSByZXF1aXJlZCBibHVlIGJpdHMuCi0JICovCi0JcHVibGljIGludCBhY2N1bUJsdWVTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGFscGhhCi0JICogY2hhbm5lbC4gRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZQotCSAqIG1pbmltdW0gcmVxdWlyZWQgYWxwaGEgYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFjY3VtQWxwaGFTaXplOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBtdWx0aXNhbXBsZSBidWZmZXJzIHVzZWQgYnkgdGhpcyBjb250ZXh0LgotCSAqIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUgbWluaW11bQotCSAqIG51bWJlciBvZiBtdWx0aXNhbXBsZSBidWZmZXJzIHJlcXVlc3RlZC4KLQkgKi8KLQlwdWJsaWMgaW50IHNhbXBsZUJ1ZmZlcnM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYWNjZXB0ZWQgaW4gdGhlIG11bHRpc2FtcGxlIGJ1ZmZlci4KLQkgKiBEdXJpbmcgY3JlYXRpb24sIHBpeGVsIGZvcm1hdHMgd2l0aCB0aGUgc21hbGxlc3QgbnVtYmVyIG9mCi0JICogc2FtcGxlcyB0aGF0IG1lZXRzIG9yIGV4Y2VlZHMgdGhlIHNwZWNpZmllZCBtaW5pbXVtIG51bWJlcgotCSAqIGFyZSBwcmVmZXJyZWQuCi0JICovCi0JcHVibGljIGludCBzYW1wbGVzOwotCQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZQotICogZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEKLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gKGRvdWJsZUJ1ZmZlciA/ICJkb3VibGVCdWZmZXIsIiA6ICIiKSArCi0JCShzdGVyZW8gPyAic3RlcmVvLCIgOiAiIikgKwotCQkicjoiICsgcmVkU2l6ZSArICIgZzoiICsgZ3JlZW5TaXplICsgIiBiOiIgKyBibHVlU2l6ZSArICIgYToiICsgYWxwaGFTaXplICsgIiwiICsKLQkJImRlcHRoOiIgKyBkZXB0aFNpemUgKyAiLHN0ZW5jaWw6IiArIHN0ZW5jaWxTaXplICsKLQkJIixhY2N1bSByOiIgKyBhY2N1bVJlZFNpemUgKyAiZzoiICsgYWNjdW1HcmVlblNpemUgKyAiYjoiICsgYWNjdW1CbHVlU2l6ZSArICJhOiIgKyBhY2N1bUFscGhhU2l6ZSArCi0JCSIsc2FtcGxlQnVmZmVyczoiICsgc2FtcGxlQnVmZmVycyArICIsc2FtcGxlczoiICsgc2FtcGxlczsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9JbWFnZURhdGFVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvSW1hZ2VEYXRhVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDY5MDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9JbWFnZURhdGFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLQotCi1wdWJsaWMgY2xhc3MgSW1hZ2VEYXRhVXRpbCB7Ci0JLyoqCi0JICogQWxwaGEgbW9kZSwgdmFsdWVzIDAgLSAyNTUgc3BlY2lmeSBnbG9iYWwgYWxwaGEgbGV2ZWwKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUFMUEhBX09QQVFVRSA9IDI1NSwgICAgICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQkJQUxQSEFfVFJBTlNQQVJFTlQgPSAwLCAgICAgICAgLy8gRnVsbHkgdHJhbnNwYXJlbnQgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JCUFMUEhBX0NIQU5ORUxfU0VQQVJBVEUgPSAtMSwgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGZyb20gc2VwYXJhdGUgYWxwaGFEYXRhCi0JCUFMUEhBX0NIQU5ORUxfU09VUkNFID0gLTIsICAgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGVtYmVkZGVkIGluIHNvdXJjZURhdGEKLQkJQUxQSEFfTUFTS19VTlBBQ0tFRCA9IC0zLCAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBieXRlcyBpbiBhbHBoYURhdGEgKG5vbi16ZXJvIGlzIG9wYXF1ZSkKLQkJQUxQSEFfTUFTS19QQUNLRUQgPSAtNCwgICAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBwYWNrZWQgYml0cyBpbiBhbHBoYURhdGEKLQkJQUxQSEFfTUFTS19JTkRFWCA9IC01LCAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIHBhbGV0dGUgaW5kaWNlcyB0cmFuc3BhcmVudCBpZiBpbiBhbHBoYURhdGEgYXJyYXkKLQkJQUxQSEFfTUFTS19SR0IgPSAtNjsgICAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIFJHQnMgdHJhbnNwYXJlbnQgaWYgaW4gUkdCODg4IGZvcm1hdCBhbHBoYURhdGEgYXJyYXkKLQkJCi0JLyoqCi0JICogRGF0YSB0eXBlcyAoaW50ZXJuYWwpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCQlUWVBFX0dFTkVSSUNfOCA9IDAsCi0JCVRZUEVfR0VORVJJQ18xNl9NU0IgPSAxLAotCQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQkJVFlQRV9HRU5FUklDXzI0ID0gMywKLQkJVFlQRV9HRU5FUklDXzMyX01TQiA9IDQsCi0JCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1LAotCQkvLyBwYWxldHRlIGluZGV4ZWQgY29sb3IgZm9ybWF0cwotCQlUWVBFX0lOREVYXzggPSA2LAotCQlUWVBFX0lOREVYXzQgPSA3LAotCQlUWVBFX0lOREVYXzIgPSA4LAotCQlUWVBFX0lOREVYXzFfTVNCID0gOSwKLQkJVFlQRV9JTkRFWF8xX0xTQiA9IDEwOwotCQkKLQkvKioKLQkgKiBCeXRlIGFuZCBiaXQgb3JkZXIgY29uc3RhbnRzLgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgTFNCX0ZJUlNUID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1TQl9GSVJTVCA9IDE7Ci0JCi0JLyoqCi0JICogQmxpdCBvcGVyYXRpb24gYml0cyB0byBiZSBPUidlZCB0b2dldGhlciB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIG9wZXJhdGlvbi4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUJMSVRfU1JDID0gMSwgICAgIC8vIGNvcHkgc291cmNlIGRpcmVjdGx5LCBlbHNlIGFwcGxpZXMgbG9naWMgb3BlcmF0aW9ucwotCQlCTElUX0FMUEhBID0gMiwgICAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcKLQkJQkxJVF9ESVRIRVIgPSA0OyAgLy8gZW5hYmxlIGRpdGhlcmluZyBpbiBsb3cgY29sb3IgbW9kZXMKLQkJCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+Pj0gYikgIT0gMDspIGluYyB8PSBiaXQ7Ci0JCQlmb3IgKGludCB2ID0gMCwgcCA9IDA7IHYgPCAweDEwMDAwOyB2Kz0gaW5jKSBkYXRhW3ArK10gPSAoYnl0ZSkodiA+PiA4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJsaXRzIGEgZGlyZWN0IHBhbGV0dGUgaW1hZ2UgaW50byBhIGRpcmVjdCBwYWxldHRlIGltYWdlLgotCSAqIDxwPgotCSAqIE5vdGU6IFdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGVwdGgsIG9yZGVyIGFuZCBtYXNrcwotCSAqIGFyZSBwYWlyd2lzZSBlcXVhbCBhbmQgdGhlIGJsaXR0ZXIgb3BlcmF0aW9uIGlzIEJMSVRfU1JDLAotCSAqIHRoZSBtYXNrcyBhcmUgaWdub3JlZC4gIEhlbmNlIHdoZW4gbm90IGNoYW5naW5nIHRoZSBpbWFnZQotCSAqIGRhdGEgZm9ybWF0LCAwIG1heSBiZSBzcGVjaWZpZWQgZm9yIHRoZSBtYXNrcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wIHRoZSBibGl0dGVyIG9wZXJhdGlvbjogYSBjb21iaW5hdGlvbiBvZiBCTElUX3h4eCBmbGFncwotCSAqICAgICAgICAoc2VlIEJMSVRfeHh4IGNvbnN0YW50cykKLQkgKiBAcGFyYW0gc3JjRGF0YSB0aGUgc291cmNlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIHNyY0RlcHRoIHRoZSBzb3VyY2UgZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc291cmNlIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBzcmNPcmRlciB0aGUgc291cmNlIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIHNyY0RlcHRoIGlzIG5vdCAxNiBvciAzMgotCSAqIEBwYXJhbSBzcmNYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1dpZHRoIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY0hlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjUmVkTWFzayB0aGUgc291cmNlIHJlZCBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gc3JjR3JlZW5NYXNrIHRoZSBzb3VyY2UgZ3JlZW4gY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIHNyY0JsdWVNYXNrIHRoZSBzb3VyY2UgYmx1ZSBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gYWxwaGFNb2RlIHRoZSBhbHBoYSBibGVuZGluZyBvciBtYXNrIG1vZGUsIG1heSBiZQotCSAqICAgICAgICBhbiBpbnRlZ2VyIDAtMjU1IGZvciBnbG9iYWwgYWxwaGE7IGlnbm9yZWQgaWYgQkxJVF9BTFBIQQotCSAqICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBibGl0dGVyIG9wZXJhdGlvbnMKLQkgKiAgICAgICAgKHNlZSBBTFBIQV9NT0RFX3h4eCBjb25zdGFudHMpCi0JICogQHBhcmFtIGFscGhhRGF0YSB0aGUgYWxwaGEgYmxlbmRpbmcgb3IgbWFzayBkYXRhLCB2YXJpZXMgZGVwZW5kaW5nCi0JICogICAgICAgIG9uIHRoZSB2YWx1ZSBvZiBhbHBoYU1vZGUgYW5kIHNvbWV0aW1lcyBpZ25vcmVkCi0JICogQHBhcmFtIGFscGhhU3RyaWRlIHRoZSBhbHBoYSBkYXRhIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBhbHBoYVggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGFscGhhIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGFscGhhWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgYWxwaGEgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdERhdGEgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIGRlc3REZXB0aCB0aGUgZGVzdGluYXRpb24gZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIGRlc3RTdHJpZGUgdGhlIGRlc3RpbmF0aW9uIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBkZXN0T3JkZXIgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIGRlc3REZXB0aCBpcyBub3QgMTYgb3IgMzIKLQkgKiBAcGFyYW0gZGVzdFggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RZIHRoZSB0b3AtbGVmdCB5LWNvb3JkIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0SGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RSZWRNYXNrIHRoZSBkZXN0aW5hdGlvbiByZWQgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGRlc3RHcmVlbk1hc2sgdGhlIGRlc3RpbmF0aW9uIGdyZWVuIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBkZXN0Qmx1ZU1hc2sgdGhlIGRlc3RpbmF0aW9uIGJsdWUgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGZsaXBYIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzCi0JICogQHBhcmFtIGZsaXBZIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMKLQkgKi8KLQlzdGF0aWMgdm9pZCBibGl0KGludCBvcCwKLQkJYnl0ZVtdIHNyY0RhdGEsIGludCBzcmNEZXB0aCwgaW50IHNyY1N0cmlkZSwgaW50IHNyY09yZGVyLAotCQlpbnQgc3JjWCwgaW50IHNyY1ksIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKLQkJaW50IHNyY1JlZE1hc2ssIGludCBzcmNHcmVlbk1hc2ssIGludCBzcmNCbHVlTWFzaywKLQkJaW50IGFscGhhTW9kZSwgYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhU3RyaWRlLCBpbnQgYWxwaGFYLCBpbnQgYWxwaGFZLAotCQlieXRlW10gZGVzdERhdGEsIGludCBkZXN0RGVwdGgsIGludCBkZXN0U3RyaWRlLCBpbnQgZGVzdE9yZGVyLAotCQlpbnQgZGVzdFgsIGludCBkZXN0WSwgaW50IGRlc3RXaWR0aCwgaW50IGRlc3RIZWlnaHQsCi0JCWludCBkZXN0UmVkTWFzaywgaW50IGRlc3RHcmVlbk1hc2ssIGludCBkZXN0Qmx1ZU1hc2ssCi0JCWJvb2xlYW4gZmxpcFgsIGJvb2xlYW4gZmxpcFkpIHsKLQkJaWYgKChkZXN0V2lkdGggPD0gMCkgfHwgKGRlc3RIZWlnaHQgPD0gMCkgfHwgKGFscGhhTW9kZSA9PSBBTFBIQV9UUkFOU1BBUkVOVCkpIHJldHVybjsKLQotCQkvLyB0aGVzZSBzaG91bGQgYmUgc3VwcGxpZWQgYXMgcGFyYW1zIGxhdGVyCi0JCWZpbmFsIGludCBzcmNBbHBoYU1hc2sgPSAwLCBkZXN0QWxwaGFNYXNrID0gMDsKLQotCQkvKioqIFByZXBhcmUgc2NhbGluZyBkYXRhICoqKi8KLQkJZmluYWwgaW50IGR3bTEgPSBkZXN0V2lkdGggLSAxOwotCQlmaW5hbCBpbnQgc2Z4aSA9IChkd20xICE9IDApID8gKGludCkoKCgobG9uZylzcmNXaWR0aCA8PCAxNikgLSAxKSAvIGR3bTEpIDogMDsKLQkJZmluYWwgaW50IGRobTEgPSBkZXN0SGVpZ2h0IC0gMTsKLQkJZmluYWwgaW50IHNmeWkgPSAoZGhtMSAhPSAwKSA/IChpbnQpKCgoKGxvbmcpc3JjSGVpZ2h0IDw8IDE2KSAtIDEpIC8gZGhtMSkgOiAwOwotCi0JCS8qKiogUHJlcGFyZSBzb3VyY2UtcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IHNicHAsIHN0eXBlOwotCQlzd2l0Y2ggKHNyY0RlcHRoKSB7Ci0JCQljYXNlIDg6Ci0JCQkJc2JwcCA9IDE7Ci0JCQkJc3R5cGUgPSBUWVBFX0dFTkVSSUNfODsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJc2JwcCA9IDI7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18xNl9NU0IgOiBUWVBFX0dFTkVSSUNfMTZfTFNCOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlzYnBwID0gMzsKLQkJCQlzdHlwZSA9IFRZUEVfR0VORVJJQ18yNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJc2JwcCA9IDQ7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc291cmNlIHR5cGUiKTsKLQkJCQlyZXR1cm47Ci0JCX0JCQkKLQkJaW50IHNwciA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYICogc2JwcDsKLQotCQkvKioqIFByZXBhcmUgZGVzdGluYXRpb24tcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IGRicHAsIGR0eXBlOwotCQlzd2l0Y2ggKGRlc3REZXB0aCkgewotCQkJY2FzZSA4OgotCQkJCWRicHAgPSAxOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWRicHAgPSAyOwotCQkJCWR0eXBlID0gKGRlc3RPcmRlciA9PSBNU0JfRklSU1QpID8gVFlQRV9HRU5FUklDXzE2X01TQiA6IFRZUEVfR0VORVJJQ18xNl9MU0I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJCWRicHAgPSAzOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzI0OwotCQkJCWJyZWFrOwotCQkJY2FzZSAzMjoKLQkJCQlkYnBwID0gNDsKLQkJCQlkdHlwZSA9IChkZXN0T3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGVzdGluYXRpb24gdHlwZSIpOwotCQkJCXJldHVybjsKLQkJfQkJCQotCQlpbnQgZHByID0gKChmbGlwWSkgPyBkZXN0WSArIGRobTEgOiBkZXN0WSkgKiBkZXN0U3RyaWRlICsgKChmbGlwWCkgPyBkZXN0WCArIGR3bTEgOiBkZXN0WCkgKiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeGkgPSAoZmxpcFgpID8gLWRicHAgOiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeWkgPSAoZmxpcFkpID8gLWRlc3RTdHJpZGUgOiBkZXN0U3RyaWRlOwotCi0JCS8qKiogUHJlcGFyZSBzcGVjaWFsIHByb2Nlc3NpbmcgZGF0YSAqKiovCi0JCWludCBhcHI7Ci0JCWlmICgob3AgJiBCTElUX0FMUEhBKSAhPSAwKSB7Ci0JCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCWNhc2UgQUxQSEFfTUFTS19VTlBBQ0tFRDoKLQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYXByID0gYWxwaGFZICogYWxwaGFTdHJpZGUgKyBhbHBoYVg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUxQSEFfTUFTS19QQUNLRUQ6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYWxwaGFTdHJpZGUgPDw9IDM7Ci0JCQkJCWFwciA9IGFscGhhWSAqIGFscGhhU3RyaWRlICsgYWxwaGFYOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMUEhBX01BU0tfSU5ERVg6Ci0JCQkJCS8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhbHBoYSB0eXBlIik7Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWFscGhhTW9kZSA9IChhbHBoYU1vZGUgPDwgMTYpIC8gMjU1OyAvLyBwcmVzY2FsZQotCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCWFwciA9IDA7Ci0JCX0KLQotCQkvKioqIEJsaXQgKioqLwotCQlpbnQgZHAgPSBkcHI7Ci0JCWludCBzcCA9IHNwcjsKLQkJaWYgKChhbHBoYU1vZGUgPT0gMHgxMDAwMCkgJiYgKHN0eXBlID09IGR0eXBlKSAmJgotCQkJKHNyY1JlZE1hc2sgPT0gZGVzdFJlZE1hc2spICYmIChzcmNHcmVlbk1hc2sgPT0gZGVzdEdyZWVuTWFzaykgJiYKLQkJCShzcmNCbHVlTWFzayA9PSBkZXN0Qmx1ZU1hc2spICYmIChzcmNBbHBoYU1hc2sgPT0gZGVzdEFscGhhTWFzaykpIHsKLQkJCS8qKiogRmFzdCBibGl0IChzdHJhaWdodCBjb3B5KSAqKiovCi0JCQlzd2l0Y2ggKHNicHApIHsKLQkJCQljYXNlIDE6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQljYXNlIDI6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gc3JjRGF0YVtzcCArIDFdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgM10gPSBzcmNEYXRhW3NwICsgM107Ci0JCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvKioqIENvbXByZWhlbnNpdmUgYmxpdCAoYXBwbHkgdHJhbnNmb3JtYXRpb25zKSAqKiovCi0JCWZpbmFsIGludCBzcmNSZWRTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNSZWRNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY1JlZHMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY1JlZE1hc2ssIHNyY1JlZFNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNHcmVlblNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0dyZWVuTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNHcmVlbnMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0dyZWVuTWFzaywgc3JjR3JlZW5TaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjQmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0JsdWVNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY0JsdWVzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNCbHVlTWFzaywgc3JjQmx1ZVNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNBbHBoYVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0FscGhhTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNBbHBoYXMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0FscGhhTWFzaywgc3JjQWxwaGFTaGlmdCldOwotCi0JCWZpbmFsIGludCBkZXN0UmVkU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdFJlZE1hc2spOwotCQlmaW5hbCBpbnQgZGVzdFJlZFdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RSZWRNYXNrLCBkZXN0UmVkU2hpZnQpOwotCQlmaW5hbCBieXRlW10gZGVzdFJlZHMgPSBBTllfVE9fRUlHSFRbZGVzdFJlZFdpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RSZWRQcmVTaGlmdCA9IDggLSBkZXN0UmVkV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0R3JlZW5TaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0R3JlZW5NYXNrKTsKLQkJZmluYWwgaW50IGRlc3RHcmVlbldpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RHcmVlbk1hc2ssIGRlc3RHcmVlblNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RHcmVlbnMgPSBBTllfVE9fRUlHSFRbZGVzdEdyZWVuV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEdyZWVuUHJlU2hpZnQgPSA4IC0gZGVzdEdyZWVuV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KGRlc3RCbHVlTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RCbHVlTWFzaywgZGVzdEJsdWVTaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0Qmx1ZXMgPSBBTllfVE9fRUlHSFRbZGVzdEJsdWVXaWR0aF07Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVByZVNoaWZ0ID0gOCAtIGRlc3RCbHVlV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0QWxwaGFTaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0QWxwaGFNYXNrKTsKLQkJZmluYWwgaW50IGRlc3RBbHBoYVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RBbHBoYU1hc2ssIGRlc3RBbHBoYVNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RBbHBoYXMgPSBBTllfVE9fRUlHSFRbZGVzdEFscGhhV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEFscGhhUHJlU2hpZnQgPSA4IC0gZGVzdEFscGhhV2lkdGg7Ci0KLQkJaW50IGFwID0gYXByLCBhbHBoYSA9IGFscGhhTW9kZTsKLQkJaW50IHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOwotCQlpbnQgcnEgPSAwLCBncSA9IDAsIGJxID0gMCwgYXEgPSAwOwotCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwKLQkJCQlzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsCi0JCQkJYXAgPSBhcHIgKz0gKHNmeSA+Pj4gMTYpICogYWxwaGFTdHJpZGUsCi0JCQkJc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLAotCQkJCWRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LAotCQkJCQlkcCArPSBkcHJ4aSwKLQkJCQkJc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJLyoqKiBSRUFEIE5FWFQgUElYRUwgKioqLwotCQkJCXN3aXRjaCAoc3R5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSBzcmNEYXRhW3NwXSAmIDB4ZmY7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMjsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3BdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAyOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAzOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcF0gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCX0KLQotCQkJCS8qKiogRE8gU1BFQ0lBTCBQUk9DRVNTSU5HIElGIFJFUVVJUkVEICoqKi8KLQkJCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCQlhbHBoYSA9ICgoYWxwaGFEYXRhW2FwXSAmIDB4ZmYpIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWFwICs9IChzZnggPj4gMTYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCQlhbHBoYSA9IChhIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfVU5QQUNLRUQ6Ci0JCQkJCQlhbHBoYSA9IChhbHBoYURhdGFbYXBdICE9IDApID8gMHgxMDAwMCA6IDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQljYXNlIEFMUEhBX01BU0tfUEFDS0VEOgotCQkJCQkJYWxwaGEgPSAoYWxwaGFEYXRhW2FwID4+IDNdIDw8ICgoYXAgJiA3KSArIDkpKSAmIDB4MTAwMDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQkJYWxwaGEgPSAweDEwMDAwOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpICs9IDMpIHsKLQkJCQkJCQlpZiAoKHIgPT0gYWxwaGFEYXRhW2ldKSAmJiAoZyA9PSBhbHBoYURhdGFbaSArIDFdKSAmJiAoYiA9PSBhbHBoYURhdGFbaSArIDJdKSkgewotCQkJCQkJCQlhbHBoYSA9IDB4MDAwMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhbHBoYSAhPSAweDEwMDAwKSB7Ci0JCQkJCWlmIChhbHBoYSA9PSAweDAwMDApIGNvbnRpbnVlOwotCQkJCQlzd2l0Y2ggKGR0eXBlKSB7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ184OiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSBkZXN0RGF0YVtkcF0gJiAweGZmOwotCQkJCQkJCXJxID0gZGVzdFJlZHNbKGRhdGEgJiBkZXN0UmVkTWFzaykgPj4+IGRlc3RSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJCWdxID0gZGVzdEdyZWVuc1soZGF0YSAmIGRlc3RHcmVlbk1hc2spID4+PiBkZXN0R3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJCWJxID0gZGVzdEJsdWVzWyhkYXRhICYgZGVzdEJsdWVNYXNrKSA+Pj4gZGVzdEJsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJCWFxID0gZGVzdEFscGhhc1soZGF0YSAmIGRlc3RBbHBoYU1hc2spID4+PiBkZXN0QWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQkJfSBicmVhazsKLQkJCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcCArIDFdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9NU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgM10gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHAgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLy8gUGVyZm9ybSBhbHBoYSBibGVuZGluZwotCQkJCQlhID0gYXEgKyAoKGEgLSBhcSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJCXIgPSBycSArICgociAtIHJxKSAqIGFscGhhID4+IDE2KTsKLQkJCQkJZyA9IGdxICsgKChnIC0gZ3EpICogYWxwaGEgPj4gMTYpOwotCQkJCQliID0gYnEgKyAoKGIgLSBicSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJfQotCi0JCQkJLyoqKiBXUklURSBORVhUIFBJWEVMICoqKi8KLQkJCQlmaW5hbCBpbnQgZGF0YSA9IAotCQkJCQkociA+Pj4gZGVzdFJlZFByZVNoaWZ0IDw8IGRlc3RSZWRTaGlmdCkgfAotCQkJCQkoZyA+Pj4gZGVzdEdyZWVuUHJlU2hpZnQgPDwgZGVzdEdyZWVuU2hpZnQpIHwKLQkJCQkJKGIgPj4+IGRlc3RCbHVlUHJlU2hpZnQgPDwgZGVzdEJsdWVTaGlmdCkgfAotCQkJCQkoYSA+Pj4gZGVzdEFscGhhUHJlU2hpZnQgPDwgZGVzdEFscGhhU2hpZnQpOwotCQkJCXN3aXRjaCAoZHR5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIGRhdGE7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgPj4+IDI0KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDE2KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAzXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDNdID0gKGJ5dGUpIChkYXRhID4+PiAyNCk7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgc2hpZnQgZnJvbSBhIG1hc2suCi0JICovCi0Jc3RhdGljIGludCBnZXRDaGFubmVsU2hpZnQoaW50IG1hc2spIHsKLQkJaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyAoKG1hc2sgJiAxKSA9PSAwKSAmJiAoaSA8IDMyKTsgKytpKSB7Ci0JCQltYXNrID4+Pj0gMTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgd2lkdGggKGRlcHRoKSBmcm9tIGEgbWFzay4KLQkgKi8KLQlzdGF0aWMgaW50IGdldENoYW5uZWxXaWR0aChpbnQgbWFzaywgaW50IHNoaWZ0KSB7Ci0JCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCQlpbnQgaTsKLQkJbWFzayA+Pj49IHNoaWZ0OwotCQlmb3IgKGkgPSBzaGlmdDsgKChtYXNrICYgMSkgIT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQkJbWFzayA+Pj49IDE7Ci0JCX0KLQkJcmV0dXJuIGkgLSBzaGlmdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0KLQkJSW1hZ2VEYXRhVXRpbC5ibGl0ICgKLQkJCTEsCi0JCQlzb3VyY2UuZGF0YSwKLQkJCXNvdXJjZS5kZXB0aCwKLQkJCXNvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkoc291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJc291cmNlLndpZHRoLAotCQkJc291cmNlLmhlaWdodCwKLQkJCXNvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCTI1NSwKLQkJCW51bGwsCi0JCQkwLAotCQkJMCwKLQkJCTAsCi0JCQluZXdTb3VyY2UuZGF0YSwKLQkJCW5ld1NvdXJjZS5kZXB0aCwKLQkJCW5ld1NvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkobmV3U291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLndpZHRoLAotCQkJbmV3U291cmNlLmhlaWdodCwKLQkJCW5ld1NvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCWZhbHNlLAotCQkJdHJ1ZSk7Ci0KLQkJcmV0dXJuIG5ld1NvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvTGlicmFyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NjdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIExpYnJhcnkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbG9hZExpYnJhcnkgKFN0cmluZyBuYW1lKSB7Ci0JU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtICgpOwkKLQl0cnkgewotCQlTdHJpbmcgbmV3TmFtZSA9IG5hbWUgKyAnLScgKyBwbGF0Zm9ybTsKLQkJU3lzdGVtLmxvYWRMaWJyYXJ5IChuZXdOYW1lKTsKLQkJcmV0dXJuOwotCX0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUxKSB7CQkKLQkJdGhyb3cgZTE7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2J1aWxkLnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzI2ZDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotaWYgWyAiJHtPU30iID0gIiIgXTsgdGhlbgotCU9TPWB1bmFtZSAtc2AKLWZpCi0KLWNhc2UgJE9TIGluCi0JIkxpbnV4IikKLQkJbWFrZWZpbGU9Im1ha2VfbGludXgubWFrIgotCQllY2hvICJCdWlsZGluZyBMaW51eCBHVEsgdmVyc2lvbiBvZiBTV1QgT3BlbkdMIgotCQk7OwotCSopCi0JCWVjaG8gIioqKiBVbmtub3duIE9TIDwke09TfT4iCi0JCTs7Ci1lc2FjCi0KLWV4cG9ydCBKQVZBX0hPTUUKLQotbWFrZSAtZiAkbWFrZWZpbGUgJHsxKyIkQCJ9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjE1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0cnVjdHMuaCIKLSNpbmNsdWRlICJnbHhfc3RhdHMuaCIKLQotI2RlZmluZSBHTFhfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF9ndGtfR0xYXyMjZnVuYwotCi0jaWZuZGVmIE5PX2dsWENob29zZVZpc3VhbAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWENob29zZVZpc3VhbCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamludCByYyA9IDA7Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWENob29zZVZpc3VhbF9GVU5DKTsKLQlpZiAoYXJnMikgaWYgKChscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCXJjID0gKGppbnQpZ2xYQ2hvb3NlVmlzdWFsKGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ2hvb3NlVmlzdWFsX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWENvcHlDb250ZXh0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYQ29weUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhDb3B5Q29udGV4dF9GVU5DKTsKLQlnbFhDb3B5Q29udGV4dChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhDb3B5Q29udGV4dF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWENyZWF0ZUNvbnRleHQKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xYX05BVElWRShnbFhDcmVhdGVDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgam9iamVjdCBhcmcxLCBqaW50IGFyZzIsIGpib29sZWFuIGFyZzMpCi17Ci0JWFZpc3VhbEluZm8gX2FyZzEsICpscGFyZzE9TlVMTDsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYQ3JlYXRlQ29udGV4dF9GVU5DKTsKLQlpZiAoYXJnMSkgaWYgKChscGFyZzEgPSBnZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsICZfYXJnMSkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWdsWENyZWF0ZUNvbnRleHQoYXJnMCwgbHBhcmcxLCBhcmcyLCBhcmczKTsKLWZhaWw6Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ3JlYXRlQ29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhDcmVhdGVHTFhQaXhtYXAKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xYX05BVElWRShnbFhDcmVhdGVHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMikKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhDcmVhdGVHTFhQaXhtYXBfRlVOQyk7Ci0JaWYgKGFyZzEpIGlmICgobHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JcmMgPSAoamludClnbFhDcmVhdGVHTFhQaXhtYXAoYXJnMCwgbHBhcmcxLCBhcmcyKTsKLWZhaWw6Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ3JlYXRlR0xYUGl4bWFwX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWERlc3Ryb3lDb250ZXh0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYRGVzdHJveUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWERlc3Ryb3lDb250ZXh0X0ZVTkMpOwotCWdsWERlc3Ryb3lDb250ZXh0KGFyZzAsIGFyZzEpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWERlc3Ryb3lDb250ZXh0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYRGVzdHJveUdMWFBpeG1hcAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWERlc3Ryb3lHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWERlc3Ryb3lHTFhQaXhtYXBfRlVOQyk7Ci0JZ2xYRGVzdHJveUdMWFBpeG1hcChhcmcwLCBhcmcxKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhEZXN0cm95R0xYUGl4bWFwX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYR2V0Q2xpZW50U3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYR2V0Q2xpZW50U3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDbGllbnRTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDbGllbnRTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYR2V0Q2xpZW50U3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldENvbmZpZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWEdldENvbmZpZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpvYmplY3QgYXJnMSwgamludCBhcmcyLCBqaW50QXJyYXkgYXJnMykKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgKmxwYXJnMz1OVUxMOwotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDb25maWdfRlVOQyk7Ci0JaWYgKGFyZzEpIGlmICgobHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JaWYgKGFyZzMpIGlmICgobHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWdsWEdldENvbmZpZyhhcmcwLCBscGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci1mYWlsOgotCWlmIChhcmczICYmIGxwYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYR2V0Q29uZmlnX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldEN1cnJlbnRDb250ZXh0Ci1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYR2V0Q3VycmVudENvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYR2V0Q3VycmVudENvbnRleHRfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDdXJyZW50Q29udGV4dCgpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWEdldEN1cnJlbnRDb250ZXh0X0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldEN1cnJlbnREcmF3YWJsZQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWEdldEN1cnJlbnREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDdXJyZW50RHJhd2FibGUoKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYSXNEaXJlY3QKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYSXNEaXJlY3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhJc0RpcmVjdF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilnbFhJc0RpcmVjdChhcmcwLCBhcmcxKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhJc0RpcmVjdF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhNYWtlQ3VycmVudAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgR0xYX05BVElWRShnbFhNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCWpib29sZWFuIHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYTWFrZUN1cnJlbnRfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pZ2xYTWFrZUN1cnJlbnQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYTWFrZUN1cnJlbnRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYUXVlcnlFeHRlbnNpb24KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhRdWVyeUV4dGVuc2lvbl9GVU5DKTsKLQlpZiAoYXJnMSkgaWYgKChscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCWlmIChhcmcyKSBpZiAoKGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JcmMgPSAoamJvb2xlYW4pZ2xYUXVlcnlFeHRlbnNpb24oYXJnMCwgbHBhcmcxLCBscGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMiAmJiBscGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCWlmIChhcmcxICYmIGxwYXJnMSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlFeHRlbnNpb25fRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWFF1ZXJ5U2VydmVyU3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhRdWVyeVNlcnZlclN0cmluZyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhRdWVyeVNlcnZlclN0cmluZ19GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhRdWVyeVZlcnNpb24KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlWZXJzaW9uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMT1OVUxMOwotCWppbnQgKmxwYXJnMj1OVUxMOwotCWpib29sZWFuIHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYUXVlcnlWZXJzaW9uX0ZVTkMpOwotCWlmIChhcmcxKSBpZiAoKGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqYm9vbGVhbilnbFhRdWVyeVZlcnNpb24oYXJnMCwgbHBhcmcxLCBscGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMiAmJiBscGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCWlmIChhcmcxICYmIGxwYXJnMSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlWZXJzaW9uX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWFN3YXBCdWZmZXJzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYU3dhcEJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFN3YXBCdWZmZXJzX0ZVTkMpOwotCWdsWFN3YXBCdWZmZXJzKGFyZzAsIGFyZzEpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWFN3YXBCdWZmZXJzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYVXNlWEZvbnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xYX05BVElWRShnbFhVc2VYRm9udCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFVzZVhGb250X0ZVTkMpOwotCWdsWFVzZVhGb250KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWFVzZVhGb250X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYV2FpdEdMCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYV2FpdEdMKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFdhaXRHTF9GVU5DKTsKLQlnbFhXYWl0R0woKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhXYWl0R0xfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhXYWl0WAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWFdhaXRYKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFdhaXRYX0ZVTkMpOwotCWdsWFdhaXRYKCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYV2FpdFhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19tZW1tb3ZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUobWVtbW92ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCVhWaXN1YWxJbmZvIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIG1lbW1vdmVfRlVOQyk7Ci0JaWYgKGFyZzApIGlmICgobHBhcmcwID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcwLCAmX2FyZzApKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JbWVtbW92ZShscGFyZzAsIGFyZzEsIGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMCAmJiBscGFyZzApIHNldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMCwgbHBhcmcwKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBtZW1tb3ZlX0ZVTkMpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHguaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyOWVlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotI2luY2x1ZGUgPEdML2dseC5oPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTFkMTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHhfc3RhdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMWF9uYXRpdmVGdW5jdGlvbkNvdW50ID0gMjE7Ci1pbnQgR0xYX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WzIxXTsKLWNoYXIgKiBHTFhfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0gewotCSJnbFhDaG9vc2VWaXN1YWwiLAotCSJnbFhDb3B5Q29udGV4dCIsCi0JImdsWENyZWF0ZUNvbnRleHQiLAotCSJnbFhDcmVhdGVHTFhQaXhtYXAiLAotCSJnbFhEZXN0cm95Q29udGV4dCIsCi0JImdsWERlc3Ryb3lHTFhQaXhtYXAiLAotCSJnbFhHZXRDbGllbnRTdHJpbmciLAotCSJnbFhHZXRDb25maWciLAotCSJnbFhHZXRDdXJyZW50Q29udGV4dCIsCi0JImdsWEdldEN1cnJlbnREcmF3YWJsZSIsCi0JImdsWElzRGlyZWN0IiwKLQkiZ2xYTWFrZUN1cnJlbnQiLAotCSJnbFhRdWVyeUV4dGVuc2lvbiIsCi0JImdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyIsCi0JImdsWFF1ZXJ5U2VydmVyU3RyaW5nIiwKLQkiZ2xYUXVlcnlWZXJzaW9uIiwKLQkiZ2xYU3dhcEJ1ZmZlcnMiLAotCSJnbFhVc2VYRm9udCIsCi0JImdsWFdhaXRHTCIsCi0JImdsWFdhaXRYIiwKLQkibWVtbW92ZSIsCi19OwotCi0jZGVmaW5lIFNUQVRTX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX3N3dF90b29sc19pbnRlcm5hbF9OYXRpdmVTdGF0c18jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoR0xYXzFHZXRGdW5jdGlvbkNvdW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JcmV0dXJuIEdMWF9uYXRpdmVGdW5jdGlvbkNvdW50OwotfQotCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRShHTFhfMUdldEZ1bmN0aW9uTmFtZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KQotewotCXJldHVybiAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIEdMWF9uYXRpdmVGdW5jdGlvbk5hbWVzW2luZGV4XSk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKEdMWF8xR2V0RnVuY3Rpb25DYWxsQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gR0xYX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2luZGV4XTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0YXRzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0YXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzE2OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLWV4dGVybiBpbnQgR0xYX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Ci1leHRlcm4gaW50IEdMWF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOwotZXh0ZXJuIGNoYXIqIEdMWF9uYXRpdmVGdW5jdGlvbk5hbWVzW107Ci0jZGVmaW5lIEdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBmdW5jKSBHTFhfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbZnVuY10rKzsKLSNkZWZpbmUgR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZnVuYykgCi0jZWxzZQotI2RlZmluZSBHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgCi0jZGVmaW5lIEdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JZ2xYQ2hvb3NlVmlzdWFsX0ZVTkMsCi0JZ2xYQ29weUNvbnRleHRfRlVOQywKLQlnbFhDcmVhdGVDb250ZXh0X0ZVTkMsCi0JZ2xYQ3JlYXRlR0xYUGl4bWFwX0ZVTkMsCi0JZ2xYRGVzdHJveUNvbnRleHRfRlVOQywKLQlnbFhEZXN0cm95R0xYUGl4bWFwX0ZVTkMsCi0JZ2xYR2V0Q2xpZW50U3RyaW5nX0ZVTkMsCi0JZ2xYR2V0Q29uZmlnX0ZVTkMsCi0JZ2xYR2V0Q3VycmVudENvbnRleHRfRlVOQywKLQlnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQywKLQlnbFhJc0RpcmVjdF9GVU5DLAotCWdsWE1ha2VDdXJyZW50X0ZVTkMsCi0JZ2xYUXVlcnlFeHRlbnNpb25fRlVOQywKLQlnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfRlVOQywKLQlnbFhRdWVyeVNlcnZlclN0cmluZ19GVU5DLAotCWdsWFF1ZXJ5VmVyc2lvbl9GVU5DLAotCWdsWFN3YXBCdWZmZXJzX0ZVTkMsCi0JZ2xYVXNlWEZvbnRfRlVOQywKLQlnbFhXYWl0R0xfRlVOQywKLQlnbFhXYWl0WF9GVU5DLAotCW1lbW1vdmVfRlVOQywKLX0gR0xYX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0cnVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3M2MxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0cnVjdHMuaCIKLQotI2lmbmRlZiBOT19YVmlzdWFsSW5mbwotdHlwZWRlZiBzdHJ1Y3QgWFZpc3VhbEluZm9fRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCB2aXN1YWwsIHZpc3VhbGlkLCBzY3JlZW4sIGRlcHRoLCBjY2xhc3MsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2ssIGNvbG9ybWFwX3NpemUsIGJpdHNfcGVyX3JnYjsKLX0gWFZpc3VhbEluZm9fRklEX0NBQ0hFOwotCi1YVmlzdWFsSW5mb19GSURfQ0FDSEUgWFZpc3VhbEluZm9GYzsKLQotdm9pZCBjYWNoZVhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0KQotewotCWlmIChYVmlzdWFsSW5mb0ZjLmNhY2hlZCkgcmV0dXJuOwotCVhWaXN1YWxJbmZvRmMuY2xhenogPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgbHBPYmplY3QpOwotCVhWaXN1YWxJbmZvRmMudmlzdWFsID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgWFZpc3VhbEluZm9GYy5jbGF6eiwgInZpc3VhbCIsICJJIik7Ci0JWFZpc3VhbEluZm9GYy52aXN1YWxpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJ2aXN1YWxpZCIsICJJIik7Ci0JWFZpc3VhbEluZm9GYy5zY3JlZW4gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYVmlzdWFsSW5mb0ZjLmNsYXp6LCAic2NyZWVuIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmRlcHRoID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgWFZpc3VhbEluZm9GYy5jbGF6eiwgImRlcHRoIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmNjbGFzcyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJjY2xhc3MiLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMucmVkX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYVmlzdWFsSW5mb0ZjLmNsYXp6LCAicmVkX21hc2siLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuZ3JlZW5fbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJncmVlbl9tYXNrIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmJsdWVfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJibHVlX21hc2siLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJjb2xvcm1hcF9zaXplIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJiaXRzX3Blcl9yZ2IiLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuY2FjaGVkID0gMTsKLX0KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpCi17Ci0JaWYgKCFYVmlzdWFsSW5mb0ZjLmNhY2hlZCkgY2FjaGVYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGxwT2JqZWN0KTsKLQlscFN0cnVjdC0+dmlzdWFsID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbCk7Ci0JbHBTdHJ1Y3QtPnZpc3VhbGlkID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbGlkKTsKLQlscFN0cnVjdC0+c2NyZWVuID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnNjcmVlbik7Ci0JbHBTdHJ1Y3QtPmRlcHRoID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmRlcHRoKTsKLQlscFN0cnVjdC0+Y2NsYXNzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmNjbGFzcyk7Ci0JbHBTdHJ1Y3QtPnJlZF9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnJlZF9tYXNrKTsKLQlscFN0cnVjdC0+Z3JlZW5fbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5ncmVlbl9tYXNrKTsKLQlscFN0cnVjdC0+Ymx1ZV9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmJsdWVfbWFzayk7Ci0JbHBTdHJ1Y3QtPmNvbG9ybWFwX3NpemUgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSk7Ci0JbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5iaXRzX3Blcl9yZ2IpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCWlmICghWFZpc3VhbEluZm9GYy5jYWNoZWQpIGNhY2hlWFZpc3VhbEluZm9GaWVsZHMoZW52LCBscE9iamVjdCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbGlkLCAoamludClscFN0cnVjdC0+dmlzdWFsaWQpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5zY3JlZW4sIChqaW50KWxwU3RydWN0LT5zY3JlZW4pOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5kZXB0aCwgKGppbnQpbHBTdHJ1Y3QtPmRlcHRoKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY2NsYXNzLCAoamludClscFN0cnVjdC0+Y2NsYXNzKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMucmVkX21hc2ssIChqaW50KWxwU3RydWN0LT5yZWRfbWFzayk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmdyZWVuX21hc2ssIChqaW50KWxwU3RydWN0LT5ncmVlbl9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuYmx1ZV9tYXNrLCAoamludClscFN0cnVjdC0+Ymx1ZV9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSwgKGppbnQpbHBTdHJ1Y3QtPmNvbG9ybWFwX3NpemUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5iaXRzX3Blcl9yZ2IsIChqaW50KWxwU3RydWN0LT5iaXRzX3Blcl9yZ2IpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHhfc3RydWN0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGYwOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImdseC5oIgotCi0jaWZuZGVmIE5PX1hWaXN1YWxJbmZvCi12b2lkIGNhY2hlWFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QpOwotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KTsKLSNkZWZpbmUgWFZpc3VhbEluZm9fc2l6ZW9mKCkgc2l6ZW9mKFhWaXN1YWxJbmZvKQotI2Vsc2UKLSNkZWZpbmUgY2FjaGVYVmlzdWFsSW5mb0ZpZWxkcyhhLGIpCi0jZGVmaW5lIGdldFhWaXN1YWxJbmZvRmllbGRzKGEsYixjKSBOVUxMCi0jZGVmaW5lIHNldFhWaXN1YWxJbmZvRmllbGRzKGEsYixjKQotI2RlZmluZSBYVmlzdWFsSW5mb19zaXplb2YoKSAwCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L21ha2VfbGludXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmU5NTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9tYWtlX2xpbnV4Lm1haworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRGVmaW5lIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgcHJvZHVjdHMuCi1DQz1nY2MKLUxEPWdjYwotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1XU19QUkVGSVggICA9IGd0awotR0xfUFJFRklYICAgPSBnbAotR0xfRExMICAgICAgPSBsaWIkKEdMX1BSRUZJWCktJChXU19QUkVGSVgpLnNvCi1HTF9PQkogICAgICA9IHN3dC5vIGdsLm8gZ2x1Lm8gc3RydWN0cy5vIGdseC5vCi1HTF9MSUIgICAgICA9IC1zaGFyZWQgLUwvdXNyL1gxMVI2L2xpYiAtbEdMIC1sR0xVIC1sbQotCi1DRkxBR1MgPSAtTzIgLVdhbGwgLUkuCi0KLWFsbDogbWFrZV9nbAotCi1tYWtlX2dsOiAkKEdMX0RMTCkKLQkkKExEKSAkKEdMX0xJQikgLW8gJChHTF9ETEwpICQoR0xfT0JKKQotCi0kKEdMX0RMTCk6ICQoR0xfT0JKKQotCSQoQ0MpICQoQ0ZMQUdTKSAtYyBnbHguYwotCi1jbGVhbjoKLQlybSAtZiAqLnNvICoubwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWQyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgInN0cnVjdHMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgWFZpc3VhbEluZm9fRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCB2aXN1YWwsIHZpc3VhbGlkLCBzY3JlZW4sIGRlcHRoLCBjY2xhc3MsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2ssIGNvbG9ybWFwX3NpemUsIGJpdHNfcGVyX3JnYjsKLX0gWFZpc3VhbEluZm9fRklEX0NBQ0hFOwotdHlwZWRlZiBYVmlzdWFsSW5mb19GSURfQ0FDSEUgKlBYVmlzdWFsSW5mb19GSURfQ0FDSEU7Ci0KLVhWaXN1YWxJbmZvX0ZJRF9DQUNIRSBYVmlzdWFsSW5mb0ZjOwotCi12b2lkIGNhY2hlWFZpc3VhbEluZm9GaWRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQWFZpc3VhbEluZm9fRklEX0NBQ0hFIGxwQ2FjaGUpCi17Ci0JaWYgKGxwQ2FjaGUtPmNhY2hlZCkgcmV0dXJuOwotCWxwQ2FjaGUtPmNsYXp6ID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KTsKLQlscENhY2hlLT52aXN1YWwgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInZpc3VhbCIsICJJIik7Ci0JbHBDYWNoZS0+dmlzdWFsaWQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInZpc3VhbGlkIiwgIkkiKTsKLQlscENhY2hlLT5zY3JlZW4gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInNjcmVlbiIsICJJIik7Ci0JbHBDYWNoZS0+ZGVwdGggPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImRlcHRoIiwgIkkiKTsKLQlscENhY2hlLT5jY2xhc3MgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNjbGFzcyIsICJJIik7Ci0JbHBDYWNoZS0+cmVkX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInJlZF9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5ncmVlbl9tYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJncmVlbl9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5ibHVlX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImJsdWVfbWFzayIsICJJIik7Ci0JbHBDYWNoZS0+Y29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY29sb3JtYXBfc2l6ZSIsICJJIik7Ci0JbHBDYWNoZS0+Yml0c19wZXJfcmdiID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiaXRzX3Blcl9yZ2IiLCAiSSIpOwotCWxwQ2FjaGUtPmNhY2hlZCA9IDE7Ci19Ci0KLVhWaXN1YWxJbmZvICpnZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCVBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSA9ICZYVmlzdWFsSW5mb0ZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVhWaXN1YWxJbmZvRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQlscFN0cnVjdC0+dmlzdWFsID0gKFZpc3VhbCAqKSgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsKTsKLQlscFN0cnVjdC0+dmlzdWFsaWQgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnZpc3VhbGlkKTsKLQlscFN0cnVjdC0+c2NyZWVuID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5zY3JlZW4pOwotCWxwU3RydWN0LT5kZXB0aCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZGVwdGgpOwotCWxwU3RydWN0LT5jbGFzcyA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y2NsYXNzKTsKLQlscFN0cnVjdC0+cmVkX21hc2sgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnJlZF9tYXNrKTsKLQlscFN0cnVjdC0+Z3JlZW5fbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z3JlZW5fbWFzayk7Ci0JbHBTdHJ1Y3QtPmJsdWVfbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Ymx1ZV9tYXNrKTsKLQlscFN0cnVjdC0+Y29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y29sb3JtYXBfc2l6ZSk7Ci0JbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Yml0c19wZXJfcmdiKTsKLQlyZXR1cm4gbHBTdHJ1Y3Q7Ci19Ci0KLXZvaWQgc2V0WFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFhWaXN1YWxJbmZvICpscFN0cnVjdCkKLXsKLQlQWFZpc3VhbEluZm9fRklEX0NBQ0hFIGxwQ2FjaGUgPSAmWFZpc3VhbEluZm9GYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVYVmlzdWFsSW5mb0ZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWwsIChqaW50KWxwU3RydWN0LT52aXN1YWwpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsaWQsIChqaW50KWxwU3RydWN0LT52aXN1YWxpZCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5zY3JlZW4sIChqaW50KWxwU3RydWN0LT5zY3JlZW4pOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZGVwdGgsIChqaW50KWxwU3RydWN0LT5kZXB0aCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jY2xhc3MsIChqaW50KWxwU3RydWN0LT5jbGFzcyk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5yZWRfbWFzaywgKGppbnQpbHBTdHJ1Y3QtPnJlZF9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdyZWVuX21hc2ssIChqaW50KWxwU3RydWN0LT5ncmVlbl9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJsdWVfbWFzaywgKGppbnQpbHBTdHJ1Y3QtPmJsdWVfbWFzayk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jb2xvcm1hcF9zaXplLCAoamludClscFN0cnVjdC0+Y29sb3JtYXBfc2l6ZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5iaXRzX3Blcl9yZ2IsIChqaW50KWxwU3RydWN0LT5iaXRzX3Blcl9yZ2IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOThmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KTsKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9HTFguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9ndGsvR0xYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1MDc5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9HTFguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5ndGs7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci0KLXB1YmxpYyBjbGFzcyBHTFggewotCQotc3RhdGljIHsKLQlMaWJyYXJ5LmxvYWRMaWJyYXJ5KCJnbCIpOwotfQotCi0vKgotKiogVmlzdWFsIENvbmZpZyBBdHRyaWJ1dGVzIChnbFhHZXRDb25maWcsIGdsWEdldEZCQ29uZmlnQXR0cmliKQotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9VU0VfR0wJCQkJPSAxOwkvKiBzdXBwb3J0IEdMWCByZW5kZXJpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CVUZGRVJfU0laRQkJCT0gMjsJLyogZGVwdGggb2YgdGhlIGNvbG9yIGJ1ZmZlciAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0xFVkVMCQkJCT0gMzsJLyogbGV2ZWwgaW4gcGxhbmUgc3RhY2tpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBCQkJCT0gNDsJLyogdHJ1ZSBpZiBSR0JBIG1vZGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ET1VCTEVCVUZGRVIJCT0gNTsJLyogZG91YmxlIGJ1ZmZlcmluZyBzdXBwb3J0ZWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEVSRU8JCQkJPSA2OwkvKiBzdGVyZW8gYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTCQkJPSA3OwkvKiBudW1iZXIgb2YgYXV4IGJ1ZmZlcnMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SRURfU0laRQkJCT0gODsJLyogbnVtYmVyIG9mIHJlZCBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0dSRUVOX1NJWkUJCQk9IDk7CS8qIG51bWJlciBvZiBncmVlbiBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JMVUVfU0laRQkJCT0gMTA7CS8qIG51bWJlciBvZiBibHVlIGNvbXBvbmVudCBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUxQSEFfU0laRQkJCT0gMTE7CS8qIG51bWJlciBvZiBhbHBoYSBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RFUFRIX1NJWkUJCQk9IDEyOwkvKiBudW1iZXIgb2YgZGVwdGggYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURU5DSUxfU0laRQkJPSAxMzsJLyogbnVtYmVyIG9mIHN0ZW5jaWwgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FDQ1VNX1JFRF9TSVpFCQk9IDE0OwkvKiBudW1iZXIgb2YgcmVkIGFjY3VtIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BQ0NVTV9HUkVFTl9TSVpFCT0gMTU7CS8qIG51bWJlciBvZiBncmVlbiBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQkxVRV9TSVpFCQk9IDE2OwkvKiBudW1iZXIgb2YgYmx1ZSBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQUxQSEFfU0laRQk9IDE3OwkvKiBudW1iZXIgb2YgYWxwaGEgYWNjdW0gYml0cyAqLwotLyoKLSoqIEZCQ29uZmlnLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRQkJPSAweDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTkZJR19DQVZFQVQJCT0gMHgyMDsJLyogTGlrZSB2aXN1YWxfaW5mbyBWSVNVQUxfQ0FWRUFUX0VYVCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEUJPSAweDIzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFCT0gMHgyNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SRURfVkFMVUUJPSAweDI1OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFCT0gMHgyNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCT0gMHgyNzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRQk9IDB4Mjg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRFJBV0FCTEVfVFlQRQkJPSAweDgwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUkVOREVSX1RZUEUJCQk9IDB4ODAxMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9YX1JFTkRFUkFCTEUJCT0gMHg4MDEyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZCQ09ORklHX0lECQkJPSAweDgwMTM7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTUFYX1BCVUZGRVJfV0lEVEgJPSAweDgwMTY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTUFYX1BCVUZGRVJfSEVJR0hUCT0gMHg4MDE3OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1BJWEVMUwk9IDB4ODAxODsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfSUQJCQk9IDB4ODAwQjsKLQotLyoKLSoqIEVycm9yIHJldHVybiB2YWx1ZXMgZnJvbSBnbFhHZXRDb25maWcuICBTdWNjZXNzIGlzIGluZGljYXRlZCBieQotKiogYSB2YWx1ZSBvZiAwLgotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfU0NSRUVOCQk9IDE7CS8qIHNjcmVlbiAjIGlzIGJhZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9BVFRSSUJVVEUJPSAyOwkvKiBhdHRyaWJ1dGUgdG8gZ2V0IGlzIGJhZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PX0VYVEVOU0lPTgk9IDM7CS8qIG5vIGdseCBleHRlbnNpb24gb24gc2VydmVyICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1ZJU1VBTAkJPSA0OwkvKiB2aXN1YWwgIyBub3Qga25vd24gYnkgR0xYICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX0NPTlRFWFQJCT0gNTsJLyogcmV0dXJuZWQgb25seSBieSBpbXBvcnRfY29udGV4dCBFWFQ/ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1ZBTFVFCQk9IDY7CS8qIHJldHVybmVkIG9ubHkgYnkgZ2xYU3dhcEludGVydmFsU0dJPyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9FTlVNCQk9IDc7CS8qIHVudXNlZD8gKi8KLQotLyogRkJDb25maWcgYXR0cmlidXRlIHZhbHVlcyAqLwotCi0vKgotKiogR2VuZXJpYyAiZG9uJ3QgY2FyZSIgdmFsdWUgZm9yIGdsWCBDaG9vc2VGQkNvbmZpZyBhdHRyaWJ1dGVzIChleGNlcHQKLSoqIEdMWF9MRVZFTCkKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRE9OVF9DQVJFCQkJPSAweEZGRkZGRkZGOwotCi0vKiBHTFhfUkVOREVSX1RZUEUgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JHQkFfQklUCQkJPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTE9SX0lOREVYX0JJVAkJPSAweDAwMDAwMDAyOwotCi0vKiBHTFhfRFJBV0FCTEVfVFlQRSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfV0lORE9XX0JJVAkJCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QSVhNQVBfQklUCQkJPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfQklUCQkJPSAweDAwMDAwMDA0OwotCi0vKiBHTFhfQ09ORklHX0NBVkVBVCBhdHRyaWJ1dGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9ORQkJCQk9IDB4ODAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX0NPTkZJRwkJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRwk9IDB4ODAwRDsKLQotLyogR0xYX1hfVklTVUFMX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSVUVfQ09MT1IJCQk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1IJCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUgkJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SCQk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFCQkJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVkJCQk9IDB4ODAwNzsKLQotLyogR0xYX1RSQU5TUEFSRU5UX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQkgICAweDgwMDAgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SR0IJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYCT0gMHg4MDA5OwotCi0vKiBnbFhDcmVhdGVHTFhQYnVmZmVyIGF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QUkVTRVJWRURfQ09OVEVOVFMJPSAweDgwMUI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTEFSR0VTVF9QQlVGRkVSCQk9IDB4ODAxQzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0hFSUdIVAkJPSAweDgwNDA7CS8qIE5ldyBmb3IgR0xYIDEuMyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfV0lEVEgJCT0gMHg4MDQxOwkvKiBOZXcgZm9yIEdMWCAxLjMgKi8KLQotLyogZ2xYUXVlcnlHTFhQQnVmZmVyIGF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9XSURUSAkJPSAweDgwMUQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfSEVJR0hUCQk9IDB4ODAxRTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FVkVOVF9NQVNLCT0gMHg4MDFGOwotCi0vKiBnbFhDcmVhdGVOZXdDb250ZXh0IHJlbmRlcl90eXBlIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX1RZUEUJCQk9IDB4ODAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9UWVBFCT0gMHg4MDE1OwotCi0vKiBnbFhRdWVyeUNvbnRleHQgYXR0cmlidXRlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZCQ09ORklHX0lECQkgIDB4ODAxMyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFTkRFUl9UWVBFCQkgIDB4ODAxMSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NDUkVFTgkJCT0gMHg4MDBDOwotCi0vKiBnbFhTZWxlY3RFdmVudCBldmVudCBtYXNrIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0NMT0JCRVJfTUFTSwk9IDB4MDgwMDAwMDA7Ci0KLS8qIEdMWFBidWZmZXJDbG9iYmVyRXZlbnQgZXZlbnRfdHlwZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9EQU1BR0VECQkJPSAweDgwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0FWRUQJCQk9IDB4ODAyMTsKLQotLyogR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBkcmF3X3R5cGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfV0lORE9XCQkJPSAweDgwMjI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUgkJCT0gMHg4MDIzOwotCi0vKiBHTFhQYnVmZmVyQ2xvYmJlckV2ZW50IGJ1ZmZlcl9tYXNrIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GUk9OVF9MRUZUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZST05UX1JJR0hUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBQ0tfTEVGVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQUNLX1JJR0hUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTX0JJVAkJPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RFUFRIX0JVRkZFUl9CSVQJCT0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEVOQ0lMX0JVRkZFUl9CSVQJCT0gMHgwMDAwMDA0MDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BQ0NVTV9CVUZGRVJfQklUCQk9IDB4MDAwMDAwODA7Ci0KLS8qCi0qKiBFeHRlbnNpb24gcmV0dXJuIHZhbHVlcyBmcm9tIGdsWEdldENvbmZpZy4gIFRoZXNlIGFyZSBhbHNvCi0qKiBhY2NlcHRlZCBhcyBwYXJhbWV0ZXIgdmFsdWVzIGZvciBnbFhDaG9vc2VWaXN1YWwuCi0qLwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRV9FWFQgPSAweDIyOwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gdHlwZSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEVfRVhUID0gMHgyMzsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUVfRVhUID0gMHgyNDsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFX0VYVAk9IDB4MjU7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFX0VYVCA9IDB4MjY7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUVfRVhUCT0gMHgyNzsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUVfRVhUID0gMHgyODsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi0KLS8qIFByb3BlcnR5IHZhbHVlcyBmb3IgdmlzdWFsX3R5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUlVFX0NPTE9SX0VYVAk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1JfRVhUCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUl9FWFQJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SX0VYVAk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFX0VYVAk9IDB4ODAwNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEFUSUNfR1JBWV9FWFQJPSAweDgwMDc7Ci0KLS8qIFByb3BlcnR5IHZhbHVlcyBmb3IgdHJhbnNwYXJlbnQgcGl4ZWwgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9OT05FX0VYVAkJPSAweDgwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkdCX0VYVAkJPSAweDgwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfRVhUCT0gMHg4MDA5OwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHZpc3VhbF9yYXRpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfQ0FWRUFUX0VYVAkJPSAweDIwOyAgLyogdmlzdWFsX3JhdGluZyBleHRlbnNpb24gdHlwZSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NMT1dfVklTVUFMX0VYVAkJPSAweDgwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9OX0NPTkZPUk1BTlRfVklTVUFMX0VYVAk9IDB4ODAwRDsKLQotLyoKLSoqIE5hbWVzIGZvciBhdHRyaWJ1dGVzIHRvIGdsWEdldENsaWVudFN0cmluZy4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVORE9SCQk9IDB4MTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WRVJTSU9OCQk9IDB4MjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FWFRFTlNJT05TCT0gMHgzOwotCi0vKgotKiogTmFtZXMgZm9yIGF0dHJpYnV0ZXMgdG8gZ2xYUXVlcnlDb250ZXh0SW5mb0VYVC4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0hBUkVfQ09OVEVYVF9FWFQgPSAweDgwMEE7CS8qIGlkIG9mIHNoYXJlIGNvbnRleHQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfSURfRVhUID0gMHg4MDBCOwkvKiBpZCBvZiBjb250ZXh0J3MgdmlzdWFsICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0NSRUVOX0VYVCA9IDB4ODAwQzsJLyogc2NyZWVuIG51bWJlciAqLwotCi0vKgotKiBHTFggMS40IAotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQU1QTEVfQlVGRkVSUyA9IDEwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQU1QTEVTID0gMTAwMDAxOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ2hvb3NlVmlzdWFsKGludCBkcHksIGludCBzY3JlZW4sIGludFtdIGF0dHJpYkxpc3QpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhDb3B5Q29udGV4dChpbnQgZHB5LCBpbnQgc3JjLCBpbnQgZHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBYVmlzdWFsSW5mbyB2aXMsIGludCBzaGFyZUxpc3QsIGJvb2xlYW4gZGlyZWN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbFhDcmVhdGVHTFhQaXhtYXAoaW50IGRweSwgWFZpc3VhbEluZm8gdmlzLCBpbnQgcGl4bWFwKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYRGVzdHJveUNvbnRleHQoaW50IGRweSwgaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWERlc3Ryb3lHTFhQaXhtYXAoaW50IGRweSwgaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q29uZmlnKGludCBkcHksIFhWaXN1YWxJbmZvIHZpcywgaW50IGF0dHJpYiwgaW50W10gdmFsdWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q3VycmVudERyYXdhYmxlKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWElzRGlyZWN0KGludCBkcHksIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhNYWtlQ3VycmVudChpbnQgZHB5LCBpbnQgZHJhd2FibGUsIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhRdWVyeUV4dGVuc2lvbihpbnQgZHB5LCBpbnRbXSBlcnJvckJhc2UsIGludFtdIGV2ZW50QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWFF1ZXJ5VmVyc2lvbihpbnQgZHB5LCBpbnRbXSBtYWpvciwgaW50W10gbWlub3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhTd2FwQnVmZmVycyhpbnQgZHB5LCBpbnQgZHJhd2FibGUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhVc2VYRm9udChpbnQgZm9udCwgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWFdhaXRHTCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhXYWl0WCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldENsaWVudFN0cmluZyhpbnQgZHB5LCBpbnQgbmFtZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoaW50IGRweSwgaW50IHNjcmVlbiwgaW50IG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhpbnQgZHB5LCBpbnQgc2NyZWVuKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbWVtbW92ZShYVmlzdWFsSW5mbyBkZXN0LCBpbnQgc3JjLCBpbnQgc2l6ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvZ3RrL1hWaXN1YWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvZ3RrL1hWaXN1YWxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmMzk2OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9YVmlzdWFsSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ3RrOwotCi0gCi1wdWJsaWMgY2xhc3MgWFZpc3VhbEluZm8gewotCXB1YmxpYyBpbnQgdmlzdWFsOwotCXB1YmxpYyBpbnQgdmlzdWFsaWQ7Ci0JcHVibGljIGludCBzY3JlZW47Ci0JcHVibGljIGludCBkZXB0aDsKLQlwdWJsaWMgaW50IGNjbGFzczsKLQlwdWJsaWMgaW50IHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2s7Ci0JcHVibGljIGludCBjb2xvcm1hcF9zaXplOwotCXB1YmxpYyBpbnQgYml0c19wZXJfcmdiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpemVvZiA9IDQwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ2FudmFzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzZjNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmd0ay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotCi0vKioKLSAqIEdMQ2FudmFzIGlzIGEgd2lkZ2V0IGNhcGFibGUgb2YgZGlzcGxheWluZyBPcGVuR0wgY29udGVudC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgR0xDYW52YXMgZXh0ZW5kcyBDYW52YXMgewotCWludCAvKmxvbmcqLyB4ZGlzcGxheTsKLQlpbnQgLypsb25nKi8geGlkOwotCWludCAvKmxvbmcqLyBjb250ZXh0OwotCWludCAvKmxvbmcqLyBnbFdpbmRvdzsKLQlYVmlzdWFsSW5mbyB2aW5mbzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQVRUUklCVVRFUyA9IDMyOwotCi0vKioKLSAqIENyZWF0ZSBhIEdMQ2FudmFzIHdpZGdldCB1c2luZyB0aGUgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gdGhlIEdMRGF0YQotICogb2JqZWN0IHByb3ZpZGVkLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgYSBjb21wb3NpdGUgd2lkZ2V0Ci0gKiBAcGFyYW0gc3R5bGUgdGhlIGJpdHdpc2UgT1InaW5nIG9mIHdpZGdldCBzdHlsZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBvZiB0aGUgR0xDYW52YXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICogPHVsPjxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gdGhlIGRhdGEgaXMgbnVsbAotICogICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCB3aGVuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBjYW5ub3QgYmUgcHJvdmlkZWQ8L3VsPiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX0NSRUFURV9PQkpFQ1Qgd2hlbiBmYWlsZWQgdG8gY3JlYXRlIE9MRSBPYmplY3QKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX09QRU5fRklMRSB3aGVuIGZhaWxlZCB0byBvcGVuIGZpbGUKLSAqICAgICA8bGk+RVJST1JfSU5URVJGQUNFX05PVF9GT1VORCB3aGVuIHVuYWJsZSB0byBjcmVhdGUgY2FsbGJhY2tzIGZvciBPTEUgSW50ZXJmYWNlcwotICogICAgIDxsaT5FUlJPUl9JTlZBTElEX0NMQVNTSUQKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBHTENhbnZhcyAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBHTERhdGEgZGF0YSkgewotCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsJCi0JaWYgKGRhdGEgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaW50IGdseEF0dHJpYiBbXSA9IG5ldyBpbnQgW01BWF9BVFRSSUJVVEVTXTsKLQlpbnQgcG9zID0gMDsKLQotCU9TLmd0a193aWRnZXRfcmVhbGl6ZSAoaGFuZGxlKTsKLQlpbnQgLypsb25nKi8gd2luZG93ID0gT1MuR1RLX1dJREdFVF9XSU5ET1cgKGhhbmRsZSk7Ci0JeGRpc3BsYXkgPSBPUy5nZGtfeDExX2RyYXdhYmxlX2dldF94ZGlzcGxheSAod2luZG93KTsKLQlpbnQgeHNjcmVlbiA9IE9TLlhEZWZhdWx0U2NyZWVuICh4ZGlzcGxheSk7Ci0KLQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfUkdCQTsKLQlpZiAoZGF0YS5kb3VibGVCdWZmZXIpIGdseEF0dHJpYiBbcG9zKytdID0gR0xYLkdMWF9ET1VCTEVCVUZGRVI7Ci0JaWYgKGRhdGEuc3RlcmVvKSBnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU1RFUkVPOwotCWlmIChkYXRhLnJlZFNpemUgPiAwKSB7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gR0xYLkdMWF9SRURfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLnJlZFNpemU7Ci0JfQotCWlmIChkYXRhLmdyZWVuU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0dSRUVOX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5ncmVlblNpemU7Ci0JfQotCWlmIChkYXRhLmJsdWVTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfQkxVRV9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuYmx1ZVNpemU7Ci0JfQotCWlmIChkYXRhLmFscGhhU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FMUEhBX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5hbHBoYVNpemU7Ci0JfQotCWlmIChkYXRhLmRlcHRoU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0RFUFRIX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5kZXB0aFNpemU7Ci0JfQotCWlmIChkYXRhLnN0ZW5jaWxTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU1RFTkNJTF9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuc3RlbmNpbFNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtUmVkU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX1JFRF9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWNjdW1SZWRTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bUdyZWVuU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX0dSRUVOX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUdyZWVuU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuYWNjdW1CbHVlU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX0JMVUVfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtQmx1ZVNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtQWxwaGFTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfQUNDVU1fQUxQSEFfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtQWxwaGFTaXplOwotCX0KLQlpZiAoZGF0YS5zYW1wbGVCdWZmZXJzID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU0FNUExFX0JVRkZFUlM7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5zYW1wbGVCdWZmZXJzOwotCX0KLQlpZiAoZGF0YS5zYW1wbGVzID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU0FNUExFUzsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZXM7Ci0JfQotCWdseEF0dHJpYiBbcG9zKytdID0gMDsKLQlpbnQgaW5mb1B0ciA9IEdMWC5nbFhDaG9vc2VWaXN1YWwgKHhkaXNwbGF5LCB4c2NyZWVuLCBnbHhBdHRyaWIpOwotCWlmIChpbmZvUHRyID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLQl2aW5mbyA9IG5ldyBYVmlzdWFsSW5mbyAoKTsKLQlHTFgubWVtbW92ZSAodmluZm8sIGluZm9QdHIsIFhWaXN1YWxJbmZvLnNpemVvZik7Ci0JT1MuWEZyZWUgKGluZm9QdHIpOwotCWludCAvKmxvbmcqLyBzY3JlZW4gPSBPUy5nZGtfc2NyZWVuX2dldF9kZWZhdWx0ICgpOwotCWludCAvKmxvbmcqLyBnZGt2aXN1YWwgPSBPUy5nZGtfeDExX3NjcmVlbl9sb29rdXBfdmlzdWFsIChzY3JlZW4sIHZpbmZvLnZpc3VhbGlkKTsKLQkvL2NvbnRleHQgPSBHTFguZ2xYQ3JlYXRlQ29udGV4dCAoeGRpc3BsYXksIGluZm8sIHNoYXJlID09IG51bGwgPyAwIDogc2hhcmUuY29udGV4dCwgdHJ1ZSk7Ci0JY29udGV4dCA9IEdMWC5nbFhDcmVhdGVDb250ZXh0ICh4ZGlzcGxheSwgdmluZm8sIDAsIHRydWUpOwotCWlmIChjb250ZXh0ID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX05PX0hBTkRMRVMpOwotCUdka1dpbmRvd0F0dHIgYXR0cnMgPSBuZXcgR2RrV2luZG93QXR0ciAoKTsKLQlhdHRycy53aWR0aCA9IDE7Ci0JYXR0cnMuaGVpZ2h0ID0gMTsKLQlhdHRycy5ldmVudF9tYXNrID0gT1MuR0RLX0tFWV9QUkVTU19NQVNLIHwgT1MuR0RLX0tFWV9SRUxFQVNFX01BU0sgfAotCQlPUy5HREtfRk9DVVNfQ0hBTkdFX01BU0sgfCBPUy5HREtfUE9JTlRFUl9NT1RJT05fTUFTSyB8Ci0JCU9TLkdES19CVVRUT05fUFJFU1NfTUFTSyB8IE9TLkdES19CVVRUT05fUkVMRUFTRV9NQVNLIHwKLQkJT1MuR0RLX0VOVEVSX05PVElGWV9NQVNLIHwgT1MuR0RLX0xFQVZFX05PVElGWV9NQVNLIHwKLQkJT1MuR0RLX0VYUE9TVVJFX01BU0sgfCBPUy5HREtfVklTSUJJTElUWV9OT1RJRllfTUFTSzsKLQlhdHRycy53aW5kb3dfdHlwZSA9IE9TLkdES19XSU5ET1dfQ0hJTEQ7Ci0JYXR0cnMudmlzdWFsID0gZ2RrdmlzdWFsOwotCWdsV2luZG93ID0gT1MuZ2RrX3dpbmRvd19uZXcgKHdpbmRvdywgYXR0cnMsIE9TLkdES19XQV9WSVNVQUwpOwotCU9TLmdka193aW5kb3dfc2V0X3VzZXJfZGF0YSAoZ2xXaW5kb3csIGhhbmRsZSk7Ci0JeGlkID0gT1MuZ2RrX3gxMV9kcmF3YWJsZV9nZXRfeGlkIChnbFdpbmRvdyk7Ci0JT1MuZ2RrX3dpbmRvd19zaG93IChnbFdpbmRvdyk7Ci0KLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5QYWludDoKLQkJCQkvKioKLQkJCQkqIEJ1ZyBpbiBNRVNBLiAgTUVTQSBkb2VzIHNvbWUgbmFzdHkgc29ydCBvZiBwb2xsaW5nIHRvIHRyeQotCQkJCSogYW5kIGVuc3VyZSB0aGF0IHRoZWlyIGJ1ZmZlciBzaXplcyBtYXRjaCB0aGUgY3VycmVudCBYIHN0YXRlLgotCQkJCSogVGhpcyBzdGF0ZSBjYW4gYmUgdXBkYXRlZCB1c2luZyBnbFZpZXdwb3J0KCkuCi0JCQkJKiBGSVhNRTogVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSBvZiBkb2luZyB0aGlzLgotCQkJCSovCi0JCQkJaW50IFtdIHZpZXdwb3J0ID0gbmV3IGludCBbNF07Ci0JCQkJR0wuZ2xHZXRJbnRlZ2VydiAoR0wuR0xfVklFV1BPUlQsIHZpZXdwb3J0KTsKLQkJCQlHTC5nbFZpZXdwb3J0ICh2aWV3cG9ydCBbMF0sdmlld3BvcnQgWzFdLHZpZXdwb3J0IFsyXSx2aWV3cG9ydCBbM10pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuUmVzaXplOgotCQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQkJCU9TLmdka193aW5kb3dfbW92ZSAoZ2xXaW5kb3csIGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55KTsKLQkJCQlPUy5nZGtfd2luZG93X3Jlc2l6ZSAoZ2xXaW5kb3csIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQkJaWYgKGNvbnRleHQgIT0gMCkgewotCQkJCQlpZiAoR0xYLmdsWEdldEN1cnJlbnRDb250ZXh0ICgpID09IGNvbnRleHQpIHsKLQkJCQkJCUdMWC5nbFhNYWtlQ3VycmVudCh4ZGlzcGxheSwgMCwgMCk7Ci0JCQkJCX0KLQkJCQkJR0xYLmdsWERlc3Ryb3lDb250ZXh0ICh4ZGlzcGxheSwgY29udGV4dCk7Ci0JCQkJCWNvbnRleHQgPSAwOwotCQkJCX0KLQkJCQlpZiAoZ2xXaW5kb3cgIT0gMCkgewotCQkJCQlPUy5nZGtfd2luZG93X2Rlc3Ryb3kgKGdsV2luZG93KTsKLQkJCQkJZ2xXaW5kb3cgPSAwOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lciAoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlpbnQgW10gdmFsdWUgPSBuZXcgaW50IFsxXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfRE9VQkxFQlVGRkVSLCB2YWx1ZSk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSB2YWx1ZSBbMF0gIT0gMDsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfU1RFUkVPLCB2YWx1ZSk7Ci0JZGF0YS5zdGVyZW8gPSB2YWx1ZSBbMF0gIT0gMDsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfUkVEX1NJWkUsIHZhbHVlKTsKLQlkYXRhLnJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmdyZWVuU2l6ZSA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfQkxVRV9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5ibHVlU2l6ZSA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfQUxQSEFfU0laRSwgdmFsdWUpOwotCWRhdGEuYWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9ERVBUSF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5kZXB0aFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX1NURU5DSUxfU0laRSwgdmFsdWUpOwotCWRhdGEuc3RlbmNpbFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX1JFRF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5hY2N1bVJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtR3JlZW5TaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9BQ0NVTV9CTFVFX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQmx1ZVNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX0FMUEhBX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9TQU1QTEVfQlVGRkVSUywgdmFsdWUpOwotCWRhdGEuc2FtcGxlQnVmZmVycyA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfU0FNUExFUywgdmFsdWUpOwotCWRhdGEuc2FtcGxlcyA9IHZhbHVlIFswXTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgT3BlbkdMIGNvbnRleHQKLSAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQuCi0gKiAgCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhvbGRzIHRoZSBjdXJyZW50IE9wZW5HTCBjb250ZXh0LAotICogZmFsc2Ugb3RoZXJ3aXNlCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIEdMWC5nbFhHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBjb250ZXh0OwotfQotCi0vKioKLSAqIFNldHMgdGhlIE9wZW5HTCBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEdMQ2FudmFzIHRvIGJlIHRoZQotICogY3VycmVudCBHTCBjb250ZXh0LgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEN1cnJlbnQgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCWlmIChHTFguZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gY29udGV4dCkgcmV0dXJuOwotCUdMWC5nbFhNYWtlQ3VycmVudCAoeGRpc3BsYXksIHhpZCwgY29udGV4dCk7Ci19Ci0KLS8qKgotICogU3dhcHMgdGhlIGZyb250IGFuZCBiYWNrIGNvbG9yIGJ1ZmZlcnMuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc3dhcEJ1ZmZlcnMgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMWC5nbFhTd2FwQnVmZmVycyAoeGRpc3BsYXksIHhpZCk7Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9idWlsZC5zaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmVjMTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2J1aWxkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyEvYmluL3NoCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSMgICAgIFRvbSBUcm9tZXkgKFJlZCBIYXQsIEluYy4pCi0jICAgICBTcmlkaGFyIEJpZGlnYWx1IChJQ1MpCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1jZCBgZGlybmFtZSAkMGAKLQotIyBEZXRlcm1pbmUgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYmVpbmcgYnVpbHQKLW1ha2VmaWxlPSIiCi1PUz1gdW5hbWUgLXNgCi1NT0RFTD1gdW5hbWUgLW1gCi0KLWNhc2UgJE9TIGluCi0JIkFJWCIpCi0JCUpBVkFfSE9NRT0vYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvYWl4ajkKLQkJTU9USUZfSE9NRT0vdXNyCi0JCUNERV9IT01FPS91c3IvZHQKLQkJbWFrZWZpbGU9Im1ha2VfYWl4Lm1hayIKLQkJZWNobyAiQnVpbGRpbmcgQUlYIHZlcnNpb24gb2YgU1dUIgotCQk7OwotCSJMaW51eCIpCi0JCUpBVkFfSE9NRT0vYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvSUJNSmF2YTItMTQxCi0JCU1PVElGX0hPTUU9L2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL21vdGlmMjEKLQkJUVRfSE9NRT0kUVRESVIKLQkJbWFrZWZpbGU9Im1ha2VfbGludXgubWFrIgotCQllY2hvICJCdWlsZGluZyBMaW51eCB2ZXJzaW9uIG9mIFNXVCIKLQkJOzsKLQkiU3VuT1MiKQotCQlKQVZBX0hPTUU9L3Vzci9qYXZhCi0JCU1PVElGX0hPTUU9L3Vzci9kdAotCQlDREVfSE9NRT0vdXNyL2R0Ci0JCVBBVEg9L29wdC9TVU5Xc3Byby9iaW46JFBBVEgKLQkJZXhwb3J0IFBBVEgJCQotCQltYWtlZmlsZT0ibWFrZV9zb2xhcmlzLm1hayIKLQkJZWNobyAiQnVpbGRpbmcgU29sYXJpcyB2ZXJzaW9uIG9mIFNXVCIKLQkJOzsKLQkiSFAtVVgiKQotCQlKQVZBX0hPTUU9L29wdC9qZGsxNDEwMQotCQlNT1RJRl9IT01FPS91c3IKLQkJQ0RFX0hPTUU9L3Vzci9kdAotCQljYXNlICRNT0RFTCBpbgotCQkJImlhNjQiKQotCQkJCW1ha2VmaWxlPSJtYWtlX2hwdXhfaWE2NC5tYWsiCi0JCQkJZWNobyAiQnVpbGRpbmcgSFBVWCBpYTY0IHZlcnNpb24gb2YgU1dUIgotCQkJCTs7Ci0JCQkqKQotCQkJCW1ha2VmaWxlPSJtYWtlX2hwdXhfUEFfUklTQy5tYWsiCi0JCQkJZWNobyAiQnVpbGRpbmcgSFBVWCByaXNjIHZlcnNpb24gb2YgU1dUIgotCQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQotCSopCi0JCWVjaG8gIlVua25vd24gT1MgLS0gYnVpbGQgYWJvcnRlZCIKLQkJOzsKLWVzYWMKLQotZXhwb3J0IEpBVkFfSE9NRSBNT1RJRl9IT01FIENERV9IT01FIFFUX0hPTUUKLQotbWFrZSAtZiAkbWFrZWZpbGUgJDEgJDIgJDMgJDQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9nbHguYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2dseC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhlMTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2dseC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8R0wvZ2x4Lmg+Ci0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi0jZGVmaW5lIFhHTF9OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX21vdGlmX1hHTF8jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWENob29zZVZpc3VhbCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoImdsWENob29zZVZpc3VhbFxuIikKLQotCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQlyYyA9IChqaW50KWdsWENob29zZVZpc3VhbCgoRGlzcGxheSAqKWFyZzAsIGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgWEdMX05BVElWRShnbFhDb3B5Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYQ29weUNvbnRleHRcbiIpCi0KLQlnbFhDb3B5Q29udGV4dCgoRGlzcGxheSAqKWFyZzAsIChHTFhDb250ZXh0KWFyZzEsIChHTFhDb250ZXh0KWFyZzIsIGFyZzMpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYQ3JlYXRlQ29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpvYmplY3QgYXJnMSwgamludCBhcmcyLCBqYm9vbGVhbiBhcmczKQotewotCVhWaXN1YWxJbmZvIF9hcmcxLCAqbHBhcmcxPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoImdsWENyZWF0ZUNvbnRleHRcbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpZ2xYQ3JlYXRlQ29udGV4dCgoRGlzcGxheSAqKWFyZzAsIGxwYXJnMSwgKEdMWENvbnRleHQpYXJnMiwgYXJnMyk7Ci0JaWYgKGFyZzEpIHNldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMSwgbHBhcmcxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgWEdMX05BVElWRShnbFhDcmVhdGVHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMikKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJnbFhDcmVhdGVHTFhQaXhtYXBcbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpZ2xYQ3JlYXRlR0xYUGl4bWFwKChEaXNwbGF5ICopYXJnMCwgbHBhcmcxLCBhcmcyKTsKLQlpZiAoYXJnMSkgc2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCBscGFyZzEpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWERlc3Ryb3lDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCURFQlVHX0NBTEwoImdsWERlc3Ryb3lDb250ZXh0XG4iKQotCi0JZ2xYRGVzdHJveUNvbnRleHQoKERpc3BsYXkgKilhcmcwLCAoR0xYQ29udGV4dClhcmcxKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWERlc3Ryb3lHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYRGVzdHJveUdMWFBpeG1hcFxuIikKLQotCWdsWERlc3Ryb3lHTFhQaXhtYXAoKERpc3BsYXkgKilhcmcwLCBhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldENsaWVudFN0cmluZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJnbFhHZXRDbGllbnRTdHJpbmdcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYR2V0Q2xpZW50U3RyaW5nKChEaXNwbGF5ICopYXJnMCwgYXJnMSk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgWEdMX05BVElWRShnbFhHZXRDb25maWcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JWFZpc3VhbEluZm8gX2FyZzEsICpscGFyZzE9TlVMTDsKLQlqaW50ICpscGFyZzM9TlVMTDsKLQlqaW50IHJjOwotCi0JREVCVUdfQ0FMTCgiZ2xYR2V0Q29uZmlnXG4iKQotCi0JaWYgKGFyZzEpIGxwYXJnMSA9IGdldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMSwgJl9hcmcxKTsKLQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JcmMgPSAoamludClnbFhHZXRDb25maWcoKERpc3BsYXkgKilhcmcwLCBscGFyZzEsIGFyZzIsIChpbnQgKilscGFyZzMpOwotCWlmIChhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldEN1cnJlbnRDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYR2V0Q3VycmVudENvbnRleHRcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldEN1cnJlbnREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCURFQlVHX0NBTEwoImdsWEdldEN1cnJlbnREcmF3YWJsZVxuIikKLQotCXJldHVybiAoamludClnbFhHZXRDdXJyZW50RHJhd2FibGUoKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhJc0RpcmVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJnbFhJc0RpcmVjdFxuIikKLQotCXJldHVybiAoamJvb2xlYW4pZ2xYSXNEaXJlY3QoKERpc3BsYXkgKilhcmcwLCAoR0xYQ29udGV4dClhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCURFQlVHX0NBTEwoImdsWE1ha2VDdXJyZW50XG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbilnbFhNYWtlQ3VycmVudCgoRGlzcGxheSAqKWFyZzAsIChHTFhEcmF3YWJsZSlhcmcxLCAoR0xYQ29udGV4dClhcmcyKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhRdWVyeUV4dGVuc2lvbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnRBcnJheSBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQotCURFQlVHX0NBTEwoImdsWFF1ZXJ5RXh0ZW5zaW9uXG4iKQotCi0JaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQlyYyA9IChqYm9vbGVhbilnbFhRdWVyeUV4dGVuc2lvbigoRGlzcGxheSAqKWFyZzAsIChpbnQgKilscGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCURFQlVHX0NBTEwoImdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZ1xuIikKLQotCXJldHVybiAoamludClnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoKERpc3BsYXkgKilhcmcwLCBhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWFF1ZXJ5U2VydmVyU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoKERpc3BsYXkgKilhcmcwLCBhcmcxLCBhcmcyKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhRdWVyeVZlcnNpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmM7Ci0KLQlERUJVR19DQUxMKCJnbFhRdWVyeVZlcnNpb25cbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCXJjID0gKGpib29sZWFuKWdsWFF1ZXJ5VmVyc2lvbigoRGlzcGxheSAqKWFyZzAsIChpbnQgKilscGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYU3dhcEJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYU3dhcEJ1ZmZlcnNcbiIpCi0KLQlnbFhTd2FwQnVmZmVycygoRGlzcGxheSAqKWFyZzAsIChHTFhEcmF3YWJsZSlhcmcxKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWFVzZVhGb250KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlERUJVR19DQUxMKCJnbFhVc2VYRm9udFxuIikKLQotCWdsWFVzZVhGb250KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYV2FpdEdMKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYV2FpdEdMXG4iKQotCi0JZ2xYV2FpdEdMKCk7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgWEdMX05BVElWRShnbFhXYWl0WCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCURFQlVHX0NBTEwoImdsWFdhaXRYXG4iKQotCi0JZ2xYV2FpdFgoKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKG1lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX21vdGlmX1hWaXN1YWxJbmZvXzJJSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCVhWaXN1YWxJbmZvIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0KLQlERUJVR19DQUxMKCJtZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9pbnRlcm5hbF9tb3RpZl9YVmlzdWFsSW5mb18ySUlcbiIpCi0KLQlpZiAoYXJnMCkgbHBhcmcwID0gJl9hcmcwOwotCW1lbW1vdmUoKHZvaWQgKilscGFyZzAsIChjb25zdCB2b2lkICopYXJnMSwgKHNpemVfdClhcmcyKTsKLQlpZiAoYXJnMCkgc2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcwLCBscGFyZzApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9haXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9haXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI3YjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfYWl4Lm1haworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRGVmaW5lIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgcHJvZHVjdHMuCi0jICAgIEpBVkFfSE9NRSAgLSBUaGUgSkRLID4gMS4zCi1KQVZBX0hPTUUgICA9IC91c3IvamF2YTEzMQotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1TV1RfUFJFRklYICAgPSBzd3QKLVdTX1BSRUZJWCAgICA9IG1vdGlmCi1TV1RfRExMICAgICAgPSBsaWIkKFNXVF9QUkVGSVgpLSQoV1NfUFJFRklYKS5zbwotU1dUX09CSiAgICAgID0gc3d0Lm8gZ2wubyBnbHUubyBzdHJ1Y3RzLm8gZ2x4Lm8KLVNXVF9MSUIgICAgICA9IC1HIC1ibm9lbnRyeSAtbGNfciAtbENfciAtbG0gLWJleHBhbGwgLWxNcm0gLWxYMTEgLWxYZXh0IC1saWNvbnYgLWxHTCAtbEdMVQotCi0jCi0jIFRoZSBmb2xsb3dpbmcgQ0ZMQUdTIGFyZSBmb3IgY29tcGlsaW5nIHRoZSBTV1QgT3BlbkdMIGxpYnJhcnkuCi0jCi1DRkxBR1MgPSAtTyAtcyBcCi0JLURBSVggXAotCS1ETk9fWElORVJBTUFfRVhURU5TSU9OUyBcCi0JLXEgbWJjcyAtcWxhbmdsdmw9ZXh0ZW5kZWQgLXFtYXhtZW09ODE5MiBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAkKFNXVF9MSUIpIC1vICQoU1dUX0RMTCkgJChTV1RfT0JKKQotCi1jbGVhbjoKLQlybSAtZiAqLm8gKi5zbyAqLmEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfaHB1eC5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX2hwdXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGFmYjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfaHB1eC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIERlZmluZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGZvciB2YXJpb3VzIHByb2R1Y3RzLgotSkFWQV9IT01FICA9IC9vcHQvamF2YTEuMwotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1TV1RfUFJFRklYICAgPSBnbAotV1NfUFJFRklYICAgID0gbW90aWYKLVNXVF9ETEwgICAgICA9IGxpYiQoU1dUX1BSRUZJWCktJChXU19QUkVGSVgpLnNsCi1TV1RfT0JKICAgICAgPSBzd3QubyBnbC5vIGdsdS5vIHN0cnVjdHMubyBnbHgubwotU1dUX0xJQiAgICAgID0gLUwvdXNyL2xpYiAtTC9vcHQvZ3JhcGhpY3MvT3BlbkdML2xpYiAtRyAtbEdMIC1sR0xVIC1sYyAtbGRsZCAtbG0KLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotIyBOb3RlOgotIyAgIFRoZSBmbGFnIC14YXJjaD1nZW5lcmljIGVuc3VyZSB0aGUgY29tcGlsZWQgbW9kdWxlcyB3aWxsIGJlIHRhcmdldGVkCi0jICAgZm9yIDMyLWJpdCBhcmNoaXRlY3R1cmVzLiBJZiB0aGlzIGZsYWcgaXMgbm90Ci0jCi1DRkxBR1MgPSAtQWUgK3ogXAotCS1ETk9fWElORVJBTUFfRVhURU5TSU9OUyBcCi0JLURfSFBVWCAtRF9QT1NJWF9DX1NPVVJDRT0xOTk1MDZMIFwKLQktSS4vIFwKLQktSSQoSkFWQV9IT01FKS9pbmNsdWRlIC1JJChKQVZBX0hPTUUpL2luY2x1ZGUvaHAtdXggXAotCS1JL29wdC9ncmFwaGljcy9PcGVuR0wvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAtYiAteiAtbyAkQCAkKFNXVF9PQkopICQoU1dUX0xJQikKLQotY2xlYW46Ci0Jcm0gLWYgKi5zbCAqLm8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9saW51eC5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTk1YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9saW51eC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIERlZmluZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGZvciB2YXJpb3VzIHByb2R1Y3RzLgotSkFWQV9IT01FICAgPSAvYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvaXZlL2JpbgotCi0KLSMgRGVmaW5lIHRoZSB2YXJpb3VzIHNoYXJlZCBsaWJyYXJpZXMgdG8gYmUgbWFkZS4KLVNXVF9QUkVGSVggICA9IGdsCi1XU19QUkVGSVggICAgPSBtb3RpZgotU1dUX0RMTCAgICAgID0gbGliJChTV1RfUFJFRklYKS0kKFdTX1BSRUZJWCkuc28KLVNXVF9PQkogICAgICA9IHN3dC5vIGdsLm8gZ2x1Lm8gc3RydWN0cy5vIGdseC5vCi1TV1RfTElCICAgICAgPSAtc2hhcmVkIC1ML3Vzci9YMTFSNi9saWIgLWxHTCAtbEdMVSAtbG0KLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotQ0ZMQUdTID0gLU8gLXMgXAotCS1JLi8gXAotCS1JJChKQVZBX0hPTUUpL2luY2x1ZGUKLQotYWxsOiBtYWtlX3N3dAotCi1tYWtlX3N3dDogJChTV1RfRExMKQotCi0kKFNXVF9ETEwpOiAkKFNXVF9PQkopCi0JbGQgLW8gJEAgJChTV1RfT0JKKSAkKFNXVF9MSUIpCi0KLWNsZWFuOgotCXJtIC1mICouc28gKi5vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX3NvbGFyaXMubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9zb2xhcmlzLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1MTBiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX3NvbGFyaXMubWFrCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIyBEZWZpbmUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBmb3IgdmFyaW91cyBwcm9kdWN0cy4KLUpBVkFfSE9NRSAgID0gL2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL2l2ZS9iaW4KLQotIyBEZWZpbmUgdGhlIHZhcmlvdXMgc2hhcmVkIGxpYnJhcmllcyB0byBiZSBtYWRlLgotU1dUX1BSRUZJWCAgID0gZ2wKLVdTX1BSRUZJWCAgICA9IG1vdGlmCi1TV1RfRExMICAgICAgPSBsaWIkKFNXVF9QUkVGSVgpLSQoV1NfUFJFRklYKS5zbwotU1dUX09CSiAgICAgID0gc3d0Lm8gZ2wubyBnbHUubyBzdHJ1Y3RzLm8gZ2x4Lm8KLVNXVF9MSUIgICAgICA9IC1HIC1ML3Vzci9saWIgLWxtIC1sR0wgLWxHTFUKLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotIyBOb3RlOgotIyAgIFRoZSBmbGFnIC14YXJjaD1nZW5lcmljIGVuc3VyZSB0aGUgY29tcGlsZWQgbW9kdWxlcyB3aWxsIGJlIHRhcmdldGVkCi0jICAgZm9yIDMyLWJpdCBhcmNoaXRlY3R1cmVzLgotIwotQ0ZMQUdTID0gLU8gLXMgXAotCS14YXJjaD1nZW5lcmljIFwKLQktS1BJQyBcCi0JLUkuLyBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAtbyAkQCAkKFNXVF9PQkopICQoU1dUX0xJQikKLQotY2xlYW46Ci0Jcm0gLWYgKi5zbyAqLm8KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWQyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvc3RydWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxYMTEvWC5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi10eXBlZGVmIHN0cnVjdCBYVmlzdWFsSW5mb19GSURfQ0FDSEUgewotCWludCBjYWNoZWQ7Ci0JamNsYXNzIGNsYXp6OwotCWpmaWVsZElEIHZpc3VhbCwgdmlzdWFsaWQsIHNjcmVlbiwgZGVwdGgsIGNjbGFzcywgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzaywgY29sb3JtYXBfc2l6ZSwgYml0c19wZXJfcmdiOwotfSBYVmlzdWFsSW5mb19GSURfQ0FDSEU7Ci10eXBlZGVmIFhWaXN1YWxJbmZvX0ZJRF9DQUNIRSAqUFhWaXN1YWxJbmZvX0ZJRF9DQUNIRTsKLQotWFZpc3VhbEluZm9fRklEX0NBQ0hFIFhWaXN1YWxJbmZvRmM7Ci0KLXZvaWQgY2FjaGVYVmlzdWFsSW5mb0ZpZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSkKLXsKLQlpZiAobHBDYWNoZS0+Y2FjaGVkKSByZXR1cm47Ci0JbHBDYWNoZS0+Y2xhenogPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgbHBPYmplY3QpOwotCWxwQ2FjaGUtPnZpc3VhbCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAidmlzdWFsIiwgIkkiKTsKLQlscENhY2hlLT52aXN1YWxpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAidmlzdWFsaWQiLCAiSSIpOwotCWxwQ2FjaGUtPnNjcmVlbiA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAic2NyZWVuIiwgIkkiKTsKLQlscENhY2hlLT5kZXB0aCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZGVwdGgiLCAiSSIpOwotCWxwQ2FjaGUtPmNjbGFzcyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY2NsYXNzIiwgIkkiKTsKLQlscENhY2hlLT5yZWRfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAicmVkX21hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmdyZWVuX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdyZWVuX21hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmJsdWVfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiYmx1ZV9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5jb2xvcm1hcF9zaXplID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjb2xvcm1hcF9zaXplIiwgIkkiKTsKLQlscENhY2hlLT5iaXRzX3Blcl9yZ2IgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImJpdHNfcGVyX3JnYiIsICJJIik7Ci0JbHBDYWNoZS0+Y2FjaGVkID0gMTsKLX0KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpCi17Ci0JUFhWaXN1YWxJbmZvX0ZJRF9DQUNIRSBscENhY2hlID0gJlhWaXN1YWxJbmZvRmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlWFZpc3VhbEluZm9GaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCWxwU3RydWN0LT52aXN1YWwgPSAoVmlzdWFsICopKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWwpOwotCWxwU3RydWN0LT52aXN1YWxpZCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsaWQpOwotCWxwU3RydWN0LT5zY3JlZW4gPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnNjcmVlbik7Ci0JbHBTdHJ1Y3QtPmRlcHRoID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kZXB0aCk7Ci0JbHBTdHJ1Y3QtPmNsYXNzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jY2xhc3MpOwotCWxwU3RydWN0LT5yZWRfbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+cmVkX21hc2spOwotCWxwU3RydWN0LT5ncmVlbl9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5ncmVlbl9tYXNrKTsKLQlscFN0cnVjdC0+Ymx1ZV9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5ibHVlX21hc2spOwotCWxwU3RydWN0LT5jb2xvcm1hcF9zaXplID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jb2xvcm1hcF9zaXplKTsKLQlscFN0cnVjdC0+Yml0c19wZXJfcmdiID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5iaXRzX3Blcl9yZ2IpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCVBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSA9ICZYVmlzdWFsSW5mb0ZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVhWaXN1YWxJbmZvRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnZpc3VhbCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWxpZCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbGlkKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnNjcmVlbiwgKGppbnQpbHBTdHJ1Y3QtPnNjcmVlbik7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kZXB0aCwgKGppbnQpbHBTdHJ1Y3QtPmRlcHRoKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNjbGFzcywgKGppbnQpbHBTdHJ1Y3QtPmNsYXNzKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnJlZF9tYXNrLCAoamludClscFN0cnVjdC0+cmVkX21hc2spOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z3JlZW5fbWFzaywgKGppbnQpbHBTdHJ1Y3QtPmdyZWVuX21hc2spOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Ymx1ZV9tYXNrLCAoamludClscFN0cnVjdC0+Ymx1ZV9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNvbG9ybWFwX3NpemUsIChqaW50KWxwU3RydWN0LT5jb2xvcm1hcF9zaXplKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJpdHNfcGVyX3JnYiwgKGppbnQpbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOThmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvc3RydWN0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxYMTEvWC5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotCi1YVmlzdWFsSW5mbyAqZ2V0WFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFhWaXN1YWxJbmZvICpscFN0cnVjdCk7Ci12b2lkIHNldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRmNDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLm1vdGlmLio7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIDxjb2RlPkdMQ29udGV4dDwvY29kZT4gYXJlIHVzZWQgdG8gZHJhdyBvbiBzd3QgPGNvZGU+RHJhd2FibGU8L2NvZGU+cyAKLSAqIHRocm91Z2ggaW52b2NhdGlvbnMgb2YgcHJvdmlkZWQgT3BlbkdMIGZ1bmN0aW9ucy4KLSAqIDxwPgotICogQXBwbGljYXRpb24gY29kZSBtdXN0IGV4cGxpY2l0bHkgaW52b2tlIHRoZSA8Y29kZT5HTENvbnRleHQuZGlzcG9zZSAoKTwvY29kZT4gCi0gKiBtZXRob2QgdG8gcmVsZWFzZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgbWFuYWdlZCBieSBlYWNoIGluc3RhbmNlCi0gKiB3aGVuIHRob3NlIGluc3RhbmNlcyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLiBUaGlzIGlzIDxlbT5wYXJ0aWN1bGFybHk8L2VtPgotICogaW1wb3J0YW50IG9uIFdpbmRvd3M5NSBhbmQgV2luZG93czk4IHdoZXJlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGhhcyBhIGxpbWl0ZWQKLSAqIG51bWJlciBvZiBkZXZpY2UgY29udGV4dHMgYXZhaWxhYmxlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgR0xDb250ZXh0IHsKLQlpbnQgaGFuZGxlOwotCWludCBnYzsKLQlHQ0RhdGEgZGF0YTsKLQlEcmF3YWJsZSBkcmF3YWJsZTsKLQlpbnQgc2VsZWN0QnVmZmVyUHRyID0gMDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgTVNCX0ZJUlNUID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IExTQl9GSVJTVCA9IDI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2hpY2ggaGFzIGJlZW4KLQkgKiBjb25maWd1cmVkIHRvIGRyYXcgb24gdGhlIHNwZWNpZmllZCBkcmF3YWJsZS4KLQkgKiA8cD4KLQkgKiBZb3UgbXVzdCBkaXNwb3NlIHRoZSA8Y29kZT5HTENvbnRleHQ8L2NvZGU+IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRyYXdhYmxlIHRoZSBkcmF3YWJsZSB0byBkcmF3IG9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGRyYXdhYmxlIGlzIG51bGw8L2xpPgotCSAqIDwvdWw+Ci0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX05PX0hBTkRMRVMgaWYgYSBoYW5kbGUgY291bGQgbm90IGJlIG9idGFpbmVkIGZvciBnYyBjcmVhdGlvbjwvbGk+Ci0JICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIC0gaWYgdGhlIGN1cnJlbnQgZGlzcGxheSBkZXB0aCBpcyBub3Qgc3VwcG9ydGVkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBHTENvbnRleHQgKERyYXdhYmxlIGRyYXdhYmxlKSB7Ci0JCWlmIChkcmF3YWJsZSA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQkJdGhpcy5kcmF3YWJsZSA9IGRyYXdhYmxlOwotCQl0aGlzLmRhdGEgPSBuZXcgR0NEYXRhICgpOwotCQlnYyA9IGRyYXdhYmxlLmludGVybmFsX25ld19HQyAoZGF0YSk7Ci0JCWlmIChnYyA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQkJaW50IHhEaXNwbGF5ID0gZGF0YS5kaXNwbGF5OwotCQlpbnQgc2NyZWVuID0gT1MuWERlZmF1bHRTY3JlZW4gKHhEaXNwbGF5KTsKLQkJaW50IGRlcHRoID0gT1MuWERlZmF1bHREZXB0aE9mU2NyZWVuIChPUy5YRGVmYXVsdFNjcmVlbk9mRGlzcGxheSAoeERpc3BsYXkpKTsKLQkJaW50IGF0dHJpYiBbXSA9IHsKLQkJCVhHTC5HTFhfTEVWRUwsCi0JCQkwLAotCQkJWEdMLkdMWF9SR0JBLAotCQkJWEdMLkdMWF9ET1VCTEVCVUZGRVIsCi0vLwkJCVhHTC5HTFhfREVQVEhfU0laRSwKLS8vCQkJZGVwdGgsCi0JCQkwCi0JCX07Ci0JCWludCBpbmZvUHRyID0gWEdMLmdsWENob29zZVZpc3VhbCAoeERpc3BsYXksIHNjcmVlbiwgYXR0cmliKTsKLQkJaWYgKGluZm9QdHIgPT0gMCkgU1dULmVycm9yIChTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotCQlYVmlzdWFsSW5mbyBpbmZvID0gbmV3IFhWaXN1YWxJbmZvICgpOwotCQlYR0wubWVtbW92ZSAoaW5mbywgaW5mb1B0ciwgWFZpc3VhbEluZm8uc2l6ZW9mKTsKLQkJT1MuWEZyZWUgKGluZm9QdHIpOwotCQloYW5kbGUgPSBYR0wuZ2xYQ3JlYXRlQ29udGV4dCAoeERpc3BsYXksIGluZm8sIDAsIGZhbHNlKTsKLQkJaWYgKGhhbmRsZSA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0JCUltYWdlRGF0YVV0aWwuYmxpdCAoCi0JCQkxLAotCQkJc291cmNlLmRhdGEsCi0JCQlzb3VyY2UuZGVwdGgsCi0JCQlzb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKHNvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCXNvdXJjZS53aWR0aCwKLQkJCXNvdXJjZS5oZWlnaHQsCi0JCQlzb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJc291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJc291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQkyNTUsCi0JCQludWxsLAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLmRhdGEsCi0JCQluZXdTb3VyY2UuZGVwdGgsCi0JCQluZXdTb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKG5ld1NvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCW5ld1NvdXJjZS53aWR0aCwKLQkJCW5ld1NvdXJjZS5oZWlnaHQsCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQlmYWxzZSwKLQkJCXRydWUpOwotCi0JCXJldHVybiBuZXdTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoZSByZWNlaXZlci4gQXBwbGljYXRpb25zIG11c3QgZGlzcG9zZSBvZiBhbGwgPGNvZGU+R0xDb250ZXh0PC9jb2RlPnMKLQkgKiB0aGF0IHRoZXkgYWxsb2NhdGUuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSAoKSB7Ci0JCWlmIChoYW5kbGUgPT0gMCkgcmV0dXJuOwotCQlpbnQgeERpc3BsYXkgPSBkYXRhLmRpc3BsYXk7Ci0JCWlmIChYR0wuZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gaGFuZGxlKSB7Ci0JCQlYR0wuZ2xYTWFrZUN1cnJlbnQgKHhEaXNwbGF5LCAwLCAwKTsKLQkJfQotCQlpZiAoc2VsZWN0QnVmZmVyUHRyICE9IDApIE9TLlh0RnJlZSAoc2VsZWN0QnVmZmVyUHRyKTsKLQkJWEdMLmdsWERlc3Ryb3lDb250ZXh0ICh4RGlzcGxheSwgaGFuZGxlKTsKLQkJaGFuZGxlID0gMDsKLQkJLy8gZHJhd2FibGUgbWF5IGJlIGRpc3Bvc2VkCi0JCXRyeSB7Ci0JCQlkcmF3YWJsZS5pbnRlcm5hbF9kaXNwb3NlX0dDIChnYywgZGF0YSk7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJZ2MgPSAwOwotCQlkYXRhLmRpc3BsYXkgPSBkYXRhLmRyYXdhYmxlID0gZGF0YS5jb2xvcm1hcCA9IDA7Ci0JCS8qZGF0YS5mb250TGlzdCA9Ki8gZGF0YS5jbGlwUmduID0gZGF0YS5yZW5kZXJUYWJsZSA9IDA7Ci0JCWRyYXdhYmxlID0gbnVsbDsKLQkJZGF0YS5kZXZpY2UgPSBudWxsOwotCQlkYXRhLmltYWdlID0gbnVsbDsKLQkJLy9kYXRhLmNvZGVQYWdlID0gbnVsbDsKLQkJZGF0YSA9IG51bGw7Ci0JfQotCi0JcHVibGljIGludFtdIGdldFNlbGVjdEJ1ZmZlciAoaW50IHNlbGVjdEJ1ZmZlclB0ciwgaW50W10gc2VsZWN0QnVmZmVyKSB7Ci0JCU9TLm1lbW1vdmUgKHNlbGVjdEJ1ZmZlciwgc2VsZWN0QnVmZmVyUHRyLCBzZWxlY3RCdWZmZXIubGVuZ3RoICogNCk7Ci0JCXJldHVybiBzZWxlY3RCdWZmZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZWxlY3RCdWZmZXJQdHIgKGludFtdIHNlbGVjdEJ1ZmZlcikgewotCQlpZiAoc2VsZWN0QnVmZmVyUHRyID09IDApIHsKLQkJCXNlbGVjdEJ1ZmZlclB0ciA9IE9TLlh0TWFsbG9jIChzZWxlY3RCdWZmZXIubGVuZ3RoICogNCk7Ci0JCX0KLQkJT1MubWVtbW92ZSAoc2VsZWN0QnVmZmVyUHRyLCBzZWxlY3RCdWZmZXIsIHNlbGVjdEJ1ZmZlci5sZW5ndGggKiA0KTsKLQkJcmV0dXJuIHNlbGVjdEJ1ZmZlclB0cjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGlzIHRoZSBjdXJyZW50Ci0JICogPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKiAgCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgY3VycmVudCA8Y29kZT5HTENvbnRleHQ8L2NvZGU+LAotCSAqIGZhbHNlIG90aGVyd2lzZQotCSAqIEBleGNlcHRpb24gU1dURXJyb3IgPHVsPgotCSAqICAgIDxsaT5FUlJPUl9HUkFQSElDX0RJU1BPU0VEIGlmIHRoZSByZWNlaXZlciBpcyBkaXNwb3NlZDwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnQgKCkgewotCQlpZiAoaXNEaXNwb3NlZCAoKSkgCVNXVC5lcnJvciAoU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQpOwotCQlyZXR1cm4gWEdMLmdsWEdldEN1cnJlbnRDb250ZXh0ICgpID09IGhhbmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIDxjb2RlPkdMQ29udGV4dDwvY29kZT4gaGFzIGJlZW4KLQkgKiBkaXNwb3NlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBnZXRzIHRoZSBkaXNwb3NlIHN0YXRlIGZvciB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKiBXaGVuIGEgPGNvZGU+R0xDb250ZXh0PC9jb2RlPiBoYXMgYmVlbiBkaXNwb3NlZCwgaXQgaXMgYW4gZXJyb3IgdG8KLQkgKiBpbnZva2UgYW55IG90aGVyIG1ldGhvZCB1c2luZyB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPiBpcyBkaXNwb3NlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCAoKSB7Ci0JCXJldHVybiBoYW5kbGUgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGJpdG1hcCBmb250LgotCSAqIAotCSAqIEBwYXJhbSBmZGF0YQotCSAqIEBwYXJhbSBkZXZpY2UKLQkgKiBAcGFyYW0gYmFzZQotCSAqIEBwYXJhbSBmaXJzdAotCSAqIEBwYXJhbSBjb3VudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRCaXRtYXBGb250IChGb250RGF0YSBmZGF0YSwgRGV2aWNlIGRldmljZSwgaW50IGJhc2UsIGludCBzdGFydEluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCS8qIFRlbXBvcmFyeSBjb2RlLCBkdWUgc29tZSBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gVVRGLTggbG9hZEJpdG1hcEZvbnQgKCkKLQkJICogaXMgcmVzdHJpY3QgdG8gd29ya3Mgb25seSBmb3IgYXNjaWkuIAotCQkgKiBOb3RlOiBlbl9VUy5JU084ODU5LTEgYWxzbyBjb2RlIGJlIHVzZWQuCi0JCSAqLwotCQlmZGF0YS5zZXRMb2NhbGUgKCJDIik7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250IChkZXZpY2UsIGZkYXRhKTsKLQkJaW50IGZvbnRMaXN0ID0gZm9udC5oYW5kbGU7Ci0JCWludFtdIGJ1ZmZlciA9IG5ldyBpbnQgWzFdOwotCQlpZiAoIU9TLlhtRm9udExpc3RJbml0Rm9udENvbnRleHQgKGJ1ZmZlciwgZm9udExpc3QpKSByZXR1cm47Ci0JCWludCBjb250ZXh0ID0gYnVmZmVyIFswXTsKLQkJWEZvbnRTdHJ1Y3QgZm9udFN0cnVjdCA9IG5ldyBYRm9udFN0cnVjdCAoKTsKLQkJaW50IGZvbnRMaXN0RW50cnk7Ci0JCWludFtdIGZvbnRTdHJ1Y3RQdHIgPSBuZXcgaW50IFsxXTsKLQkJaW50W10gZm9udE5hbWVQdHIgPSBuZXcgaW50IFsxXTsKLQkJaW50IHhmb250ID0gMDsKLQkJLy8gZ28gdGhyb3VnaCBlYWNoIGVudHJ5IGluIHRoZSBmb250IGxpc3QKLQkJd2hpbGUgKChmb250TGlzdEVudHJ5ID0gT1MuWG1Gb250TGlzdE5leHRFbnRyeSAoY29udGV4dCkpICE9IDApIHsKLQkJCWludCBmb250UHRyID0gT1MuWG1Gb250TGlzdEVudHJ5R2V0Rm9udCAoZm9udExpc3RFbnRyeSwgYnVmZmVyKTsKLQkJCWlmIChidWZmZXIgWzBdID09IE9TLlhtRk9OVF9JU19GT05UKSB7Ci0JCQkJLy8gRm9udExpc3QgY29udGFpbnMgYSBzaW5nbGUgZm9udAotCQkJCU9TLm1lbW1vdmUgKGZvbnRTdHJ1Y3QsIGZvbnRQdHIsIDIwICogNCk7Ci0JCQkJeGZvbnQgPSBmb250U3RydWN0LmZpZDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRm9udExpc3QgY29udGFpbnMgYSBmb250U2V0Ci0JCQkJaW50IG5Gb250cyA9IE9TLlhGb250c09mRm9udFNldCAoZm9udFB0ciwgZm9udFN0cnVjdFB0ciwgZm9udE5hbWVQdHIpOwotCQkJCWludFtdIGZvbnRTdHJ1Y3RzID0gbmV3IGludCBbbkZvbnRzXTsKLQkJCQlPUy5tZW1tb3ZlIChmb250U3RydWN0cywgZm9udFN0cnVjdFB0ciBbMF0sIG5Gb250cyAqIDQpOwotCQkJCS8vIEdvIHRocm91Z2ggZWFjaCBmb250U3RydWN0IGluIHRoZSBmb250IHNldC4KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5Gb250czsgaSsrKSB7Ci0JCQkJCU9TLm1lbW1vdmUgKGZvbnRTdHJ1Y3QsIGZvbnRTdHJ1Y3RzIFtpXSwgWEZvbnRTdHJ1Y3Quc2l6ZW9mKTsKLQkJCQkJeGZvbnQgPSBmb250U3RydWN0LmZpZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHhmb250ICE9IDApIHsKLQkJCVhHTC5nbFhVc2VYRm9udCAoeGZvbnQsIHN0YXJ0SW5kZXgsIGxlbmd0aCwgYmFzZSk7Ci0JCX0KLQkJZm9udC5kaXNwb3NlICgpOwotCQlPUy5YbUZvbnRMaXN0RnJlZUZvbnRDb250ZXh0IChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIG91dGxpbmUgZm9udC4KLQkgKiAKLQkgKiBAcGFyYW0gZmRhdGEKLQkgKiBAcGFyYW0gZGV2aWNlCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gZmlyc3QKLQkgKiBAcGFyYW0gY291bnQKLQkgKiBAcGFyYW0gZGV2aWF0aW9uCi0JICogQHBhcmFtIGV4dHJ1c2lvbgotCSAqIEBwYXJhbSBmb3JtYXQKLQkgKiBAcGFyYW0gbHBnbWYKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkT3V0bGluZUZvbnQgKEZvbnREYXRhIGZkYXRhLCBEZXZpY2UgZGV2aWNlLCBpbnQgYmFzZSwgaW50IGZpcnN0LAotCWludCBjb3VudCwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIEdMWVBITUVUUklDU0ZMT0FUW10gbHBnbWYpIHsKLQkJLy8gc3R1YgotCX0KLQotCS8qKgotCSAqIFJlc2l6ZXMgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSB4Ci0JICogQHBhcmFtIHkKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0JcHVibGljIHZvaWQgcmVzaXplIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoaGVpZ2h0ID09IDApIGhlaWdodCA9IDE7Ci0JCUdMLmdsVmlld3BvcnQgKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCQlHTC5nbE1hdHJpeE1vZGUgKEdMLkdMX1BST0pFQ1RJT04pOwotCQlHTC5nbExvYWRJZGVudGl0eSAoKTsKLQkJR0xVLmdsdVBlcnNwZWN0aXZlICg0NS4wZiwgKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0LCAwLjFmLCAxMDAuMGYpOwotCQlHTC5nbE1hdHJpeE1vZGUgKEdMLkdMX01PREVMVklFVyk7Ci0JCUdMLmdsTG9hZElkZW50aXR5ICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlY2VpdmVyIHRvIGJlIHRoZSBjdXJyZW50IDxjb2RlPkdMQ29udGV4dDwvY29kZT4uCi0JICogCi0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX0dSQVBISUNfRElTUE9TRUQgaWYgdGhlIHJlY2VpdmVyIGlzIGRpc3Bvc2VkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQgKCkgewotCQlpZiAoaXNEaXNwb3NlZCAoKSkgU1dULmVycm9yIChTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCk7Ci0JCWlmIChYR0wuZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gaGFuZGxlKSByZXR1cm47Ci0JCVhHTC5nbFhNYWtlQ3VycmVudCAoZGF0YS5kaXNwbGF5LCBkYXRhLmRyYXdhYmxlLCBoYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIFN3YXBzIHRoZSByZWNlaXZlcidzIGJ1ZmZlcnMuCi0JICogCi0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX0dSQVBISUNfRElTUE9TRUQgaWYgdGhlIHJlY2VpdmVyIGlzIGRpc3Bvc2VkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQkJaWYgKGlzRGlzcG9zZWQgKCkpIFNXVC5lcnJvciAoU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQpOwotCQlYR0wuZ2xYU3dhcEJ1ZmZlcnMgKGRhdGEuZGlzcGxheSwgZGF0YS5kcmF3YWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvbW90aWYvWEdMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YR0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhM2U1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YR0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC5tb3RpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuTGlicmFyeTsKLQotcHVibGljIGNsYXNzIFhHTCB7Ci0JCi1zdGF0aWMgewotCUxpYnJhcnkubG9hZExpYnJhcnkoImdsIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WRVJTSU9OXzFfMSA9IDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVSU0lPTl8xXzIgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZFUlNJT05fMV8zID0gMTsKLQotLyoKLSoqIFZpc3VhbCBDb25maWcgQXR0cmlidXRlcyAoZ2xYR2V0Q29uZmlnLCBnbFhHZXRGQkNvbmZpZ0F0dHJpYikKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVVNFX0dMCQk9IDE7CS8qIHN1cHBvcnQgR0xYIHJlbmRlcmluZyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JVRkZFUl9TSVpFCQk9IDI7CS8qIGRlcHRoIG9mIHRoZSBjb2xvciBidWZmZXIgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9MRVZFTAkJPSAzOwkvKiBsZXZlbCBpbiBwbGFuZSBzdGFja2luZyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JHQkEJCT0gNDsJLyogdHJ1ZSBpZiBSR0JBIG1vZGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ET1VCTEVCVUZGRVIJPSA1OwkvKiBkb3VibGUgYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURVJFTwkJPSA2OwkvKiBzdGVyZW8gYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTCQk9IDc7CS8qIG51bWJlciBvZiBhdXggYnVmZmVycyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFRF9TSVpFCQk9IDg7CS8qIG51bWJlciBvZiByZWQgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkVFTl9TSVpFCQk9IDk7CS8qIG51bWJlciBvZiBncmVlbiBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JMVUVfU0laRQkJPSAxMDsJLyogbnVtYmVyIG9mIGJsdWUgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BTFBIQV9TSVpFCQk9IDExOwkvKiBudW1iZXIgb2YgYWxwaGEgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ERVBUSF9TSVpFCQk9IDEyOwkvKiBudW1iZXIgb2YgZGVwdGggYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURU5DSUxfU0laRQk9IDEzOwkvKiBudW1iZXIgb2Ygc3RlbmNpbCBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fUkVEX1NJWkUJPSAxNDsJLyogbnVtYmVyIG9mIHJlZCBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fR1JFRU5fU0laRQk9IDE1OwkvKiBudW1iZXIgb2YgZ3JlZW4gYWNjdW0gYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FDQ1VNX0JMVUVfU0laRQk9IDE2OwkvKiBudW1iZXIgb2YgYmx1ZSBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQUxQSEFfU0laRQk9IDE3OwkvKiBudW1iZXIgb2YgYWxwaGEgYWNjdW0gYml0cyAqLwotLyoKLSoqIEZCQ29uZmlnLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRQkJPSAweDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTkZJR19DQVZFQVQJCT0gMHgyMDsJLyogTGlrZSB2aXN1YWxfaW5mbyBWSVNVQUxfQ0FWRUFUX0VYVCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEUJCT0gMHgyMzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9JTkRFWF9WQUxVRQk9IDB4MjQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFCT0gMHgyNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRQk9IDB4MjY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRQk9IDB4Mjc7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUUJPSAweDI4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RSQVdBQkxFX1RZUEUJCT0gMHg4MDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFTkRFUl9UWVBFCQkJPSAweDgwMTE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9SRU5ERVJBQkxFCQk9IDB4ODAxMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GQkNPTkZJR19JRAkJCT0gMHg4MDEzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1dJRFRICQk9IDB4ODAxNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9NQVhfUEJVRkZFUl9IRUlHSFQJCT0gMHg4MDE3OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1BJWEVMUwkJPSAweDgwMTg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVklTVUFMX0lECQkJPSAweDgwMEI7Ci0KLS8qCi0qKiBFcnJvciByZXR1cm4gdmFsdWVzIGZyb20gZ2xYR2V0Q29uZmlnLiAgU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkKLSoqIGEgdmFsdWUgb2YgMC4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1NDUkVFTgkJPSAxOwkvKiBzY3JlZW4gIyBpcyBiYWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfQVRUUklCVVRFCT0gMjsJLyogYXR0cmlidXRlIHRvIGdldCBpcyBiYWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9OT19FWFRFTlNJT04JPSAzOwkvKiBubyBnbHggZXh0ZW5zaW9uIG9uIHNlcnZlciAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9WSVNVQUwJCT0gNDsJLyogdmlzdWFsICMgbm90IGtub3duIGJ5IEdMWCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9DT05URVhUCQk9IDU7CS8qIHJldHVybmVkIG9ubHkgYnkgaW1wb3J0X2NvbnRleHQgRVhUPyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9WQUxVRQkJPSA2OwkvKiByZXR1cm5lZCBvbmx5IGJ5IGdsWFN3YXBJbnRlcnZhbFNHST8gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfRU5VTQkJPSA3OwkvKiB1bnVzZWQ/ICovCi0KLS8qIEZCQ29uZmlnIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLQotLyoKLSoqIEdlbmVyaWMgImRvbid0IGNhcmUiIHZhbHVlIGZvciBnbFggQ2hvb3NlRkJDb25maWcgYXR0cmlidXRlcyAoZXhjZXB0Ci0qKiBHTFhfTEVWRUwpCi0qLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RPTlRfQ0FSRQkJCT0gMHhGRkZGRkZGRjsKLQotLyogR0xYX1JFTkRFUl9UWVBFIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX0JJVAkJCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9CSVQJCT0gMHgwMDAwMDAwMjsKLQotLyogR0xYX0RSQVdBQkxFX1RZUEUgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJTkRPV19CSVQJCQk9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUElYTUFQX0JJVAkJCT0gMHgwMDAwMDAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0JJVAkJCT0gMHgwMDAwMDAwNDsKLQotLyogR0xYX0NPTkZJR19DQVZFQVQgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQk9IDB4ODAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX0NPTkZJRwkJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRwk9IDB4ODAwRDsKLQotLyogR0xYX1hfVklTVUFMX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSVUVfQ09MT1IJCQk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1IJCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUgkJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SCQk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFCQkJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVkJCQk9IDB4ODAwNzsKLQotLyogR0xYX1RSQU5TUEFSRU5UX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQkgICAweDgwMDAgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SR0IJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYCQk9IDB4ODAwOTsKLQotLyogZ2xYQ3JlYXRlR0xYUGJ1ZmZlciBhdHRyaWJ1dGVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUFJFU0VSVkVEX0NPTlRFTlRTCQk9IDB4ODAxQjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9MQVJHRVNUX1BCVUZGRVIJCT0gMHg4MDFDOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfSEVJR0hUCQk9IDB4ODA0MDsJLyogTmV3IGZvciBHTFggMS4zICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUl9XSURUSAkJPSAweDgwNDE7CS8qIE5ldyBmb3IgR0xYIDEuMyAqLwotCi0vKiBnbFhRdWVyeUdMWFBCdWZmZXIgYXR0cmlidXRlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJRFRICQkJPSAweDgwMUQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfSEVJR0hUCQkJPSAweDgwMUU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVZFTlRfTUFTSwkJCT0gMHg4MDFGOwotCi0vKiBnbFhDcmVhdGVOZXdDb250ZXh0IHJlbmRlcl90eXBlIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX1RZUEUJCQk9IDB4ODAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9UWVBFCQk9IDB4ODAxNTsKLQotLyogZ2xYUXVlcnlDb250ZXh0IGF0dHJpYnV0ZXMgKi8KLS8qIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GQkNPTkZJR19JRAkJICAweDgwMTMgKi8KLS8qIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SRU5ERVJfVFlQRQkJICAweDgwMTEgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQ1JFRU4JCQk9IDB4ODAwQzsKLQotLyogZ2xYU2VsZWN0RXZlbnQgZXZlbnQgbWFzayBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUl9DTE9CQkVSX01BU0sJPSAweDA4MDAwMDAwOwotCi0vKiBHTFhQYnVmZmVyQ2xvYmJlckV2ZW50IGV2ZW50X3R5cGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfREFNQUdFRAkJCT0gMHg4MDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NBVkVECQkJPSAweDgwMjE7Ci0KLS8qIEdMWFBidWZmZXJDbG9iYmVyRXZlbnQgZHJhd190eXBlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJTkRPVwkJCT0gMHg4MDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVIJCQk9IDB4ODAyMzsKLQotLyogR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBidWZmZXJfbWFzayBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRlJPTlRfTEVGVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GUk9OVF9SSUdIVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQUNLX0xFRlRfQlVGRkVSX0JJVAk9IDB4MDAwMDAwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFDS19SSUdIVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwODsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BVVhfQlVGRkVSU19CSVQJCT0gMHgwMDAwMDAxMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ERVBUSF9CVUZGRVJfQklUCQk9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RFTkNJTF9CVUZGRVJfQklUCQk9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQlVGRkVSX0JJVAkJPSAweDAwMDAwMDgwOwotCi0vKgotKiogRXh0ZW5zaW9uIHJldHVybiB2YWx1ZXMgZnJvbSBnbFhHZXRDb25maWcuICBUaGVzZSBhcmUgYWxzbwotKiogYWNjZXB0ZWQgYXMgcGFyYW1ldGVyIHZhbHVlcyBmb3IgZ2xYQ2hvb3NlVmlzdWFsLgotKi8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1hfVklTVUFMX1RZUEVfRVhUCT0gMHgyMjsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uIHR5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9UWVBFX0VYVCA9IDB4MjM7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFX0VYVCA9IDB4MjQ7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1JFRF9WQUxVRV9FWFQJPSAweDI1OwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRV9FWFQgPSAweDI2OwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFX0VYVAk9IDB4Mjc7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFX0VYVCA9IDB4Mjg7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHZpc3VhbF90eXBlICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJVRV9DT0xPUl9FWFQJPSAweDgwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRElSRUNUX0NPTE9SX0VYVAk9IDB4ODAwMzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QU0VVRE9fQ09MT1JfRVhUCT0gMHg4MDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NUQVRJQ19DT0xPUl9FWFQJPSAweDgwMDU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfR1JBWV9TQ0FMRV9FWFQJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVlfRVhUCT0gMHg4MDA3OwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHRyYW5zcGFyZW50IHBpeGVsICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9ORV9FWFQJCT0gMHg4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1JHQl9FWFQJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX0VYVAk9IDB4ODAwOTsKLQotLyogUHJvcGVydHkgdmFsdWVzIGZvciB2aXN1YWxfcmF0aW5nICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVklTVUFMX0NBVkVBVF9FWFQJCT0gMHgyMDsgIC8qIHZpc3VhbF9yYXRpbmcgZXh0ZW5zaW9uIHR5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX1ZJU1VBTF9FWFQJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX1ZJU1VBTF9FWFQJPSAweDgwMEQ7Ci0KLS8qCi0qKiBOYW1lcyBmb3IgYXR0cmlidXRlcyB0byBnbFhHZXRDbGllbnRTdHJpbmcuCi0qLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZFTkRPUgkJPSAweDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVSU0lPTgkJPSAweDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVhURU5TSU9OUwkJPSAweDM7Ci0KLS8qCi0qKiBOYW1lcyBmb3IgYXR0cmlidXRlcyB0byBnbFhRdWVyeUNvbnRleHRJbmZvRVhULgotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TSEFSRV9DT05URVhUX0VYVAk9IDB4ODAwQTsJLyogaWQgb2Ygc2hhcmUgY29udGV4dCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZJU1VBTF9JRF9FWFQJPSAweDgwMEI7CS8qIGlkIG9mIGNvbnRleHQncyB2aXN1YWwgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQ1JFRU5fRVhUCQk9IDB4ODAwQzsJLyogc2NyZWVuIG51bWJlciAqLwotCi0vKiBHTFggRXh0ZW5zaW9uIFN0cmluZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FWFRfaW1wb3J0X2NvbnRleHQJPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0VYVF92aXN1YWxfaW5mbwk9IDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVhUX3Zpc3VhbF9yYXRpbmcJPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzID0gMTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWENob29zZVZpc3VhbChpbnQgZHB5LCBpbnQgc2NyZWVuLCBpbnRbXSBhdHRyaWJMaXN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYQ29weUNvbnRleHQoaW50IGRweSwgaW50IHNyYywgaW50IGRzdCwgaW50IG1hc2spOwotLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBpbnQgdmlzLCBpbnQgc2hhcmVMaXN0LCBib29sZWFuIGRpcmVjdCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBYVmlzdWFsSW5mbyB2aXMsIGludCBzaGFyZUxpc3QsIGJvb2xlYW4gZGlyZWN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbFhDcmVhdGVHTFhQaXhtYXAoaW50IGRweSwgWFZpc3VhbEluZm8gdmlzLCBpbnQgcGl4bWFwKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYRGVzdHJveUNvbnRleHQoaW50IGRweSwgaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWERlc3Ryb3lHTFhQaXhtYXAoaW50IGRweSwgaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q29uZmlnKGludCBkcHksIFhWaXN1YWxJbmZvIHZpcywgaW50IGF0dHJpYiwgaW50W10gdmFsdWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q3VycmVudERyYXdhYmxlKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWElzRGlyZWN0KGludCBkcHksIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhNYWtlQ3VycmVudChpbnQgZHB5LCBpbnQgZHJhd2FibGUsIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhRdWVyeUV4dGVuc2lvbihpbnQgZHB5LCBpbnRbXSBlcnJvckJhc2UsIGludFtdIGV2ZW50QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWFF1ZXJ5VmVyc2lvbihpbnQgZHB5LCBpbnRbXSBtYWpvciwgaW50W10gbWlub3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhTd2FwQnVmZmVycyhpbnQgZHB5LCBpbnQgZHJhd2FibGUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhVc2VYRm9udChpbnQgZm9udCwgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWFdhaXRHTCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhXYWl0WCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldENsaWVudFN0cmluZyhpbnQgZHB5LCBpbnQgbmFtZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoaW50IGRweSwgaW50IHNjcmVlbiwgaW50IG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhpbnQgZHB5LCBpbnQgc2NyZWVuKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbWVtbW92ZShYVmlzdWFsSW5mbyBkZXN0LCBpbnQgc3JjLCBpbnQgc2l6ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL21vdGlmL1hWaXN1YWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YVmlzdWFsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjgwMzJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL21vdGlmL1hWaXN1YWxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC5tb3RpZjsKLQotIAotcHVibGljIGNsYXNzIFhWaXN1YWxJbmZvIHsKLQlwdWJsaWMgaW50IHZpc3VhbDsKLQlwdWJsaWMgaW50IHZpc3VhbGlkOwotCXB1YmxpYyBpbnQgc2NyZWVuOwotCXB1YmxpYyBpbnQgZGVwdGg7Ci0JcHVibGljIGludCBjY2xhc3M7Ci0JcHVibGljIGludCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrOwotCXB1YmxpYyBpbnQgY29sb3JtYXBfc2l6ZTsKLQlwdWJsaWMgaW50IGJpdHNfcGVyX3JnYjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMDNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgT3BlbkdMIEJpbmRpbmdzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYWY4NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iJHdzJC9zd3QuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgICAgPHBhY2thZ2VzIHByZWZpeGVzPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9idWlsZC5iYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9idWlsZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2Q5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvYnVpbGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLXJlbSAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotcmVtICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1yZW0gIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotcmVtICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLXJlbSAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLXJlbSAgCi1yZW0gIENvbnRyaWJ1dG9yczoKLXJlbSAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQGVjaG8gb2ZmCi0KLUlGIE5PVCAiJUpBVkFfSE9NRSUiPT0iIiBHT1RPIE1BS0UKLQotcmVtICoqKioqCi1yZW0gSmF2YWgKLXJlbSAqKioqKgotc2V0IEpBVkFfSE9NRT1qOlx0ZWFtc3d0XHN3dC1idWlsZGRpclxpdmVcYmluCi1zZXQgcGF0aD0lSkFWQV9IT01FJTslcGF0aCUKLQotcmVtICoqKioqKioqCi1yZW0gTVNWQyA2LjAKLXJlbSAqKioqKioqKgotY2FsbCBrOlxkZXZccHJvZHVjdHNcbXN2YzYwXHZjOThcYmluXHZjdmFyczMyLmJhdAotCi1yZW0gKioqKioqIAotcmVtIE1TLVNESwotcmVtICoqKioqKgotc2V0IE1zc2RrPWo6XHRlYW1zd3Rcc3d0LWJ1aWxkZGlyXG1zc2RrCi1jYWxsICVtc3NkayVcc2V0ZW52LmJhdAotCi06TUFLRQotbm1ha2UgLWYgbWFrZV93aW4zMi5tYWsgJTEgJTIgJTMgJTQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L2dsdy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvZ2x3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzhlZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvZ2x3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2luZ2RpLmg+Ci0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi0jZGVmaW5lIFdHTF9OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX1dHTF8jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKENob29zZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgam9iamVjdCBhcmcxKQotewotCVBJWEVMRk9STUFUREVTQ1JJUFRPUiBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJDaG9vc2VQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmcxKSBscGFyZzEgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpQ2hvb3NlUGl4ZWxGb3JtYXQoKEhEQylhcmcwLCAoQ09OU1QgUElYRUxGT1JNQVRERVNDUklQVE9SICopbHBhcmcxKTsKLQlpZiAoYXJnMSkgc2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKGVudiwgYXJnMSwgbHBhcmcxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRShEZXNjcmliZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGpvYmplY3QgYXJnMykKLXsKLQlQSVhFTEZPUk1BVERFU0NSSVBUT1IgX2FyZzMsICpscGFyZzM9TlVMTDsKLQlqaW50IHJjOwotCi0JREVCVUdfQ0FMTCgiRGVzY3JpYmVQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmczKSBscGFyZzMgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmczLCAmX2FyZzMpOwotCXJjID0gKGppbnQpRGVzY3JpYmVQaXhlbEZvcm1hdCgoSERDKWFyZzAsIGFyZzEsIGFyZzIsIChMUFBJWEVMRk9STUFUREVTQ1JJUFRPUilscGFyZzMpOwotCWlmIChhcmczKSBzZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmczLCBscGFyZzMpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKEdldFBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlERUJVR19DQUxMKCJHZXRQaXhlbEZvcm1hdFxuIikKLQotCXJldHVybiAoamludClHZXRQaXhlbEZvcm1hdCgoSERDKWFyZzApOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKFNldFBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqb2JqZWN0IGFyZzIpCi17Ci0JUElYRUxGT1JNQVRERVNDUklQVE9SIF9hcmcyLCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmM7Ci0KLQlERUJVR19DQUxMKCJTZXRQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmcyKSBscGFyZzIgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmcyLCAmX2FyZzIpOwotCXJjID0gKGpib29sZWFuKVNldFBpeGVsRm9ybWF0KChIREMpYXJnMCwgYXJnMSwgKENPTlNUIFBJWEVMRk9STUFUREVTQ1JJUFRPUiAqKWxwYXJnMik7Ci0JaWYgKGFyZzIpIHNldFBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZWxkcyhlbnYsIGFyZzIsIGxwYXJnMik7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKFN3YXBCdWZmZXJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlERUJVR19DQUxMKCJTd2FwQnVmZmVyc1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pU3dhcEJ1ZmZlcnMoKEhEQylhcmcwKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xDb3B5Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCURFQlVHX0NBTEwoIndnbENvcHlDb250ZXh0XG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xDb3B5Q29udGV4dCgoSEdMUkMpYXJnMCwgKEhHTFJDKWFyZzEsIChVSU5UKWFyZzIpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsQ3JlYXRlQ29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JREVCVUdfQ0FMTCgid2dsQ3JlYXRlQ29udGV4dFxuIikKLQotCXJldHVybiAoamludCl3Z2xDcmVhdGVDb250ZXh0KChIREMpYXJnMCk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRSh3Z2xDcmVhdGVMYXllckNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsQ3JlYXRlTGF5ZXJDb250ZXh0XG4iKQotCi0JcmV0dXJuIChqaW50KXdnbENyZWF0ZUxheWVyQ29udGV4dCgoSERDKWFyZzAsIGFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbERlbGV0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCURFQlVHX0NBTEwoIndnbERlbGV0ZUNvbnRleHRcbiIpCi0KLQlyZXR1cm4gKGpib29sZWFuKXdnbERlbGV0ZUNvbnRleHQoKEhHTFJDKWFyZzApOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbERlc2NyaWJlTGF5ZXJQbGFuZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGpvYmplY3QgYXJnNCkKLXsKLQlMQVlFUlBMQU5FREVTQ1JJUFRPUiBfYXJnNCwgKmxwYXJnND1OVUxMOwotCWpib29sZWFuIHJjOwotCi0JREVCVUdfQ0FMTCgid2dsRGVzY3JpYmVMYXllclBsYW5lXG4iKQotCi0JaWYgKGFyZzQpIGxwYXJnNCA9IGdldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKGVudiwgYXJnNCwgJl9hcmc0KTsKLQlyYyA9IChqYm9vbGVhbil3Z2xEZXNjcmliZUxheWVyUGxhbmUoKEhEQylhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCAoTFBMQVlFUlBMQU5FREVTQ1JJUFRPUilscGFyZzQpOwotCWlmIChhcmc0KSBzZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhlbnYsIGFyZzQsIGxwYXJnNCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0Q3VycmVudENvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlERUJVR19DQUxMKCJ3Z2xHZXRDdXJyZW50Q29udGV4dFxuIikKLQotCXJldHVybiAoamludCl3Z2xHZXRDdXJyZW50Q29udGV4dCgpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0Q3VycmVudERDKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgid2dsR2V0Q3VycmVudERDXG4iKQotCi0JcmV0dXJuIChqaW50KXdnbEdldEN1cnJlbnREQygpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0TGF5ZXJQYWxldHRlRW50cmllcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJ3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzXG4iKQotCi0JaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCXJjID0gKGppbnQpd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllcygoSERDKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIChDT0xPUlJFRiAqKWxwYXJnNCk7Ci0JaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbEdldFByb2NBZGRyZXNzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoIndnbEdldFByb2NBZGRyZXNzXG4iKQotCi0JaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQlyYyA9IChqaW50KXdnbEdldFByb2NBZGRyZXNzKChMUENTVFIpbHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJ3Z2xNYWtlQ3VycmVudFxuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsTWFrZUN1cnJlbnQoKEhEQylhcmcwLCAoSEdMUkMpYXJnMSk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIFdHTF9OQVRJVkUod2dsUmVhbGl6ZUxheWVyUGFsZXR0ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamJvb2xlYW4gYXJnMikKLXsKLQlERUJVR19DQUxMKCJ3Z2xSZWFsaXplTGF5ZXJQYWxldHRlXG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKChIREMpYXJnMCwgYXJnMSwgKEJPT0wpYXJnMik7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRSh3Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludEFycmF5IGFyZzQpCi17Ci0JamludCAqbHBhcmc0PU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoIndnbFNldExheWVyUGFsZXR0ZUVudHJpZXNcbiIpCi0KLQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JcmMgPSAoamludCl3Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKENPTlNUIENPTE9SUkVGICopbHBhcmc0KTsKLQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFNoYXJlTGlzdHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsU2hhcmVMaXN0c1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsU2hhcmVMaXN0cygoSEdMUkMpYXJnMCwgKEhHTFJDKWFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFN3YXBMYXllckJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsU3dhcExheWVyQnVmZmVyc1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsU3dhcExheWVyQnVmZmVycygoSERDKWFyZzAsIGFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFVzZUZvbnRCaXRtYXBzQSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JREVCVUdfQ0FMTCgid2dsVXNlRm9udEJpdG1hcHNBXG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xVc2VGb250Qml0bWFwc0EoKEhEQylhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xVc2VGb250Qml0bWFwc1cpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCURFQlVHX0NBTEwoIndnbFVzZUZvbnRCaXRtYXBzV1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsVXNlRm9udEJpdG1hcHNXKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIFdHTF9OQVRJVkUod2dsVXNlRm9udE91dGxpbmVzQSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGpmbG9hdCBhcmc0LCBqZmxvYXQgYXJnNSwgamludCBhcmc2LCBqb2JqZWN0IGFyZzcpCi17Ci0vLwlHTFlQSE1FVFJJQ1NGTE9BVCBfYXJnNywgKmxwYXJnNz1OVUxMOwotCWpib29sZWFuIHJjOwotCi0JREVCVUdfQ0FMTCgid2dsVXNlRm9udE91dGxpbmVzQVxuIikKLQotLy8JaWYgKGFyZzcpIGxwYXJnNyA9IGdldEdMWVBITUVUUklDU0ZMT0FURmllbGRzKGVudiwgYXJnNywgJl9hcmc3KTsKLQlyYyA9IChqYm9vbGVhbil3Z2xVc2VGb250T3V0bGluZXNBKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKEZMT0FUKWFyZzQsIChGTE9BVClhcmc1LCBhcmc2LCAoTFBHTFlQSE1FVFJJQ1NGTE9BVClhcmc3KTsKLS8vCWlmIChhcmc3KSBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzcsIGxwYXJnNyk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFVzZUZvbnRPdXRsaW5lc1cpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqZmxvYXQgYXJnNCwgamZsb2F0IGFyZzUsIGppbnQgYXJnNiwgam9iamVjdCBhcmc3KQotewotLy8JR0xZUEhNRVRSSUNTRkxPQVQgX2FyZzcsICpscGFyZzc9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQotCURFQlVHX0NBTEwoIndnbFVzZUZvbnRPdXRsaW5lc1dcbiIpCi0KLS8vCWlmIChhcmc3KSBscGFyZzcgPSBnZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzcsICZfYXJnNyk7Ci0JcmMgPSAoamJvb2xlYW4pd2dsVXNlRm9udE91dGxpbmVzVygoSERDKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIChGTE9BVClhcmc0LCAoRkxPQVQpYXJnNSwgYXJnNiwgKExQR0xZUEhNRVRSSUNTRkxPQVQpYXJnNyk7Ci0vLwlpZiAoYXJnNykgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoZW52LCBhcmc3LCBscGFyZzcpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBXR0xfTkFUSVZFKE1vdmVNZW1vcnlXX19Mb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9pbnRlcm5hbF93aW4zMl9HTFlQSE1FVFJJQ1NGTE9BVF8ySUkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgam9iamVjdCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTFlQSE1FVFJJQ1NGTE9BVCBfYXJnMCwgKmxwYXJnMD1OVUxMOwotCi0JREVCVUdfQ0FMTCgiTW92ZU1lbW9yeVdfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX0dMWVBITUVUUklDU0ZMT0FUXzJJSVxuIikKLQlERUJVR19DSEVDS19OVUxMKGVudiwgYXJnMSkKLQkKLQlpZiAoYXJnMCkgbHBhcmcwID0gJl9hcmcwOwotCU1vdmVNZW1vcnkoKFBWT0lEKWxwYXJnMCwgKENPTlNUIFZPSUQgKilhcmcxLCBhcmcyKTsKLQlpZiAoYXJnMCkgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoZW52LCBhcmcwLCBscGFyZzApOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFdHTF9OQVRJVkUoTW92ZU1lbW9yeUFfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX0dMWVBITUVUUklDU0ZMT0FUXzJJSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMWVBITUVUUklDU0ZMT0FUIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0KLQlERUJVR19DQUxMKCJNb3ZlTWVtb3J5QV9fTG9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfaW50ZXJuYWxfd2luMzJfR0xZUEhNRVRSSUNTRkxPQVRfMklJXG4iKQotCURFQlVHX0NIRUNLX05VTEwoZW52LCBhcmcxKQotCQotCWlmIChhcmcwKSBscGFyZzAgPSAmX2FyZzA7Ci0JTW92ZU1lbW9yeSgoUFZPSUQpbHBhcmcwLCAoQ09OU1QgVk9JRCAqKWFyZzEsIGFyZzIpOwotCWlmIChhcmcwKSBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzAsIGxwYXJnMCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvbWFrZV93aW4zMi5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9tYWtlX3dpbjMyLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9tYWtlX3dpbjMyLm1haworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgYXNzdW1lcyBKQVZBX0hPTUUgaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCBmcm9tIHdoaWNoIG5tYWtlIGlzIHJ1bgotCi1BUFBWRVI9NS4wCi0haW5jbHVkZSA8d2luMzIubWFrPgotCi1wZ21fdmVyX3N0cj0iU1dUICQobWFqX3ZlcikuJChtaW5fdmVyKSBmb3IgV2luZG93cyIKLXRpbWVzdGFtcF9zdHI9X19EQVRFX19cIiBcIl9fVElNRV9fXCIgKEVTVClcIgotY29weXJpZ2h0ID0gIkNvcHlyaWdodCAoQykgMTk5OSwgMjAwMyBJQk0gQ29ycC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuIgotCi1TV1RfUFJFRklYPWdsCi1XU19QUkVGSVg9d2luMzIKLVNXVF9MSUIgICAgID0gJChTV1RfUFJFRklYKS0kKFdTX1BSRUZJWCkuZGxsCi0KLUxJTktfTElCUyA9IG9wZW5nbDMyLmxpYiBnbHUzMi5saWIgZ2RpMzIubGliCi0KLSMgbm90ZTogdGhvcm91Z2hseSB0ZXN0IGFsbCBleGFtcGxlcyBhZnRlciBjaGFuZ2luZyBhbnkgb3B0aW1pemF0aW9uIGZsYWdzCi1TV1RfQ0RFQlVHID0gIy1aaSAtT2RpCi1TV1RfTERFQlVHID0gIy9ERUJVRyAvREVCVUdUWVBFOmJvdGgKLUNGTEFHUyA9IC1jIC1XMyAtRzYgLUdEIC1PMSAkKFNXVF9DREVCVUcpIC1ub2xvZ28gLURfWDg2Xz0xIC1EX1dJTjMyIC1EX1dJTjk1IC1EX1dJTjMyX1dJTkRPV1M9MHgwNDAwIC1EX01UIC1NVCAtRFdJTjMyIC1EX1dJTjMyX0RDT00gL0kkKEpBVkFfSE9NRSlcaW5jbHVkZSAvSS4KLVJDRkxBR1MgPSAtRFNXVF9DT01NQV9WRVJTSU9OPSQoY29tbWFfdmVyKQotTEZMQUdTID0gL0lOQ1JFTUVOVEFMOk5PIC9QREI6Tk9ORSAvUkVMRUFTRSAvTk9MT0dPICQoU1dUX0xERUJVRykgLWVudHJ5Ol9EbGxNYWluQ1JUU3RhcnR1cEAxMiAtZGxsIC9CQVNFOjB4MTAwMDAwMDAgL2NvbW1lbnQ6JChwZ21fdmVyX3N0cikgL2NvbW1lbnQ6JChjb3B5cmlnaHQpIC9ETEwKLQotU1dUX09CSlMgPSBzd3Qub2JqIGdsLm9iaiBnbHUub2JqIGdsdy5vYmogc3RydWN0cy5vYmoKLQotYWxsOiAkKFNXVF9MSUIpCi0KLS5jLm9iajoKLQljbCAkKENGTEFHUykgJCouYwotCi0kKFNXVF9MSUIpOiAkKFNXVF9PQkpTKSBzd3QucmVzCi0JZWNobyAkKExGTEFHUykgPnRlbXBscmYKLQllY2hvICQoTElOS19MSUJTKSA+PnRlbXBscmYKLQllY2hvIC1tYWNoaW5lOklYODYgPj50ZW1wbHJmCi0JZWNobyAtc3Vic3lzdGVtOndpbmRvd3MgPj50ZW1wbHJmCi0JZWNobyAtb3V0OiQoU1dUX0xJQikgPj50ZW1wbHJmCi0JZWNobyAkKFNXVF9PQkpTKSA+PnRlbXBscmYKLQllY2hvIHN3dC5yZXMgPj50ZW1wbHJmCi0JbGluayBAdGVtcGxyZgotCWRlbCB0ZW1wbHJmCi0JCi1zd3QucmVzOgotCXJjICQoUkNGTEFHUykgLURTV1RfT1JHX0ZJTEVOQU1FPVwiJChTV1RfTElCKVwiIC1yIC1mbyBzd3QucmVzIHN3dC5yYwotCQotY2xlYW46Ci0gICAgZGVsICoub2JqICoucmVzICouZGxsICoubGliICouZXhwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODQzNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3RydWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzd3QuaCIKLSNpbmNsdWRlICJzdHJ1Y3RzLmgiCi0KLXR5cGVkZWYgc3RydWN0IEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRSB7Ci0JaW50IGNhY2hlZDsKLQlqY2xhc3MgY2xheno7Ci0JamZpZWxkSUQgZ21mQ2VsbEluY1ksIGdtZkNlbGxJbmNYLCBnbWZwdEdseXBoT3JpZ2luX3ksIGdtZnB0R2x5cGhPcmlnaW5feCwgZ21mQmxhY2tCb3hZLCBnbWZCbGFja0JveFg7Ci19IEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRTsKLXR5cGVkZWYgR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFICpQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFOwotCi1HTFlQSE1FVFJJQ1NGTE9BVF9GSURfQ0FDSEUgR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQotdm9pZCBjYWNoZUdMWVBITUVUUklDU0ZMT0FURmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+Z21mQ2VsbEluY1kgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdtZkNlbGxJbmNZIiwgIkYiKTsKLQlscENhY2hlLT5nbWZDZWxsSW5jWCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mQ2VsbEluY1giLCAiRiIpOwotCWxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mcHRHbHlwaE9yaWdpbl95IiwgIkYiKTsKLQlscENhY2hlLT5nbWZwdEdseXBoT3JpZ2luX3ggPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdtZnB0R2x5cGhPcmlnaW5feCIsICJGIik7Ci0JbHBDYWNoZS0+Z21mQmxhY2tCb3hZID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJnbWZCbGFja0JveFkiLCAiRiIpOwotCWxwQ2FjaGUtPmdtZkJsYWNrQm94WCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mQmxhY2tCb3hYIiwgIkYiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1HTFlQSE1FVFJJQ1NGTE9BVCAqZ2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIEdMWVBITUVUUklDU0ZMT0FUICpscFN0cnVjdCkKLXsKLQlQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUgPSAmR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVHTFlQSE1FVFJJQ1NGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPmdtZkNlbGxJbmNZID0gKCplbnYpLT5HZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNZKTsKLQlscFN0cnVjdC0+Z21mQ2VsbEluY1ggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mQ2VsbEluY1gpOwotCWxwU3RydWN0LT5nbWZwdEdseXBoT3JpZ2luLnkgPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mcHRHbHlwaE9yaWdpbl95KTsKLQlscFN0cnVjdC0+Z21mcHRHbHlwaE9yaWdpbi54ID0gKCplbnYpLT5HZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feCk7Ci0JbHBTdHJ1Y3QtPmdtZkJsYWNrQm94WSA9ICgqZW52KS0+R2V0RmxvYXRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5nbWZCbGFja0JveFkpOwotCWxwU3RydWN0LT5nbWZCbGFja0JveFggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mQmxhY2tCb3hYKTsKLQlyZXR1cm4gbHBTdHJ1Y3Q7Ci19Ci0KLXZvaWQgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIEdMWVBITUVUUklDU0ZMT0FUICpscFN0cnVjdCkKLXsKLQlQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUgPSAmR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVHTFlQSE1FVFJJQ1NGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNZLCAoamZsb2F0KWxwU3RydWN0LT5nbWZDZWxsSW5jWSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNYLCAoamZsb2F0KWxwU3RydWN0LT5nbWZDZWxsSW5jWCk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feSwgKGpmbG9hdClscFN0cnVjdC0+Z21mcHRHbHlwaE9yaWdpbi55KTsKLQkoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mcHRHbHlwaE9yaWdpbl94LCAoamZsb2F0KWxwU3RydWN0LT5nbWZwdEdseXBoT3JpZ2luLngpOwotCSgqZW52KS0+U2V0RmxvYXRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5nbWZCbGFja0JveFksIChqZmxvYXQpbHBTdHJ1Y3QtPmdtZkJsYWNrQm94WSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkJsYWNrQm94WCwgKGpmbG9hdClscFN0cnVjdC0+Z21mQmxhY2tCb3hYKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCBjclRyYW5zcGFyZW50LCBiUmVzZXJ2ZWQsIGlMYXllclBsYW5lLCBjQXV4QnVmZmVycywgY1N0ZW5jaWxCaXRzLCBjRGVwdGhCaXRzLCBjQWNjdW1BbHBoYUJpdHMsIGNBY2N1bUJsdWVCaXRzLCBjQWNjdW1HcmVlbkJpdHMsIGNBY2N1bVJlZEJpdHMsIGNBY2N1bUJpdHMsIGNBbHBoYVNoaWZ0LCBjQWxwaGFCaXRzLCBjQmx1ZVNoaWZ0LCBjQmx1ZUJpdHMsIGNHcmVlblNoaWZ0LCBjR3JlZW5CaXRzLCBjUmVkU2hpZnQsIGNSZWRCaXRzLCBjQ29sb3JCaXRzLCBpUGl4ZWxUeXBlLCBkd0ZsYWdzLCBuVmVyc2lvbiwgblNpemU7Ci19IExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRTsKLXR5cGVkZWYgTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFICpQTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFOwotCi1MQVlFUlBMQU5FREVTQ1JJUFRPUl9GSURfQ0FDSEUgTEFZRVJQTEFORURFU0NSSVBUT1JGYzsKLQotdm9pZCBjYWNoZUxBWUVSUExBTkVERVNDUklQVE9SRmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY3JUcmFuc3BhcmVudCIsICJJIik7Ci0JbHBDYWNoZS0+YlJlc2VydmVkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiUmVzZXJ2ZWQiLCAiQiIpOwotCWxwQ2FjaGUtPmlMYXllclBsYW5lID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJpTGF5ZXJQbGFuZSIsICJCIik7Ci0JbHBDYWNoZS0+Y0F1eEJ1ZmZlcnMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBdXhCdWZmZXJzIiwgIkIiKTsKLQlscENhY2hlLT5jU3RlbmNpbEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNTdGVuY2lsQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0RlcHRoQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0RlcHRoQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1BbHBoYUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUJsdWVCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1CbHVlQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1HcmVlbkJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBY2N1bVJlZEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBY2N1bUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBbHBoYVNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWxwaGFTaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0FscGhhQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FscGhhQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0JsdWVTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0JsdWVTaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0JsdWVCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQmx1ZUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNHcmVlblNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjR3JlZW5TaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0dyZWVuQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0dyZWVuQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y1JlZFNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjUmVkU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNSZWRCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjUmVkQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0NvbG9yQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0NvbG9yQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+aVBpeGVsVHlwZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiaVBpeGVsVHlwZSIsICJCIik7Ci0JbHBDYWNoZS0+ZHdGbGFncyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZHdGbGFncyIsICJJIik7Ci0JbHBDYWNoZS0+blZlcnNpb24gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgIm5WZXJzaW9uIiwgIlMiKTsKLQlscENhY2hlLT5uU2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiblNpemUiLCAiUyIpOwotCWxwQ2FjaGUtPmNhY2hlZCA9IDE7Ci19Ci0KLUxBWUVSUExBTkVERVNDUklQVE9SICpnZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgTEFZRVJQTEFORURFU0NSSVBUT1IgKmxwU3RydWN0KQotewotCVBMQVlFUlBMQU5FREVTQ1JJUFRPUl9GSURfQ0FDSEUgbHBDYWNoZSA9ICZMQVlFUlBMQU5FREVTQ1JJUFRPUkZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZUxBWUVSUExBTkVERVNDUklQVE9SRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQlscFN0cnVjdC0+Y3JUcmFuc3BhcmVudCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCk7Ci0JbHBTdHJ1Y3QtPmJSZXNlcnZlZCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCk7Ci0JbHBTdHJ1Y3QtPmlMYXllclBsYW5lID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+aUxheWVyUGxhbmUpOwotCWxwU3RydWN0LT5jQXV4QnVmZmVycyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBdXhCdWZmZXJzKTsKLQlscFN0cnVjdC0+Y1N0ZW5jaWxCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzKTsKLQlscFN0cnVjdC0+Y0RlcHRoQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNEZXB0aEJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1BbHBoYUJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1BbHBoYUJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1CbHVlQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUJsdWVCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtR3JlZW5CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtUmVkQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBbHBoYVNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhU2hpZnQpOwotCWxwU3RydWN0LT5jQWxwaGFCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhQml0cyk7Ci0JbHBTdHJ1Y3QtPmNCbHVlU2hpZnQgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQmx1ZVNoaWZ0KTsKLQlscFN0cnVjdC0+Y0JsdWVCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVCaXRzKTsKLQlscFN0cnVjdC0+Y0dyZWVuU2hpZnQgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5TaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNHcmVlbkJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5CaXRzKTsKLQlscFN0cnVjdC0+Y1JlZFNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZFNoaWZ0KTsKLQlscFN0cnVjdC0+Y1JlZEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jUmVkQml0cyk7Ci0JbHBTdHJ1Y3QtPmNDb2xvckJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQ29sb3JCaXRzKTsKLQlscFN0cnVjdC0+aVBpeGVsVHlwZSA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlQaXhlbFR5cGUpOwotCWxwU3RydWN0LT5kd0ZsYWdzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0ZsYWdzKTsKLQlscFN0cnVjdC0+blZlcnNpb24gPSAoKmVudiktPkdldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blZlcnNpb24pOwotCWxwU3RydWN0LT5uU2l6ZSA9ICgqZW52KS0+R2V0U2hvcnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5uU2l6ZSk7Ci0JcmV0dXJuIGxwU3RydWN0OwotfQotCi12b2lkIHNldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBMQVlFUlBMQU5FREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpCi17Ci0JUExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlID0gJkxBWUVSUExBTkVERVNDUklQVE9SRmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlTEFZRVJQTEFORURFU0NSSVBUT1JGaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCwgKGppbnQpbHBTdHJ1Y3QtPmNyVHJhbnNwYXJlbnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCwgKGpieXRlKWxwU3RydWN0LT5iUmVzZXJ2ZWQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlMYXllclBsYW5lLCAoamJ5dGUpbHBTdHJ1Y3QtPmlMYXllclBsYW5lKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQXV4QnVmZmVycywgKGpieXRlKWxwU3RydWN0LT5jQXV4QnVmZmVycyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNTdGVuY2lsQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0RlcHRoQml0cywgKGpieXRlKWxwU3RydWN0LT5jRGVwdGhCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1BbHBoYUJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtQWxwaGFCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CbHVlQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1CbHVlQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUdyZWVuQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtUmVkQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1SZWRCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYVNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNBbHBoYVNoaWZ0KTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWxwaGFCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBbHBoYUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlU2hpZnQsIChqYnl0ZSlscFN0cnVjdC0+Y0JsdWVTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNCbHVlQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuU2hpZnQsIChqYnl0ZSlscFN0cnVjdC0+Y0dyZWVuU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNHcmVlbkJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0dyZWVuQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZFNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNSZWRTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y1JlZEJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNDb2xvckJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0NvbG9yQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+aVBpeGVsVHlwZSwgKGpieXRlKWxwU3RydWN0LT5pUGl4ZWxUeXBlKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3RmxhZ3MsIChqaW50KWxwU3RydWN0LT5kd0ZsYWdzKTsKLQkoKmVudiktPlNldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blZlcnNpb24sIChqc2hvcnQpbHBTdHJ1Y3QtPm5WZXJzaW9uKTsKLQkoKmVudiktPlNldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blNpemUsIChqc2hvcnQpbHBTdHJ1Y3QtPm5TaXplKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgUE9JTlRGTE9BVF9GSURfQ0FDSEUgewotCWludCBjYWNoZWQ7Ci0JamNsYXNzIGNsYXp6OwotCWpmaWVsZElEIHksIHg7Ci19IFBPSU5URkxPQVRfRklEX0NBQ0hFOwotdHlwZWRlZiBQT0lOVEZMT0FUX0ZJRF9DQUNIRSAqUFBPSU5URkxPQVRfRklEX0NBQ0hFOwotCi1QT0lOVEZMT0FUX0ZJRF9DQUNIRSBQT0lOVEZMT0FURmM7Ci0KLXZvaWQgY2FjaGVQT0lOVEZMT0FURmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUFBPSU5URkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUpCi17Ci0JaWYgKGxwQ2FjaGUtPmNhY2hlZCkgcmV0dXJuOwotCWxwQ2FjaGUtPmNsYXp6ID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KTsKLQlscENhY2hlLT55ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJ5IiwgIkYiKTsKLQlscENhY2hlLT54ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJ4IiwgIkYiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1QT0lOVEZMT0FUICpnZXRQT0lOVEZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQT0lOVEZMT0FUICpscFN0cnVjdCkKLXsKLQlQUE9JTlRGTE9BVF9GSURfQ0FDSEUgbHBDYWNoZSA9ICZQT0lOVEZMT0FURmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlUE9JTlRGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPnkgPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eSk7Ci0JbHBTdHJ1Y3QtPnggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eCk7Ci0JcmV0dXJuIGxwU3RydWN0OwotfQotCi12b2lkIHNldFBPSU5URkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBPSU5URkxPQVQgKmxwU3RydWN0KQotewotCVBQT0lOVEZMT0FUX0ZJRF9DQUNIRSBscENhY2hlID0gJlBPSU5URkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVQT0lOVEZMT0FURmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQkoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eSwgKGpmbG9hdClscFN0cnVjdC0+eSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPngsIChqZmxvYXQpbHBTdHJ1Y3QtPngpOwotfQotCi10eXBlZGVmIHN0cnVjdCBQSVhFTEZPUk1BVERFU0NSSVBUT1JfRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCBkd0RhbWFnZU1hc2ssIGR3VmlzaWJsZU1hc2ssIGR3TGF5ZXJNYXNrLCBiUmVzZXJ2ZWQsIGlMYXllclR5cGUsIGNBdXhCdWZmZXJzLCBjU3RlbmNpbEJpdHMsIGNEZXB0aEJpdHMsIGNBY2N1bUFscGhhQml0cywgY0FjY3VtQmx1ZUJpdHMsIGNBY2N1bUdyZWVuQml0cywgY0FjY3VtUmVkQml0cywgY0FjY3VtQml0cywgY0FscGhhU2hpZnQsIGNBbHBoYUJpdHMsIGNCbHVlU2hpZnQsIGNCbHVlQml0cywgY0dyZWVuU2hpZnQsIGNHcmVlbkJpdHMsIGNSZWRTaGlmdCwgY1JlZEJpdHMsIGNDb2xvckJpdHMsIGlQaXhlbFR5cGUsIGR3RmxhZ3MsIG5WZXJzaW9uLCBuU2l6ZTsKLX0gUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRTsKLXR5cGVkZWYgUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSAqUFBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEU7Ci0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEUgUElYRUxGT1JNQVRERVNDUklQVE9SRmM7Ci0KLXZvaWQgY2FjaGVQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJkd0RhbWFnZU1hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmR3VmlzaWJsZU1hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImR3VmlzaWJsZU1hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmR3TGF5ZXJNYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJkd0xheWVyTWFzayIsICJJIik7Ci0JbHBDYWNoZS0+YlJlc2VydmVkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiUmVzZXJ2ZWQiLCAiQiIpOwotCWxwQ2FjaGUtPmlMYXllclR5cGUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImlMYXllclR5cGUiLCAiQiIpOwotCWxwQ2FjaGUtPmNBdXhCdWZmZXJzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQXV4QnVmZmVycyIsICJCIik7Ci0JbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjU3RlbmNpbEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNEZXB0aEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNEZXB0aEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUFscGhhQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtQWxwaGFCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1CbHVlQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtQmx1ZUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtR3JlZW5CaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1SZWRCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1SZWRCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1CaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1CaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWxwaGFTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FscGhhU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNBbHBoYUJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBbHBoYUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNCbHVlU2hpZnQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNCbHVlU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNCbHVlQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0JsdWVCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jR3JlZW5TaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0dyZWVuU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNHcmVlbkJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNHcmVlbkJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNSZWRTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY1JlZFNoaWZ0IiwgIkIiKTsKLQlscENhY2hlLT5jUmVkQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY1JlZEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNDb2xvckJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNDb2xvckJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmlQaXhlbFR5cGUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImlQaXhlbFR5cGUiLCAiQiIpOwotCWxwQ2FjaGUtPmR3RmxhZ3MgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImR3RmxhZ3MiLCAiSSIpOwotCWxwQ2FjaGUtPm5WZXJzaW9uID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJuVmVyc2lvbiIsICJTIik7Ci0JbHBDYWNoZS0+blNpemUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgIm5TaXplIiwgIlMiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1QSVhFTEZPUk1BVERFU0NSSVBUT1IgKmdldFBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUElYRUxGT1JNQVRERVNDUklQVE9SICpscFN0cnVjdCkKLXsKLQlQUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlID0gJlBJWEVMRk9STUFUREVTQ1JJUFRPUkZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPmR3RGFtYWdlTWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrKTsKLQlscFN0cnVjdC0+ZHdWaXNpYmxlTWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdWaXNpYmxlTWFzayk7Ci0JbHBTdHJ1Y3QtPmR3TGF5ZXJNYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0xheWVyTWFzayk7Ci0JbHBTdHJ1Y3QtPmJSZXNlcnZlZCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCk7Ci0JbHBTdHJ1Y3QtPmlMYXllclR5cGUgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5pTGF5ZXJUeXBlKTsKLQlscFN0cnVjdC0+Y0F1eEJ1ZmZlcnMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQXV4QnVmZmVycyk7Ci0JbHBTdHJ1Y3QtPmNTdGVuY2lsQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNTdGVuY2lsQml0cyk7Ci0JbHBTdHJ1Y3QtPmNEZXB0aEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jRGVwdGhCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQWxwaGFCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQmx1ZUJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CbHVlQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBY2N1bUdyZWVuQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBY2N1bVJlZEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1SZWRCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUJpdHMpOwotCWxwU3RydWN0LT5jQWxwaGFTaGlmdCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYVNoaWZ0KTsKLQlscFN0cnVjdC0+Y0FscGhhQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYUJpdHMpOwotCWxwU3RydWN0LT5jQmx1ZVNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVTaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNCbHVlQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlQml0cyk7Ci0JbHBTdHJ1Y3QtPmNHcmVlblNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuU2hpZnQpOwotCWxwU3RydWN0LT5jR3JlZW5CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuQml0cyk7Ci0JbHBTdHJ1Y3QtPmNSZWRTaGlmdCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRTaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNSZWRCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZEJpdHMpOwotCWxwU3RydWN0LT5jQ29sb3JCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0NvbG9yQml0cyk7Ci0JbHBTdHJ1Y3QtPmlQaXhlbFR5cGUgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5pUGl4ZWxUeXBlKTsKLQlscFN0cnVjdC0+ZHdGbGFncyA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdGbGFncyk7Ci0JbHBTdHJ1Y3QtPm5WZXJzaW9uID0gKCplbnYpLT5HZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5WZXJzaW9uKTsKLQlscFN0cnVjdC0+blNpemUgPSAoKmVudiktPkdldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blNpemUpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpCi17Ci0JUFBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEUgbHBDYWNoZSA9ICZQSVhFTEZPUk1BVERFU0NSSVBUT1JGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrLCAoamludClscFN0cnVjdC0+ZHdEYW1hZ2VNYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3VmlzaWJsZU1hc2ssIChqaW50KWxwU3RydWN0LT5kd1Zpc2libGVNYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3TGF5ZXJNYXNrLCAoamludClscFN0cnVjdC0+ZHdMYXllck1hc2spOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCwgKGpieXRlKWxwU3RydWN0LT5iUmVzZXJ2ZWQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlMYXllclR5cGUsIChqYnl0ZSlscFN0cnVjdC0+aUxheWVyVHlwZSk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0F1eEJ1ZmZlcnMsIChqYnl0ZSlscFN0cnVjdC0+Y0F1eEJ1ZmZlcnMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNTdGVuY2lsQml0cywgKGpieXRlKWxwU3RydWN0LT5jU3RlbmNpbEJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNEZXB0aEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0RlcHRoQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUFscGhhQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQmx1ZUJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtQmx1ZUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1HcmVlbkJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtUmVkQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1CaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWxwaGFTaGlmdCwgKGpieXRlKWxwU3RydWN0LT5jQWxwaGFTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWxwaGFCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQmx1ZVNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNCbHVlU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlQml0cywgKGpieXRlKWxwU3RydWN0LT5jQmx1ZUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNHcmVlblNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNHcmVlblNoaWZ0KTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNHcmVlbkJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRTaGlmdCwgKGpieXRlKWxwU3RydWN0LT5jUmVkU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNSZWRCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQ29sb3JCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNDb2xvckJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlQaXhlbFR5cGUsIChqYnl0ZSlscFN0cnVjdC0+aVBpeGVsVHlwZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0ZsYWdzLCAoamludClscFN0cnVjdC0+ZHdGbGFncyk7Ci0JKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5WZXJzaW9uLCAoanNob3J0KWxwU3RydWN0LT5uVmVyc2lvbik7Ci0JKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5TaXplLCAoanNob3J0KWxwU3RydWN0LT5uU2l6ZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N0cnVjdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjNjJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotR0xZUEhNRVRSSUNTRkxPQVQgKmdldEdMWVBITUVUUklDU0ZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBHTFlQSE1FVFJJQ1NGTE9BVCAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgR0xZUEhNRVRSSUNTRkxPQVQgKmxwU3RydWN0KTsKLQotTEFZRVJQTEFORURFU0NSSVBUT1IgKmdldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBMQVlFUlBMQU5FREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgTEFZRVJQTEFORURFU0NSSVBUT1IgKmxwU3RydWN0KTsKLQotUE9JTlRGTE9BVCAqZ2V0UE9JTlRGTE9BVEZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUE9JTlRGTE9BVCAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRQT0lOVEZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQT0lOVEZMT0FUICpscFN0cnVjdCk7Ci0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUiAqZ2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgKmxwU3RydWN0KTsKLXZvaWQgc2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgKmxwU3RydWN0KTsKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3d0LnJjIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3d0LnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIzNTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N3dC5yYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAid2luZG93cy5oIgotCi1WU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KLSBQUk9EVUNUVkVSU0lPTiAwLDAsMCwwCi0gRklMRUZMQUdTTUFTSyAweDNmTAotI2lmZGVmIF9ERUJVRwotIEZJTEVGTEFHUyAweDFMCi0jZWxzZQotIEZJTEVGTEFHUyAweDBMCi0jZW5kaWYKLSBGSUxFT1MgMHg0MDAwMEwKLSBGSUxFVFlQRSAweDJMCi0gRklMRVNVQlRZUEUgMHgwTAotQkVHSU4KLSAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gICAgQkVHSU4KLSAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIgotICAgICAgICBCRUdJTgotICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIklCTSBDb3Jwb3JhdGlvblwwIgotICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdFwwIgotICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJTV1RcMCIKLSAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICKpIENvcHlyaWdodCAyMDAwLCAyMDAzIElCTSBDb3JwLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cMCIKLSAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgU1dUX09SR19GSUxFTkFNRQotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlwwIgotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjAsMCwwLDBcMCIKLSAgICAgICAgRU5ECi0gICAgRU5ECi0gICAgQkxPQ0sgIlZhckZpbGVJbmZvIgotICAgIEJFR0lOCi0gICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCi0gICAgRU5ECi1FTkQKLQotLyogU0hNRU5VQkFSIFBvY2tldCBQQyAKLSAqIElEX01FTlUgU0hNRU5VQkFSIERJU0NBUkRBQkxFCi0gKiBCRUdJTgotICogCUlEX01FTlUsIDEsCi0gKiAgSU1BR0VfTk9ORSwgSURfTUVOVV9JVEVNMSwgMCwgMCwKLSAqICAwLCAwLCAwLAotICogRU5ECi0gKiBJRF9NRU5VIE1FTlUgRElTQ0FSREFCTEUKLSAqIEJFR0lOCi0gKiAgTUVOVUlURU0gIiIsIElEX01FTlVfSVRFTTEKLSAqIEVORAotICovCi0xMDAgUkNEQVRBIERJU0NBUkRBQkxFIAotQkVHSU4KLSAgICAxMDAsIDEsCi0gICAgLTIsIDEwMSwgMCwgMCwgCi0gICAgMCwgMCwgMCwKLUVORAotCi0xMDAgTUVOVSBESVNDQVJEQUJMRQotQkVHSU4KLQlNRU5VSVRFTSAiIiwgMTAxCi1FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENhbnZhcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiMWExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENhbnZhcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogR0xDYW52YXMgaXMgYSB3aWRnZXQgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIE9wZW5HTCBjb250ZW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyB7Ci0JaW50IGNvbnRleHQ7Ci0JaW50IHBpeGVsRm9ybWF0OwotCi0vKioKLSAqIENyZWF0ZSBhIEdMQ2FudmFzIHdpZGdldCB1c2luZyB0aGUgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gdGhlIEdMRGF0YQotICogb2JqZWN0IHByb3ZpZGVkLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgYSBjb21wb3NpdGUgd2lkZ2V0Ci0gKiBAcGFyYW0gc3R5bGUgdGhlIGJpdHdpc2UgT1InaW5nIG9mIHdpZGdldCBzdHlsZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBvZiB0aGUgR0xDYW52YXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICogPHVsPjxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gdGhlIGRhdGEgaXMgbnVsbAotICogICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCB3aGVuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBjYW5ub3QgYmUgcHJvdmlkZWQ8L3VsPiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX0NSRUFURV9PQkpFQ1Qgd2hlbiBmYWlsZWQgdG8gY3JlYXRlIE9MRSBPYmplY3QKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX09QRU5fRklMRSB3aGVuIGZhaWxlZCB0byBvcGVuIGZpbGUKLSAqICAgICA8bGk+RVJST1JfSU5URVJGQUNFX05PVF9GT1VORCB3aGVuIHVuYWJsZSB0byBjcmVhdGUgY2FsbGJhY2tzIGZvciBPTEUgSW50ZXJmYWNlcwotICogICAgIDxsaT5FUlJPUl9JTlZBTElEX0NMQVNTSUQKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBHTENhbnZhcyAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBHTERhdGEgZGF0YSkgewotCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKLQlpZiAoZGF0YSA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQotCVBJWEVMRk9STUFUREVTQ1JJUFRPUiBwZmQgPSBuZXcgUElYRUxGT1JNQVRERVNDUklQVE9SICgpOwotCXBmZC5uU2l6ZSA9IChzaG9ydCkgUElYRUxGT1JNQVRERVNDUklQVE9SLnNpemVvZjsKLQlwZmQublZlcnNpb24gPSAxOwotCXBmZC5kd0ZsYWdzID0gV0dMLlBGRF9EUkFXX1RPX1dJTkRPVyB8IFdHTC5QRkRfU1VQUE9SVF9PUEVOR0w7Ci0JcGZkLmR3TGF5ZXJNYXNrID0gV0dMLlBGRF9NQUlOX1BMQU5FOwotCXBmZC5pUGl4ZWxUeXBlID0gKGJ5dGUpIFdHTC5QRkRfVFlQRV9SR0JBOwotCWlmIChkYXRhLmRvdWJsZUJ1ZmZlcikgcGZkLmR3RmxhZ3MgfD0gV0dMLlBGRF9ET1VCTEVCVUZGRVI7Ci0JaWYgKGRhdGEuc3RlcmVvKSBwZmQuZHdGbGFncyB8PSBXR0wuUEZEX1NURVJFTzsKLQlwZmQuY1JlZEJpdHMgPSAoYnl0ZSkgZGF0YS5yZWRTaXplOwotCXBmZC5jR3JlZW5CaXRzID0gKGJ5dGUpIGRhdGEuZ3JlZW5TaXplOwotCXBmZC5jQmx1ZUJpdHMgPSAoYnl0ZSkgZGF0YS5ibHVlU2l6ZTsKLQlwZmQuY0FscGhhQml0cyA9IChieXRlKSBkYXRhLmFscGhhU2l6ZTsKLQlwZmQuY0RlcHRoQml0cyA9IChieXRlKSBkYXRhLmRlcHRoU2l6ZTsKLQlwZmQuY1N0ZW5jaWxCaXRzID0gKGJ5dGUpIGRhdGEuc3RlbmNpbFNpemU7Ci0JcGZkLmNBY2N1bVJlZEJpdHMgPSAoYnl0ZSkgZGF0YS5hY2N1bVJlZFNpemU7Ci0JcGZkLmNBY2N1bUdyZWVuQml0cyA9IChieXRlKSBkYXRhLmFjY3VtR3JlZW5TaXplOwotCXBmZC5jQWNjdW1CbHVlQml0cyA9IChieXRlKSBkYXRhLmFjY3VtQmx1ZVNpemU7Ci0JcGZkLmNBY2N1bUFscGhhQml0cyA9IChieXRlKSBkYXRhLmFjY3VtQWxwaGFTaXplOwotCXBmZC5jQWNjdW1CaXRzID0gKGJ5dGUpIChwZmQuY0FjY3VtUmVkQml0cyArIHBmZC5jQWNjdW1HcmVlbkJpdHMgKyBwZmQuY0FjY3VtQmx1ZUJpdHMgKyBwZmQuY0FjY3VtQWxwaGFCaXRzKTsKLQkvL0ZJWE1FIC0gdXNlIHdnbENob29zZVBpeGVsRm9ybWF0QVJCCi0vLwlpZiAoZGF0YS5zYW1wbGVCdWZmZXJzID4gMCkgewotLy8JCXdnbEF0dHJpYiBbcG9zKytdID0gV0dMLldHTF9TQU1QTEVfQlVGRkVSU19BUkI7Ci0vLwkJd2dsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZUJ1ZmZlcnM7Ci0vLwl9Ci0vLwlpZiAoZGF0YS5zYW1wbGVzID4gMCkgewotLy8JCXdnbEF0dHJpYiBbcG9zKytdID0gV0dMLldHTF9TQU1QTEVTX0FSQjsKLS8vCQl3Z2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuc2FtcGxlczsKLS8vCX0KLQotCWludCBoREMgPSBPUy5HZXREQyAoaGFuZGxlKTsKLQlwaXhlbEZvcm1hdCA9IFdHTC5DaG9vc2VQaXhlbEZvcm1hdCAoaERDLCBwZmQpOwotCWlmIChwaXhlbEZvcm1hdCA9PSAwKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci0JfQotCWlmICghV0dMLlNldFBpeGVsRm9ybWF0IChoREMsIHBpeGVsRm9ybWF0LCBwZmQpKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci0JfQotCWNvbnRleHQgPSBXR0wud2dsQ3JlYXRlQ29udGV4dCAoaERDKTsKLQlpZiAoY29udGV4dCA9PSAwKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQl9Ci0JT1MuUmVsZWFzZURDIChoYW5kbGUsIGhEQyk7Ci0vLwlpZiAoc2hhcmUgIT0gbnVsbCkgewotLy8JCVdHTC53Z2xTaGFyZUxpc3RzIChjb250ZXh0LCBzaGFyZS5jb250ZXh0KTsKLS8vCX0KLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJCVdHTC53Z2xEZWxldGVDb250ZXh0IChjb250ZXh0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlQSVhFTEZPUk1BVERFU0NSSVBUT1IgcGZkID0gbmV3IFBJWEVMRk9STUFUREVTQ1JJUFRPUiAoKTsKLQlwZmQublNpemUgPSAoc2hvcnQpIFBJWEVMRk9STUFUREVTQ1JJUFRPUi5zaXplb2Y7Ci0JaW50IGhEQyA9IE9TLkdldERDIChoYW5kbGUpOwotCVdHTC5EZXNjcmliZVBpeGVsRm9ybWF0KGhEQywgcGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUi5zaXplb2YsIHBmZCk7Ci0JT1MuUmVsZWFzZURDIChoYW5kbGUsIGhEQyk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSAocGZkLmR3RmxhZ3MgJiBXR0wuUEZEX0RPVUJMRUJVRkZFUikgIT0gMDsKLQlkYXRhLnN0ZXJlbyA9IChwZmQuZHdGbGFncyAmIFdHTC5QRkRfU1RFUkVPKSAhPSAwOwotCWRhdGEucmVkU2l6ZSA9IHBmZC5jUmVkQml0czsKLQlkYXRhLmdyZWVuU2l6ZSA9IHBmZC5jR3JlZW5CaXRzOwotCWRhdGEuYmx1ZVNpemUgPSBwZmQuY0JsdWVCaXRzOwotCWRhdGEuYWxwaGFTaXplID0gcGZkLmNBbHBoYUJpdHM7Ci0JZGF0YS5kZXB0aFNpemUgPSBwZmQuY0RlcHRoQml0czsKLQlkYXRhLnN0ZW5jaWxTaXplID0gcGZkLmNTdGVuY2lsQml0czsKLQlkYXRhLmFjY3VtUmVkU2l6ZSA9IHBmZC5jQWNjdW1SZWRCaXRzOwotCWRhdGEuYWNjdW1HcmVlblNpemUgPSBwZmQuY0FjY3VtR3JlZW5CaXRzOwotCWRhdGEuYWNjdW1CbHVlU2l6ZSA9IHBmZC5jQWNjdW1CbHVlQml0czsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gcGZkLmNBY2N1bUFscGhhQml0czsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgT3BlbkdMIGNvbnRleHQKLSAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQuCi0gKiAgCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhvbGRzIHRoZSBjdXJyZW50IE9wZW5HTCBjb250ZXh0LAotICogZmFsc2Ugb3RoZXJ3aXNlCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIFdHTC53Z2xHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBoYW5kbGU7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgT3BlbkdMIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR0xDYW52YXMgdG8gYmUgdGhlCi0gKiBjdXJyZW50IEdMIGNvbnRleHQuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Q3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKFdHTC53Z2xHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBoYW5kbGUpIHJldHVybjsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLndnbE1ha2VDdXJyZW50IChoREMsIGNvbnRleHQpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotCi0vKioKLSAqIFN3YXBzIHRoZSBmcm9udCBhbmQgYmFjayBjb2xvciBidWZmZXJzLgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLlN3YXBCdWZmZXJzIChoREMpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL0xBWUVSUExBTkVERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjc0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLndpbjMyOwotCi0KLXB1YmxpYyBjbGFzcyBMQVlFUlBMQU5FREVTQ1JJUFRPUiB7Ci0gICAgcHVibGljIHNob3J0IG5TaXplOwotICAgIHB1YmxpYyBzaG9ydCBuVmVyc2lvbjsKLSAgICBwdWJsaWMgaW50IGR3RmxhZ3M7Ci0gICAgcHVibGljIGJ5dGUgaVBpeGVsVHlwZTsKLSAgICBwdWJsaWMgYnl0ZSBjQ29sb3JCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNHcmVlblNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNCbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQmx1ZVNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNBbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1SZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUdyZWVuQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1BbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0RlcHRoQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjU3RlbmNpbEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0F1eEJ1ZmZlcnM7Ci0gICAgcHVibGljIGJ5dGUgaUxheWVyUGxhbmU7Ci0gICAgcHVibGljIGJ5dGUgYlJlc2VydmVkOwotICAgIHB1YmxpYyBpbnQgY3JUcmFuc3BhcmVudDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSAzNjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1BJWEVMRk9STUFUREVTQ1JJUFRPUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTcwMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMjsKLQotCi1wdWJsaWMgY2xhc3MgUElYRUxGT1JNQVRERVNDUklQVE9SIHsKLSAgIAlwdWJsaWMgc2hvcnQgblNpemU7Ci0gICAgcHVibGljIHNob3J0IG5WZXJzaW9uOwotICAgIHB1YmxpYyBpbnQgZHdGbGFnczsKLSAgICBwdWJsaWMgYnl0ZSBpUGl4ZWxUeXBlOwotICAgIHB1YmxpYyBieXRlIGNDb2xvckJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZFNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNHcmVlbkJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0dyZWVuU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0JsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNCbHVlU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWxwaGFTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bVJlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUJsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUFscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjRGVwdGhCaXRzOwotICAgIHB1YmxpYyBieXRlIGNTdGVuY2lsQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQXV4QnVmZmVyczsKLSAgICBwdWJsaWMgYnl0ZSBpTGF5ZXJUeXBlOwotICAgIHB1YmxpYyBieXRlIGJSZXNlcnZlZDsKLSAgICBwdWJsaWMgaW50IGR3TGF5ZXJNYXNrOwotICAgIHB1YmxpYyBpbnQgZHdWaXNpYmxlTWFzazsKLSAgICBwdWJsaWMgaW50IGR3RGFtYWdlTWFzazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1dHTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuaW50ZXJuYWwud2luMzI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi1wdWJsaWMgY2xhc3MgV0dMIHsKLQkKLXN0YXRpYyB7Ci0JTGlicmFyeS5sb2FkTGlicmFyeSgiZ2wiKTsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdHTF9GT05UX0xJTkVTICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX0ZPTlRfUE9MWUdPTlMgICA9IDE7Ci0KLS8qIExBWUVSUExBTkVERVNDUklQVE9SIGZsYWdzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfRE9VQkxFQlVGRkVSICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1RFUkVPICAgICAgICAgICAgICA9IDB4MDAwMDAwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9HREkgICAgICAgICA9IDB4MDAwMDAwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9PUEVOR0wgICAgICA9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfREVQVEggICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfU1RFTkNJTCAgICAgICA9IDB4MDAwMDAwODA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfQUNDVU0gICAgICAgICA9IDB4MDAwMDAxMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9FWENIQU5HRSAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9DT1BZICAgICAgICAgICA9IDB4MDAwMDA0MDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfVFJBTlNQQVJFTlQgICAgICAgICA9IDB4MDAwMDEwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX1JHQkEgICAgICAgID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX0NPTE9SSU5ERVggID0gMTsKLQotLyogd2dsU3dhcExheWVyQnVmZmVycyBmbGFncyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfTUFJTl9QTEFORSAgICAgPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTIgICAgICAgPSAweDAwMDAwMDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTMgICAgICAgPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTQgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTUgICAgICAgPSAweDAwMDAwMDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTYgICAgICAgPSAweDAwMDAwMDQwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTcgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTggICAgICAgPSAweDAwMDAwMTAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTkgICAgICAgPSAweDAwMDAwMjAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEwICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTExICAgICAgPSAweDAwMDAwODAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEyICAgICAgPSAweDAwMDAxMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEzICAgICAgPSAweDAwMDAyMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE0ICAgICAgPSAweDAwMDA0MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE1ICAgICAgPSAweDAwMDA4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxICAgICAgPSAweDAwMDEwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkyICAgICAgPSAweDAwMDIwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkzICAgICAgPSAweDAwMDQwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk0ICAgICAgPSAweDAwMDgwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk1ICAgICAgPSAweDAwMTAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk2ICAgICAgPSAweDAwMjAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk3ICAgICAgPSAweDAwNDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk4ICAgICAgPSAweDAwODAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk5ICAgICAgPSAweDAxMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMCAgICAgPSAweDAyMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMSAgICAgPSAweDA0MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMiAgICAgPSAweDA4MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMyAgICAgPSAweDEwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNCAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNSAgICAgPSAweDQwMDAwMDAwOwotCi0vKiBwaXhlbCB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfUkdCQSAgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfQ09MT1JJTkRFWCAgPSAxOwotCi0vKiBsYXllciB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX01BSU5fUExBTkUgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX09WRVJMQVlfUExBTkUgICAgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1VOREVSTEFZX1BMQU5FICAgPSAoLTEpOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9ET1VCTEVCVUZGRVIgICAgICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1RFUkVPICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RSQVdfVE9fV0lORE9XICAgICAgICAgID0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9EUkFXX1RPX0JJVE1BUCAgICAgICAgICA9IDB4MDAwMDAwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9HREkgICAgICAgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NVUFBPUlRfT1BFTkdMICAgICAgICAgID0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0ZPUk1BVCAgICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfTkVFRF9QQUxFVFRFICAgICAgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX05FRURfU1lTVEVNX1BBTEVUVEUgICAgID0gMHgwMDAwMDEwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TV0FQX0VYQ0hBTkdFICAgICAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1dBUF9DT1BZICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NXQVBfTEFZRVJfQlVGRkVSUyAgICAgID0gMHgwMDAwMDgwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0FDQ0VMRVJBVEVEICAgICA9IDB4MDAwMDEwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9ESVJFQ1REUkFXICAgICAgPSAweDAwMDAyMDAwOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgZm9yIHVzZSBpbiBDaG9vc2VQaXhlbEZvcm1hdCBvbmx5ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfREVQVEhfRE9OVENBUkUgICAgICAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RPVUJMRUJVRkZFUl9ET05UQ0FSRSAgID0gMHg0MDAwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TVEVSRU9fRE9OVENBUkUgICAgICAgICA9IDB4ODAwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDaG9vc2VQaXhlbEZvcm1hdChpbnQgaGRjLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgbkJ5dGVzLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR2V0UGl4ZWxGb3JtYXQoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIFNldFBpeGVsRm9ybWF0KGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiBwcGZkKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gU3dhcEJ1ZmZlcnMoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbENvcHlDb250ZXh0KGludCBoZ2xyY1NyYywgaW50IGhnbHJjRHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsQ3JlYXRlQ29udGV4dChpbnQgaGRjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xDcmVhdGVMYXllckNvbnRleHQoaW50IGhkYywgaW50IGlMYXllclBsYW5lKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVsZXRlQ29udGV4dChpbnQgaGdscmMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IHdnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0Q3VycmVudERDKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0UHJvY0FkZHJlc3MoYnl0ZVtdIGxwc3pQcm9jKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsTWFrZUN1cnJlbnQoaW50IGhkYywgaW50IGhnbHJjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsU2hhcmVMaXN0cyhpbnQgaGdscmMxLCBpbnQgaGdscmMyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHNBKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xVc2VGb250Qml0bWFwc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHMoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSkgewotCWlmIChPUy5Jc1VuaWNvZGUpIHJldHVybiB3Z2xVc2VGb250Qml0bWFwc1coaGRjLCBmaXJzdCwgY291bnQsIGxpc3RCYXNlKTsKLQlyZXR1cm4gd2dsVXNlRm9udEJpdG1hcHNBKGhkYywgZmlyc3QsIGNvdW50LCBsaXN0QmFzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc0EoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udE91dGxpbmVzKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UsIGZsb2F0IGRldmlhdGlvbiwgZmxvYXQgZXh0cnVzaW9uLCBpbnQgZm9ybWF0LCBpbnQgbHBnbWYpIHsKLQlpZiAoT1MuSXNVbmljb2RlKSByZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzVyhoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLQlyZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzQShoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVzY3JpYmVMYXllclBsYW5lKGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgaW50IG5CeXRlcywgTEFZRVJQTEFORURFU0NSSVBUT1IgcGxwZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllcyhpbnQgaGRjLCBpbnQgaUxheWVyUGxhbmUsIGludCBpU3RhcnQsIGludCBjRW50cmllcywgaW50W10gcGNyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgaW50IGlTdGFydCwgaW50IGNFbnRyaWVzLCBpbnRbXSBwY3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgYm9vbGVhbiBiUmVhbGl6ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFN3YXBMYXllckJ1ZmZlcnMoaW50IGhkYywgaW50IGZ1UGxhbmVzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L2J1aWxkbm90ZXNfc3d0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC9idWlsZG5vdGVzX3N3dC5odG1sCmluZGV4IGY3YzBlMTQuLmQwYzRjYjYgMTAwNzU1Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L2J1aWxkbm90ZXNfc3d0Lmh0bWwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvYnVpbGRub3Rlc19zd3QuaHRtbApAQCAtMTEsNiArMTEsMzMgQEAKIEVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+CiBTV1Q8L2gxPgogCis8aDI+IFNXVCBCdWlsZCAzLjQgMzAgLSBGcmlkYXkgRmVicnVhcnkgMjIsIDIwMDg8L2gyPgorPGJsb2NrcXVvdGU+CisyODEzMiBSZXBhaW50IGNoZWV6ZSB3aXRoIGVkaXRvciBib3R0b20gcmlnaHQgY29ybmVyCis8YnI+MTczNzk0IAlbQnJvd3NlciBNb3ppbGxhXTogRGlzcGxheS1GaWx0ZXIgKFNXVC5Nb3VzZVdoZWVsKSBubyBsb25nZXIgd29ya2luZyB3aGVuIGZvY3VzIHNldCB0byBCcm93c2VyCis8YnI+MTkwOTkyIAlTdHJpbmcgdHJ1bmNhdGlvbiBpbiBub24tRW5nbGlzaCBjYXNlcy4KKzxicj4xOTU1ODUgCUhUTUxUcmFuc2ZlciBkb2VzIG5vdCBzdXBwb3J0IG5vbi1FbmdsaXNoIHRleHQuCis8YnI+MjEwODU3IAlUZXh0IGJveCB3aXRob3V0ICdTV1QuVl9TQ1JPTEwnIHVuZWRpdGFibGUKKzxicj4yMTEyODQgCVtCcm93c2VyXSBCcm93c2VyIHdpZGdldCBpbiBPTl9UT1Agc2hlbGwgbm90IGZvY3VzZWQgb24gZmlyc3QgY2xpY2sgKE1vemlsbGEvU2FmYXJpKQorPGJyPjIxMTM1NyAJRmlsZVZpZXdlciBjcmFzaGVzCis8YnI+MjExMzU5IAlBcHBsZStRIGRvZXNuJ3QgcXVpdCBhbiBTV1QgYXBwLCBub3IgZG9lcyBtZW51IHNlbGVjdGlvbiBvZiBzYW1lCis8YnI+MjEzNDg5IAlJbmNyZWFzaW5nIGhlaWdodCBvZiB0YWJsZSByb3dzIHZpYSBNZWFzdXJlSXRlbSBsaXN0ZW5lciBhZmZlY3RzIHJvdyBoZWlnaHQgYnV0IG5vdCBsaW5lIGhlaWdodCAoT1MgWCkKKzxicj4yMTM5MzcgCVRoZSBNZXRob2QgZ2V0Qm9yZGVyV2lkdGggKCkgZnJvbSBDb250cm9sIHJldHVybnMgMCBldmVyeSB0aW1lCis8YnI+MjE0NTU3IAlDb21ibyNhZGQoU3RyaW5nLGludCkgZG9lcyB1cGRhdGUgc2VsZWN0aW9uLWluZGV4Cis8YnI+MjE1MjUyIAlmcmVxdWVudCAiaW52YWxpZCB0aHJlYWQgYWNjZXNzIgorPGJyPjIxNzM3MSAJW0Jyb3dzZXJdIFN1cHBvcnQgY2xpY2stdGhyb3VnaCBmb3IgQnJvd3NlciBhbmQgdG9vbGJhciBidXR0b25zCis8YnI+MjE3ODQyIAlOUEUgaW4gR0Mgd2hlbiBjcmVhdGluZyBwcm9ibGVtcyBWaWV3Cis8YnI+MjE4MjI5IAlBUEkgdG8gb3BlbiBhbiBVUkwgaW4gdGhlIE9TIGRlZmF1bHQgYnJvd3NlcgorPGJyPjIxODIzNCAJRGlzcGxheSBrZWVwcyBsb2NrIG9uIHJ1bm5hYmxlIGZvciB0aW1lckV4Y2VjIHdoZW4gZGlzcG9zZWQKKzxicj4yMTg2ODIgCTJuZCBHQyBlcmFzZXMgdGhlIGZpcnN0LgorPGJyPjIxODcwMCAJVHJlZSBnZXRIZWFkZXJIZWlnaHQgbm90IGltcGxlbWVudGVkCis8YnI+MjE4NzAyIAlUcmVlIGdldFNlbGVjdGlvbkNvdW50IG5vdCBpbXBsZW1lbnRlZAorPGJyPjIxOTMyNiAJU2hlbGwgd2l0aCBjdXN0b20gcmVnaW9uIGFuZCBTV1QuTk9fVFJJTSBzdGlsbCBoYXMgYm9yZGVyCis8YnI+MjE5NjAxIAlTdHlsZWRUZXh0OiBVbmV4cGVjdGVkIGxvc3Mgb2YgbW91c2UgY3Vyc29yCis8YnI+MjE5NjIxIAlUcmVlIGdldC9zZXQgY29sdW1uIG9yZGVyIG5vdCBpbXBsZW1lbnRlZAorPGJyPjIxOTY5MyAJRWNsaXBzZSBjcmFzaGVzIHdoZW4gQnJvd3NlciBjbG9zZWQgd2l0aCBjb21tYW5kLVcKKzwvYmxvY2txdW90ZT4KKwogPGgyPiBTV1QgQnVpbGQgMy40IDI5IC0gVHVlc2RheSBGZWJydWFyeSAxMiwgMjAwODwvaDI+CiA8YmxvY2txdW90ZT4KIDE5NjE5MSAgUGVyZm9ybWFuY2UgSW1wcm92ZW1lbnQgZm9yIEpQRUdGaWxlRm9ybWF0IGNsYXNzIGluaXRpYWxpemVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwYjQ3ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5Ccm93c2VyRGVtbzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNGI4OGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTQ6MzEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NjRkYTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5Ccm93c2VyRGVtby5qYXIgPSBzcmMvCi1vdXRwdXQuQnJvd3NlckRlbW8uamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLQkJCSAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLQkJCSAgIHBsdWdpbi54bWwsXAotCQkJICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBCcm93c2VyRGVtby5qYXIsXAotICAgICAgICAgICAgICAgY3NzMS8sXAotICAgICAgICAgICAgICAgY3NzMi8sXAotICAgICAgICAgICAgICAgY3NzMy8sXAotICAgICAgICAgICAgICAgY3NzNC8sXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JhY2sxLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWI5ZjMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMi5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JhY2syLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmNjhkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JhY2syLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmxhY2suZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9ibGFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmMxZTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9ibGFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JvYXJkMS5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JvYXJkMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzRkNWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9ib2FyZDEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9lbXB0eS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2VtcHR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiY2U0ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2VtcHR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvbGluZTEuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9saW5lMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTBmMzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9saW5lMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3N0eWxlLmNzcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjM2ZmE5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvc3R5bGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotYm9keSB7YmFja2dyb3VuZDogdXJsKC4vYmFjazIuanBnKSBmaXhlZDsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMSB7dGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMiB7YmFja2dyb3VuZDogdXJsKC4vbGluZTEuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgzIHtmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLQ0KLXVsIHtsaXN0LXN0eWxlOiBub25lOyBwYWRkaW5nOiAwOyBtYXJnaW46MDsgZm9udDogMTJwdCBUaW1lczt9DQotbGkud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkuYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2JsYWNrLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbC5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLQ0KLS5ib2FyZCB7dGV4dC1hbGlnbjogY2VudGVyO30NCi10YWJsZSB7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IG1hcmdpbjogMDt9DQotdHIge30NCi10ZCB7aGVpZ2h0OiAzMnB4OyB3aWR0aDozMnB4OyB0YWJsZS1sYXlvdXQ6IGZpeGVkO30NCi0NCi0ud2hpdGVsaW5rIGEge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9lbXB0eS5naWYpIG5vLXJlcGVhdDsgd2lkdGg6MzJweDsgaGVpZ2h0OjMycHg7fQ0KLS5ibGFja2xpbmsgYSB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2VtcHR5LmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDt9DQotLmVtcHR5IHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vZW1wdHkuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4O30NCi0NCi0ud2hpdGVsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZS5naWYpIG5vLXJlcGVhdDsgd2lkdGg6MzJweDsgaGVpZ2h0OjMycHg7fQ0KLS5ibGFja2xpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2JsYWNrLmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDt9DQotLndoaXRlIHtiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZS5naWYpIG5vLXJlcGVhdDt9DQotLmJsYWNrIHtiYWNrZ3JvdW5kOiB1cmwoLi9ibGFjay5naWYpIG5vLXJlcGVhdDt9DQotLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGwuZ2lmKSBuby1yZXBlYXQ7fQ0KLQ0KLS5wbGF5ZXJ3aGl0ZSB7ZmxvYXQ6IGxlZnQ7IG1hcmdpbjogMWVtIDFlbTsgYm9yZGVyOiAxcHggc29saWQgZ3JheTsgYmFja2dyb3VuZDogdXJsKC4vd2hpdGUuZ2lmKSBuby1yZXBlYXQ7IHRleHQtYWxpZ246IHJpZ2h0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjMycHg7fQ0KLS5wbGF5ZXJibGFjayB7ZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IDFlbSAxZW07IGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7IGJhY2tncm91bmQ6IHVybCguL2JsYWNrLmdpZikgbm8tcmVwZWF0OyB0ZXh0LWFsaWduOiByaWdodDsgd2lkdGg6MTAwcHg7IGhlaWdodDozMnB4O30NCi0NCi0ud2lubmVyIHtib3JkZXI6IDRweCBzb2xpZCBibHVlOyBmb250OiBib2xkIDE2cHQgVGltZXMsIHNlcmlmO30NCi0ubG9zZXIge2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBmb250OiAxMnB0IFRpbWVzLCBzZXJpZjt9DQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93YWxsLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOTdmYzEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93YWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2VsY29tZS5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93ZWxjb21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTkyYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93ZWxjb21lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5TdGFydCBhIGdhbWU8L3RpdGxlPgotCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vc3R5bGUuY3NzIj4KLTwvaGVhZD4KLTxib2R5PgotPGgxPlBhd25zIEdhbWU8L2gxPgotPGRpdiBjbGFzcz0ic3RhcnQiPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MXBsYXllciI+MSBwbGF5ZXI8L2E+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQycGxheWVycyI+MiBwbGF5ZXJzPC9hPgotPC9kaXY+Ci08aDI+SG93IHRvIHBsYXk8L2gyPgotVGhpcyBib2FyZCBnYW1lIGlzIGEgdmFyaWFudCBvZiBSZXZlcnNpIGFuZCBUaWMgVGFjIFRvZS4gRWFjaCBvbmUgb2YgdGhlIHR3byBwbGF5ZXJzIHNldHMgYSBwYXduIG9uIGFuIGVtcHR5IGNlbGwgb2YgdGhlIGJvYXJkLgotPGgzPlBhd25zPC9oMz4KLTx1bD4KLTxsaSBjbGFzcz0id2hpdGUiPlBsYXllciAxPC9saT4KLTxsaSBjbGFzcz0iYmxhY2siPlBsYXllciAyPC9saT4KLTxsaSBjbGFzcz0id2FsbCI+V2FsbC4gQ2Fubm90IGJlIHJldmVyc2VkLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0idGhlbWUiPgotRGlmZmVyZW50IHRoZW1lcyBhcmUgc3VwcG9ydGVkLiBUaGVtZSBpcyBjb25maWd1cmVkIHRocm91Z2ggYSBDYXNjYWRpbmcgU3R5bGUgU2hlZXQgKENTUykgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgSFRNTCBjb250ZW50IGlzIHJlbmRlcmVkIGJ5IHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuCi08dWwgY2xhc3M9InRoZW1lIj4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczEiPlRoZW1lIDE8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczIiPlRoZW1lIDI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczMiPlRoZW1lIDM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczQiPlRoZW1lIDQ8L2E+PC9saT4KLTwvdWw+Ci0KLTwvZGl2PgotPGgyPkhvdyB0byB3aW48L2gyPgotVGhlIGdhbWUgZW5kcyB3aGVuIGFsbCBjZWxscyBhcmUgZmlsbGVkLiBUaGUgd2lubmVyIGlzIHRoZSBvbmUgd2l0aCBtb3N0IHBhd25zIG9mIHRoZWlyIGNvbG91ci4gCi0KLTxoMj5KYXZhIGFuZCBIVE1MIGludGVncmF0ZWQgdGhyb3VnaCB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0PC9oMj4KLTxwPgotUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBDb21wdXRlciBtb3ZlcyBhcmUgcHJvZ3JhbW1lZCBpbiByZWd1bGFyCi1KYXZhIGNvZGUgaW4gdGhlIEVjbGlwc2UgcGx1Zy1pbi4gVGhlIFNXVCBCcm93c2VyIHdpZGdldCBpcyB1c2VkIGZvciByZW5kZXJpbmcgYW5kIHJlYWN0aW5nCi10byB1c2VyIGlucHV0LgotPC9wPgotPGgzPkltcGxlbWVudGF0aW9uPC9oMz4KLTxwPgotVGhlIGJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cwotcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuCi08YnI+VGhlIEFQSSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZyk8L2NvZGU+IGRyYXdzCi10aGUgYm9hcmQgZ2FtZSBmcm9tIEhUTUwgZ2VuZXJhdGVkIGluIG1lbW9yeS4KLTxicj5QbGF5ZXIgbW92ZXMgYXJlIGNhcHR1cmVkIGJ5IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXI8L2NvZGU+LgotZS5nIHRoZSBwbGF5ZXIgY2xpY2tzIG9uIGEgY2VsbCB0aGF0IG1heSBnZW5lcmF0ZSBhIGh5cGVybGluayB3aXRoIGEgVVJMIHNpbWlsYXIgdG8KLTxjb2RlPmh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MveHgxeXkyPC9jb2RlPi4gVGhhdCBoeXBlcmxpbmsgaWRlbnRpZmllcwotdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIgKGNvbHVtbiAxLCByb3cgMikuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nCi1uZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyA8Y29kZT5Ccm93c2VyLnNldFRleHQ8L2NvZGU+IHRvIHVwZGF0ZSB0aGUgYm9hcmQgZ2FtZS4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3doaXRlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2hpdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDNmZDk2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2hpdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9CYWNrNjQweDQ0MC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL0JhY2s2NDB4NDQwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMzgyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL0JhY2s2NDB4NDQwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvYmxhY2tfY2hpcC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL2JsYWNrX2NoaXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2M2ZWJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvYmxhY2tfY2hpcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL2xpbmUxLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvbGluZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEwZjM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvbGluZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9zdHlsZS5jc3MgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3N0eWxlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwNzQ5Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3N0eWxlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWJvZHkge2JhY2tncm91bmQ6IHVybCguL0JhY2s2NDB4NDQwLmdpZikgZml4ZWQ7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDEge3RleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNHB0OyBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDIge2JhY2tncm91bmQ6IHVybCguL2xpbmUxLmdpZikgbm8tcmVwZWF0IHJpZ2h0IGJvdHRvbTsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMyB7Zm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi0NCi11bCB7bGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogMDsgbWFyZ2luOjA7IGZvbnQ6IDEycHQgVGltZXM7fQ0KLWxpLndoaXRlIHtiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9jaGlwLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkuYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2JsYWNrX2NoaXAuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsX2NoaXAuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi0NCi0uYm9hcmQge3RleHQtYWxpZ246IGxlZnQ7fQ0KLXRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWFyZ2luOiAwOyBwYWRkaW5nOjA7IGJhY2tncm91bmQ6IHVybCguL3RleHR1cmVfY2VsbHMuZ2lmKX0NCi10ciB7fQ0KLXRkIHtoZWlnaHQ6NDhweDsgd2lkdGg6NDhweDsgdGFibGUtbGF5b3V0OiBmaXhlZDt9DQotDQotLndoaXRlbGluayBhIHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5ibGFja2xpbmsgYSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uZW1wdHkge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotDQotLndoaXRlbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vd2hpdGVfY2hpcC5naWYpIG5vLXJlcGVhdDsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5ibGFja2xpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2JsYWNrX2NoaXAuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0ud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlX2NoaXAuZ2lmKSBuby1yZXBlYXQ7fQ0KLS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2tfY2hpcC5naWYpIG5vLXJlcGVhdDt9DQotLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGxfY2hpcC5naWYpIG5vLXJlcGVhdDt9DQotDQotLnBsYXllcndoaXRlIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTBweDsgcmlnaHQ6MTBweDsgbWFyZ2luOiAxZW0gMTBweDsgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsgYmFja2dyb3VuZDogdXJsKC4vd2hpdGVfY2hpcC5naWYpIG5vLXJlcGVhdCByaWdodDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6MTAwcHg7IGhlaWdodDo0OHB4OyBmb250OiAzNnB0IFRpbWVzLCBzZXJpZjt9DQotLnBsYXllcmJsYWNrIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMzAwcHg7IHJpZ2h0OjEwcHg7IG1hcmdpbjogMWVtIDEwcHg7IGJvcmRlcjogM3B4IHNvbGlkIGJsdWU7IGJhY2tncm91bmQ6IHVybCguL2JsYWNrX2NoaXAuZ2lmKSBuby1yZXBlYXQgcmlnaHQ7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6NDhweDsgZm9udDogMzZwdCBUaW1lcywgc2VyaWY7fQ0KLQ0KLS53aW5uZXIge2JvcmRlcjogNHB4IHNvbGlkIHdoaXRlOyBmb250OiBib2xkIDE2cHQgVGltZXMsIHNlcmlmO30NCi0ubG9zZXIge2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBmb250OiAxMnB0IFRpbWVzLCBzZXJpZjt9DQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi90ZXh0dXJlX2NlbGxzLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvdGV4dHVyZV9jZWxscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZmVlOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi90ZXh0dXJlX2NlbGxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2FsbF9jaGlwLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2FsbF9jaGlwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMGIzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3dhbGxfY2hpcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3dlbGNvbWUuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2VsY29tZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGU5MmEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2VsY29tZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+U3RhcnQgYSBnYW1lPC90aXRsZT4KLQk8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3N0eWxlLmNzcyI+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5QYXducyBHYW1lPC9oMT4KLTxkaXYgY2xhc3M9InN0YXJ0Ij4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDFwbGF5ZXIiPjEgcGxheWVyPC9hPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MnBsYXllcnMiPjIgcGxheWVyczwvYT4KLTwvZGl2PgotPGgyPkhvdyB0byBwbGF5PC9oMj4KLVRoaXMgYm9hcmQgZ2FtZSBpcyBhIHZhcmlhbnQgb2YgUmV2ZXJzaSBhbmQgVGljIFRhYyBUb2UuIEVhY2ggb25lIG9mIHRoZSB0d28gcGxheWVycyBzZXRzIGEgcGF3biBvbiBhbiBlbXB0eSBjZWxsIG9mIHRoZSBib2FyZC4KLTxoMz5QYXduczwvaDM+Ci08dWw+Ci08bGkgY2xhc3M9IndoaXRlIj5QbGF5ZXIgMTwvbGk+Ci08bGkgY2xhc3M9ImJsYWNrIj5QbGF5ZXIgMjwvbGk+Ci08bGkgY2xhc3M9IndhbGwiPldhbGwuIENhbm5vdCBiZSByZXZlcnNlZC48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InRoZW1lIj4KLURpZmZlcmVudCB0aGVtZXMgYXJlIHN1cHBvcnRlZC4gVGhlbWUgaXMgY29uZmlndXJlZCB0aHJvdWdoIGEgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0IChDU1MpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIEhUTUwgY29udGVudCBpcyByZW5kZXJlZCBieSB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LgotPHVsIGNsYXNzPSJ0aGVtZSI+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MxIj5UaGVtZSAxPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MyIj5UaGVtZSAyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MzIj5UaGVtZSAzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3M0Ij5UaGVtZSA0PC9hPjwvbGk+Ci08L3VsPgotCi08L2Rpdj4KLTxoMj5Ib3cgdG8gd2luPC9oMj4KLVRoZSBnYW1lIGVuZHMgd2hlbiBhbGwgY2VsbHMgYXJlIGZpbGxlZC4gVGhlIHdpbm5lciBpcyB0aGUgb25lIHdpdGggbW9zdCBwYXducyBvZiB0aGVpciBjb2xvdXIuIAotCi08aDI+SmF2YSBhbmQgSFRNTCBpbnRlZ3JhdGVkIHRocm91Z2ggdGhlIFNXVCBCcm93c2VyIHdpZGdldDwvaDI+Ci08cD4KLVJlbmRlcmluZyBpcyBiYXNlZCBvbiBIVE1MIGFuZCBDU1MgdGVjaG5pcXVlcy4gQ29tcHV0ZXIgbW92ZXMgYXJlIHByb2dyYW1tZWQgaW4gcmVndWxhcgotSmF2YSBjb2RlIGluIHRoZSBFY2xpcHNlIHBsdWctaW4uIFRoZSBTV1QgQnJvd3NlciB3aWRnZXQgaXMgdXNlZCBmb3IgcmVuZGVyaW5nIGFuZCByZWFjdGluZwotdG8gdXNlciBpbnB1dC4KLTwvcD4KLTxoMz5JbXBsZW1lbnRhdGlvbjwvaDM+Ci08cD4KLVRoZSBib2FyZCBpcyBhIHRhYmxlIGZpbGxlZCB3aXRoIGh5cGVybGlua3MuIENhc2NhZGluZyBTdHlsZSBTaGVldHMKLXByb3ZpZGUgdmFyaW91cyB0aGVtZXMgYW5kIGNvbnRyb2wgdGhlIHRhYmxlIGFlc3RoZXRpYyBhcHBlYXJhbmNlLgotPGJyPlRoZSBBUEkgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3Nlci5zZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpPC9jb2RlPiBkcmF3cwotdGhlIGJvYXJkIGdhbWUgZnJvbSBIVE1MIGdlbmVyYXRlZCBpbiBtZW1vcnkuCi08YnI+UGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyPC9jb2RlPi4KLWUuZyB0aGUgcGxheWVyIGNsaWNrcyBvbiBhIGNlbGwgdGhhdCBtYXkgZ2VuZXJhdGUgYSBoeXBlcmxpbmsgd2l0aCBhIFVSTCBzaW1pbGFyIHRvCi08Y29kZT5odHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3h4MXl5MjwvY29kZT4uIFRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMKLXRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCBzZWxlY3RlZCBieSB0aGUgcGxheWVyIChjb2x1bW4gMSwgcm93IDIpLiBUaGUgbW92ZSBpcyBjb21wbGV0ZWQgYnkgZ2VuZXJhdGluZwotbmV3IEhUTUwgY29udGVudCBhbmQgaW52b2tpbmcgPGNvZGU+QnJvd3Nlci5zZXRUZXh0PC9jb2RlPiB0byB1cGRhdGUgdGhlIGJvYXJkIGdhbWUuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93aGl0ZV9jaGlwLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2hpdGVfY2hpcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNmQ2NTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93aGl0ZV9jaGlwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvQmFjazY0MHg0NDAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9CYWNrNjQweDQ0MC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzM4MjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9CYWNrNjQweDQ0MC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL2JsYWNrX3Bhd24uZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9ibGFja19wYXduLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxYTQxZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL2JsYWNrX3Bhd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9saW5lMS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL2xpbmUxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhMGYzNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL2xpbmUxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvc3R5bGUuY3NzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9zdHlsZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGYwNGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1ib2R5IHtiYWNrZ3JvdW5kOiB1cmwoLi9CYWNrNjQweDQ0MC5naWYpIGZpeGVkOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgxIHt0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgyIHtiYWNrZ3JvdW5kOiB1cmwoLi9saW5lMS5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDMge2ZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotDQotdWwge2xpc3Qtc3R5bGU6IG5vbmU7IHBhZGRpbmc6IDA7IG1hcmdpbjowOyBmb250OiAxMnB0IFRpbWVzO30NCi1saS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vd2hpdGVfcGF3bi5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLWxpLmJsYWNrIHtiYWNrZ3JvdW5kOiB1cmwoLi9ibGFja19wYXduLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbF9wYXduLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotDQotLmJvYXJkIHt0ZXh0LWFsaWduOiBsZWZ0O30NCi10YWJsZSB7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IG1hcmdpbjogMDsgcGFkZGluZzowOyBiYWNrZ3JvdW5kOiB1cmwoLi90ZXh0dXJlX2NlbGxzLmdpZil9DQotdHIge30NCi10ZCB7aGVpZ2h0OjQ4cHg7IHdpZHRoOjQ4cHg7IHRhYmxlLWxheW91dDogZml4ZWQ7fQ0KLQ0KLS53aGl0ZWxpbmsgYSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uYmxhY2tsaW5rIGEge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmVtcHR5IHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLQ0KLS53aGl0ZWxpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL3doaXRlX3Bhd24uZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uYmxhY2tsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9ibGFja19wYXduLmdpZikgbm8tcmVwZWF0OyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLndoaXRlIHtiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9wYXduLmdpZikgbm8tcmVwZWF0O30NCi0uYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2JsYWNrX3Bhd24uZ2lmKSBuby1yZXBlYXQ7fQ0KLS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsX3Bhd24uZ2lmKSBuby1yZXBlYXQ7fQ0KLQ0KLS5wbGF5ZXJ3aGl0ZSB7cG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwcHg7IHJpZ2h0OjEwcHg7IG1hcmdpbjogMWVtIDEwcHg7IGJvcmRlcjogM3B4IHNvbGlkIGJsdWU7IGJhY2tncm91bmQ6IHVybCguL3doaXRlX3Bhd24uZ2lmKSBuby1yZXBlYXQgcmlnaHQ7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6NDhweDsgZm9udDogMzZwdCBUaW1lcywgc2VyaWY7fQ0KLS5wbGF5ZXJibGFjayB7cG9zaXRpb246IGFic29sdXRlOyB0b3A6IDMwMHB4OyByaWdodDoxMHB4OyBtYXJnaW46IDFlbSAxMHB4OyBib3JkZXI6IDNweCBzb2xpZCBibHVlOyBiYWNrZ3JvdW5kOiB1cmwoLi9ibGFja19wYXduLmdpZikgbm8tcmVwZWF0IHJpZ2h0OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjQ4cHg7IGZvbnQ6IDM2cHQgVGltZXMsIHNlcmlmO30NCi0NCi0ud2lubmVyIHtib3JkZXI6IDRweCBzb2xpZCB3aGl0ZTsgZm9udDogYm9sZCAxNnB0IFRpbWVzLCBzZXJpZjt9DQotLmxvc2VyIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgZm9udDogMTJwdCBUaW1lcywgc2VyaWY7fQ0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvdGV4dHVyZV9jZWxscy5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3RleHR1cmVfY2VsbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2ZlZTlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvdGV4dHVyZV9jZWxscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3dhbGxfcGF3bi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3dhbGxfcGF3bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWNkNTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93YWxsX3Bhd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93ZWxjb21lLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3dlbGNvbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlOTJhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3dlbGNvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlN0YXJ0IGEgZ2FtZTwvdGl0bGU+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0JPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9zdHlsZS5jc3MiPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+UGF3bnMgR2FtZTwvaDE+Ci08ZGl2IGNsYXNzPSJzdGFydCI+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQxcGxheWVyIj4xIHBsYXllcjwvYT4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDJwbGF5ZXJzIj4yIHBsYXllcnM8L2E+Ci08L2Rpdj4KLTxoMj5Ib3cgdG8gcGxheTwvaDI+Ci1UaGlzIGJvYXJkIGdhbWUgaXMgYSB2YXJpYW50IG9mIFJldmVyc2kgYW5kIFRpYyBUYWMgVG9lLiBFYWNoIG9uZSBvZiB0aGUgdHdvIHBsYXllcnMgc2V0cyBhIHBhd24gb24gYW4gZW1wdHkgY2VsbCBvZiB0aGUgYm9hcmQuCi08aDM+UGF3bnM8L2gzPgotPHVsPgotPGxpIGNsYXNzPSJ3aGl0ZSI+UGxheWVyIDE8L2xpPgotPGxpIGNsYXNzPSJibGFjayI+UGxheWVyIDI8L2xpPgotPGxpIGNsYXNzPSJ3YWxsIj5XYWxsLiBDYW5ub3QgYmUgcmV2ZXJzZWQuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJ0aGVtZSI+Ci1EaWZmZXJlbnQgdGhlbWVzIGFyZSBzdXBwb3J0ZWQuIFRoZW1lIGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCBhIENhc2NhZGluZyBTdHlsZSBTaGVldCAoQ1NTKSB0aGF0IGRldGVybWluZXMgaG93IHRoZSBIVE1MIGNvbnRlbnQgaXMgcmVuZGVyZWQgYnkgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4KLTx1bCBjbGFzcz0idGhlbWUiPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMSI+VGhlbWUgMTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMiI+VGhlbWUgMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMyI+VGhlbWUgMzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzNCI+VGhlbWUgNDwvYT48L2xpPgotPC91bD4KLQotPC9kaXY+Ci08aDI+SG93IHRvIHdpbjwvaDI+Ci1UaGUgZ2FtZSBlbmRzIHdoZW4gYWxsIGNlbGxzIGFyZSBmaWxsZWQuIFRoZSB3aW5uZXIgaXMgdGhlIG9uZSB3aXRoIG1vc3QgcGF3bnMgb2YgdGhlaXIgY29sb3VyLiAKLQotPGgyPkphdmEgYW5kIEhUTUwgaW50ZWdyYXRlZCB0aHJvdWdoIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQ8L2gyPgotPHA+Ci1SZW5kZXJpbmcgaXMgYmFzZWQgb24gSFRNTCBhbmQgQ1NTIHRlY2huaXF1ZXMuIENvbXB1dGVyIG1vdmVzIGFyZSBwcm9ncmFtbWVkIGluIHJlZ3VsYXIKLUphdmEgY29kZSBpbiB0aGUgRWNsaXBzZSBwbHVnLWluLiBUaGUgU1dUIEJyb3dzZXIgd2lkZ2V0IGlzIHVzZWQgZm9yIHJlbmRlcmluZyBhbmQgcmVhY3RpbmcKLXRvIHVzZXIgaW5wdXQuCi08L3A+Ci08aDM+SW1wbGVtZW50YXRpb248L2gzPgotPHA+Ci1UaGUgYm9hcmQgaXMgYSB0YWJsZSBmaWxsZWQgd2l0aCBoeXBlcmxpbmtzLiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzCi1wcm92aWRlIHZhcmlvdXMgdGhlbWVzIGFuZCBjb250cm9sIHRoZSB0YWJsZSBhZXN0aGV0aWMgYXBwZWFyYW5jZS4KLTxicj5UaGUgQVBJIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIuc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKTwvY29kZT4gZHJhd3MKLXRoZSBib2FyZCBnYW1lIGZyb20gSFRNTCBnZW5lcmF0ZWQgaW4gbWVtb3J5LgotPGJyPlBsYXllciBtb3ZlcyBhcmUgY2FwdHVyZWQgYnkgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lcjwvY29kZT4uCi1lLmcgdGhlIHBsYXllciBjbGlja3Mgb24gYSBjZWxsIHRoYXQgbWF5IGdlbmVyYXRlIGEgaHlwZXJsaW5rIHdpdGggYSBVUkwgc2ltaWxhciB0bwotPGNvZGU+aHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTI8L2NvZGU+LiBUaGF0IGh5cGVybGluayBpZGVudGlmaWVzCi10aGUgcG9zaXRpb24gb2YgdGhlIGNlbGwgc2VsZWN0ZWQgYnkgdGhlIHBsYXllciAoY29sdW1uIDEsIHJvdyAyKS4gVGhlIG1vdmUgaXMgY29tcGxldGVkIGJ5IGdlbmVyYXRpbmcKLW5ldyBIVE1MIGNvbnRlbnQgYW5kIGludm9raW5nIDxjb2RlPkJyb3dzZXIuc2V0VGV4dDwvY29kZT4gdG8gdXBkYXRlIHRoZSBib2FyZCBnYW1lLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2hpdGVfcGF3bi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3doaXRlX3Bhd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGY1ZTUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2hpdGVfcGF3bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L0JhY2s2NDB4NDQwLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvQmFjazY0MHg0NDAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTMzODIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvQmFjazY0MHg0NDAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9ibHVlX3Blb3BsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2JsdWVfcGVvcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxMGM1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2JsdWVfcGVvcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvZ29sZF9wZW9wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9nb2xkX3Blb3BsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTA5MGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9nb2xkX3Blb3BsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2xpbmUxLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvbGluZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEwZjM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvbGluZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9zdHlsZS5jc3MgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3N0eWxlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1YjA5Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3N0eWxlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWJvZHkge2JhY2tncm91bmQ6IHVybCguL0JhY2s2NDB4NDQwLmdpZikgZml4ZWQ7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDEge3RleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNHB0OyBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDIge2JhY2tncm91bmQ6IHVybCguL2xpbmUxLmdpZikgbm8tcmVwZWF0IHJpZ2h0IGJvdHRvbTsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMyB7Zm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi0NCi11bCB7bGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogMDsgbWFyZ2luOjA7IGZvbnQ6IDEycHQgVGltZXM7fQ0KLWxpLndoaXRlIHtiYWNrZ3JvdW5kOiB1cmwoLi9ibHVlX3Blb3BsZS5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLWxpLmJsYWNrIHtiYWNrZ3JvdW5kOiB1cmwoLi9nb2xkX3Blb3BsZS5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLWxpLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGxfcGVvcGxlLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotDQotLmJvYXJkIHt0ZXh0LWFsaWduOiBsZWZ0O30NCi10YWJsZSB7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IG1hcmdpbjogMDsgcGFkZGluZzowOyBiYWNrZ3JvdW5kOiB1cmwoLi90ZXh0dXJlX2NlbGxzLmdpZil9DQotdHIge30NCi10ZCB7aGVpZ2h0OjQ4cHg7IHdpZHRoOjQ4cHg7IHRhYmxlLWxheW91dDogZml4ZWQ7fQ0KLQ0KLS53aGl0ZWxpbmsgYSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uYmxhY2tsaW5rIGEge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmVtcHR5IHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLQ0KLS53aGl0ZWxpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2JsdWVfcGVvcGxlLmdpZikgbm8tcmVwZWF0OyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmJsYWNrbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vZ29sZF9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0ud2hpdGUge2JhY2tncm91bmQ6IHVybCguL2JsdWVfcGVvcGxlLmdpZikgbm8tcmVwZWF0O30NCi0uYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2dvbGRfcGVvcGxlLmdpZikgbm8tcmVwZWF0O30NCi0ud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbF9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7fQ0KLQ0KLS5wbGF5ZXJ3aGl0ZSB7cG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwcHg7IHJpZ2h0OjEwcHg7IG1hcmdpbjogMWVtIDEwcHg7IGJvcmRlcjogM3B4IHNvbGlkIGJsdWU7IGJhY2tncm91bmQ6IHVybCguL2JsdWVfcGVvcGxlLmdpZikgbm8tcmVwZWF0IHJpZ2h0OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjQ4cHg7IGZvbnQ6IDM2cHQgVGltZXMsIHNlcmlmO30NCi0ucGxheWVyYmxhY2sge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAzMDBweDsgcmlnaHQ6MTBweDsgbWFyZ2luOiAxZW0gMTBweDsgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsgYmFja2dyb3VuZDogdXJsKC4vZ29sZF9wZW9wbGUuZ2lmKSBuby1yZXBlYXQgcmlnaHQ7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6NDhweDsgZm9udDogMzZwdCBUaW1lcywgc2VyaWY7fQ0KLQ0KLS53aW5uZXIge2JvcmRlcjogNHB4IHNvbGlkIHdoaXRlOyBmb250OiBib2xkIDE2cHQgVGltZXMsIHNlcmlmO30NCi0ubG9zZXIge2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBmb250OiAxMnB0IFRpbWVzLCBzZXJpZjt9DQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC90ZXh0dXJlX2NlbGxzLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvdGV4dHVyZV9jZWxscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZmVlOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC90ZXh0dXJlX2NlbGxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvd2FsbF9wZW9wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC93YWxsX3Blb3BsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MTZjODEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC93YWxsX3Blb3BsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3dlbGNvbWUuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvd2VsY29tZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGU5MmEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvd2VsY29tZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+U3RhcnQgYSBnYW1lPC90aXRsZT4KLQk8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3N0eWxlLmNzcyI+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5QYXducyBHYW1lPC9oMT4KLTxkaXYgY2xhc3M9InN0YXJ0Ij4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDFwbGF5ZXIiPjEgcGxheWVyPC9hPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MnBsYXllcnMiPjIgcGxheWVyczwvYT4KLTwvZGl2PgotPGgyPkhvdyB0byBwbGF5PC9oMj4KLVRoaXMgYm9hcmQgZ2FtZSBpcyBhIHZhcmlhbnQgb2YgUmV2ZXJzaSBhbmQgVGljIFRhYyBUb2UuIEVhY2ggb25lIG9mIHRoZSB0d28gcGxheWVycyBzZXRzIGEgcGF3biBvbiBhbiBlbXB0eSBjZWxsIG9mIHRoZSBib2FyZC4KLTxoMz5QYXduczwvaDM+Ci08dWw+Ci08bGkgY2xhc3M9IndoaXRlIj5QbGF5ZXIgMTwvbGk+Ci08bGkgY2xhc3M9ImJsYWNrIj5QbGF5ZXIgMjwvbGk+Ci08bGkgY2xhc3M9IndhbGwiPldhbGwuIENhbm5vdCBiZSByZXZlcnNlZC48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InRoZW1lIj4KLURpZmZlcmVudCB0aGVtZXMgYXJlIHN1cHBvcnRlZC4gVGhlbWUgaXMgY29uZmlndXJlZCB0aHJvdWdoIGEgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0IChDU1MpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIEhUTUwgY29udGVudCBpcyByZW5kZXJlZCBieSB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LgotPHVsIGNsYXNzPSJ0aGVtZSI+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MxIj5UaGVtZSAxPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MyIj5UaGVtZSAyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MzIj5UaGVtZSAzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3M0Ij5UaGVtZSA0PC9hPjwvbGk+Ci08L3VsPgotCi08L2Rpdj4KLTxoMj5Ib3cgdG8gd2luPC9oMj4KLVRoZSBnYW1lIGVuZHMgd2hlbiBhbGwgY2VsbHMgYXJlIGZpbGxlZC4gVGhlIHdpbm5lciBpcyB0aGUgb25lIHdpdGggbW9zdCBwYXducyBvZiB0aGVpciBjb2xvdXIuIAotCi08aDI+SmF2YSBhbmQgSFRNTCBpbnRlZ3JhdGVkIHRocm91Z2ggdGhlIFNXVCBCcm93c2VyIHdpZGdldDwvaDI+Ci08cD4KLVJlbmRlcmluZyBpcyBiYXNlZCBvbiBIVE1MIGFuZCBDU1MgdGVjaG5pcXVlcy4gQ29tcHV0ZXIgbW92ZXMgYXJlIHByb2dyYW1tZWQgaW4gcmVndWxhcgotSmF2YSBjb2RlIGluIHRoZSBFY2xpcHNlIHBsdWctaW4uIFRoZSBTV1QgQnJvd3NlciB3aWRnZXQgaXMgdXNlZCBmb3IgcmVuZGVyaW5nIGFuZCByZWFjdGluZwotdG8gdXNlciBpbnB1dC4KLTwvcD4KLTxoMz5JbXBsZW1lbnRhdGlvbjwvaDM+Ci08cD4KLVRoZSBib2FyZCBpcyBhIHRhYmxlIGZpbGxlZCB3aXRoIGh5cGVybGlua3MuIENhc2NhZGluZyBTdHlsZSBTaGVldHMKLXByb3ZpZGUgdmFyaW91cyB0aGVtZXMgYW5kIGNvbnRyb2wgdGhlIHRhYmxlIGFlc3RoZXRpYyBhcHBlYXJhbmNlLgotPGJyPlRoZSBBUEkgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3Nlci5zZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpPC9jb2RlPiBkcmF3cwotdGhlIGJvYXJkIGdhbWUgZnJvbSBIVE1MIGdlbmVyYXRlZCBpbiBtZW1vcnkuCi08YnI+UGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyPC9jb2RlPi4KLWUuZyB0aGUgcGxheWVyIGNsaWNrcyBvbiBhIGNlbGwgdGhhdCBtYXkgZ2VuZXJhdGUgYSBoeXBlcmxpbmsgd2l0aCBhIFVSTCBzaW1pbGFyIHRvCi08Y29kZT5odHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3h4MXl5MjwvY29kZT4uIFRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMKLXRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCBzZWxlY3RlZCBieSB0aGUgcGxheWVyIChjb2x1bW4gMSwgcm93IDIpLiBUaGUgbW92ZSBpcyBjb21wbGV0ZWQgYnkgZ2VuZXJhdGluZwotbmV3IEhUTUwgY29udGVudCBhbmQgaW52b2tpbmcgPGNvZGU+QnJvd3Nlci5zZXRUZXh0PC9jb2RlPiB0byB1cGRhdGUgdGhlIGJvYXJkIGdhbWUuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZGVtb3NfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2RvYy1odG1sL3N3dF9icm93c2VyX2RlbW9zX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTc1YjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZGVtb3NfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBCcm93c2VyIERlbW9zPC9oMj4KLQotPHA+Ci1UaGUgQnJvd3NlciBEZW1vcyBkZW1vbnN0cmF0ZSB2YXJpb3VzIGZlYXR1cmVzIG9mIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuIAotPC9wPjxwPlRoZSBQYXducyBHYW1lIGlzIGEgYm9hcmQgZ2FtZSB0aGF0IGNhbiBiZSBwbGF5ZWQgYWdhaW5zdCB0aGUgY29tcHV0ZXIKLW9yIGFnYWluc3QgYW5vdGhlciBwbGF5ZXIuIFJlbmRlcmluZyBpcyBiYXNlZCBvbiBIVE1MIGFuZCBDU1MgdGVjaG5pcXVlcy4gVGhlCi1ib2FyZCBpcyBhIHRhYmxlIGZpbGxlZCB3aXRoIGh5cGVybGlua3MuIENhc2NhZGluZyBTdHlsZSBTaGVldHMKLXByb3ZpZGUgdmFyaW91cyB0aGVtZXMgYW5kIGNvbnRyb2wgdGhlIHRhYmxlIGFlc3RoZXRpYyBhcHBlYXJhbmNlLgotVGhlIEFQSSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZyk8L2NvZGU+IGRyYXdzCi10aGUgYm9hcmQgZ2FtZSBmcm9tIEhUTUwgZ2VuZXJhdGVkIGluIG1lbW9yeS4KLVBsYXllciBtb3ZlcyBhcmUgY2FwdHVyZWQgYnkgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lcjwvY29kZT4uCi1lLmcgdGhlIHBsYXllciBjbGlja3Mgb24gYSBjZWxsIHRoYXQgbWF5IGdlbmVyYXRlIGFuIGh5cGVybGluayB3aXRoIGEgVVJMIHNpbWlsYXIgdG8KLWh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MveHgxeXkyLiBUaGF0IGh5cGVybGluayBpZGVudGlmaWVzCi10aGUgcG9zaXRpb24gb2YgdGhlIGNlbGwgc2VsZWN0ZWQgYnkgdGhlIHBsYXllci4gVGhlIG1vdmUgaXMgY29tcGxldGVkIGJ5IGdlbmVyYXRpbmcKLW5ldyBIVE1MIGNvbnRlbnQgYW5kIGludm9raW5nIDxjb2RlPkJyb3dzZXIuc2V0VGV4dDwvY29kZT4gdG8gdXBkYXRlIHRoZSBib2FyZCBnYW1lLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vVmlldzwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+QnJvd3NlciBEZW1vPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9pY29ucy9wYXduLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2ljb25zL3Bhd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODExZjhiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2ljb25zL3Bhd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhMGZlYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUQnJvd3NlckRlbW9zLm5hbWUgPSBTV1QgQnJvd3NlciBEZW1vcyBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuQnJvd3NlckRlbW9zLm5hbWUgPSBCcm93c2VyIERlbW8KLQotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUgPSBXb3JrYmVuY2ggVmlld3MKLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gYXMgVmlld3MgaW5zaWRlIHRoZSBXb3JrYmVuY2guICBcCi0JVGhlc2UgZXhhbXBsZXMgd2lsbCBjcmVhdGUgYSBuZXcgVmlldyBpbiB0aGUgY3VycmVudCBQZXJzcGVjdGl2ZS4KLQotbGF1bmNoaXRlbS5Ccm93c2VyRGVtb3MubmFtZSA9IEJyb3dzZXIgRGVtbwotbGF1bmNoaXRlbS5Ccm93c2VyRGVtb3MuZGVzY3JpcHRpb24gPSBcCi0JVGhlIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0IGZvciBIVE1MIHJlbmRlcmluZy5cblxuXAotCVRoZSBQYXducyBHYW1lIGlzIGEgYm9hcmQgZ2FtZSB0aGF0IGNhbiBiZSBwbGF5ZWQgYWdhaW5zdCB0aGUgY29tcHV0ZXIgb3IgYWdhaW5zdCBhbm90aGVyIHBsYXllci5cblxuXAotCVJlbmRlcmluZyBpcyBiYXNlZCBvbiBIVE1MIGFuZCBDU1MgdGVjaG5pcXVlcy4gVGhlIGJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyBcCi0JcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuIFxuXAotCVRoZSBBUEkgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3Nlci5zZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpIGRyYXdzIHRoZSBib2FyZCBnYW1lIGZyb20gSFRNTCBnZW5lcmF0ZWQgaW4gbWVtb3J5LlxuXAotCVBsYXllciBtb3ZlcyBhcmUgY2FwdHVyZWQgYnkgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lci4gZS5nIHRoZSBwbGF5ZXIgY2xpY2tzIFwKLQlvbiBhIGNlbGwgdGhhdCBkZWZpbmVzIGFuIGh5cGVybGluayB3aXRoIGEgVVJMIGh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MveHgxeXkyLlwKLQlUaGF0IGh5cGVybGluayBpZGVudGlmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCBzZWxlY3RlZCBieSB0aGUgcGxheWVyLiBUaGUgbW92ZSBpcyBjb21wbGV0ZWQgYnkgZ2VuZXJhdGluZyBcCi0JbmV3IEhUTUwgY29udGVudCBhbmQgaW52b2tpbmcgQnJvd3Nlci5zZXRUZXh0IHRvIHVwZGF0ZSB0aGUgYm9hcmQgZ2FtZS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ1OGRjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zIgotICAgbmFtZT0iJXBsdWdpbi5TV1RCcm93c2VyRGVtb3MubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5Ccm93c2VyRGVtb1BsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iQnJvd3NlckRlbW8uamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkJyb3dzZXJEZW1vcy5uYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgYWxsb3dNdWx0aXBsZT0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3MuQnJvd3NlckRlbW9WaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvcGF3bi5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iQnJvd3NlciBEZW1vIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnZpZXdzLkJyb3dzZXJEZW1vVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5Ccm93c2VyRGVtb3MubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Ccm93c2VyRGVtb3MuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJkZW1vcy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3MuQnJvd3NlckRlbW9WaWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvQnJvd3NlckRlbW9QbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9Ccm93c2VyRGVtb1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNkYmRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9Ccm93c2VyRGVtb1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyRGVtb1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBCcm93c2VyRGVtb1BsdWdpbiBwbHVnaW47Ci0JUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX1BBVEggPSBudWxsOwotCQotCXB1YmxpYyBCcm93c2VyRGVtb1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5Ccm93c2VyRGVtb1BsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCVBMVUdJTl9QQVRIID0gUGxhdGZvcm0ucmVzb2x2ZShwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi4iKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCcm93c2VyRGVtb1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gQnJvd3NlckRlbW9QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL1Bhd25zLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvUGF3bnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyZjFlNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvUGF3bnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3M7Ci0KLXB1YmxpYyBjbGFzcyBQYXducyB7Ci0KLQkvKiBDdXJyZW50IGJvYXJkIHJlcHJlc2VudGF0aW9uIGluIGNvbXBhY3RlZCBmb3JtICovCi0JYnl0ZVtdIGdhbWUgPSBuZXcgYnl0ZVs2NF07Ci0JLyogQmVzdCBtb3ZlICovCi0JaW50IGJlc3RJbmRleCA9IC0xOwotCS8qIFJlbGF0ZWQgYmVzdCBzY29yZSAqLwotCWludCBiZXN0U2NvcmUgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQkvKiBFc3RpbWF0ZWQgc3RyYXRlZ2ljIHZhbHVlIG9mIGVhY2ggY2VsbCBiYXNlZCBvbiBwcm94aW1pdHkgdG8gd2FsbHMgKi8KLQlzdGF0aWMgaW50W10gZ2FtZVdhbGxXZWlnaHQgPSBuZXcgaW50WzY0XTsKLQlUaHJlYWQgdGhyZWFkID0gbnVsbDsKLQlib29sZWFuIHRocmVhZFN0b3AgPSBmYWxzZTsKLQkKLQlmaW5hbCBzdGF0aWMgYnl0ZSBFTVBUWSA9IDA7Ci0JZmluYWwgc3RhdGljIGJ5dGUgV0hJVEUgPSAxOwotCWZpbmFsIHN0YXRpYyBieXRlIEJMQUNLID0gMjsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXQUxMID0gMzsKLQkKLXB1YmxpYyBQYXducygpIHsKLX0KLQotLyogUHJvdmlkZSB0aGUgY3VycmVudCBnYW1lIGFuZCBpZ25pdGlhdGUgdGhlIHNlYXJjaCBvZiB0aGUgYmVzdCBtb3ZlIGZvciB0aGUgZ2l2ZW4gdHlwZQotICogTXVzdCByZXR1cm4gaW1tZWRpYXRlbHkgYXMgaXQgd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICogVGhlIFVJIHRocmVhZCB3aWxsIGZldGNoIHRoZSBiZXN0IG1vdmUgYW55IHRpbWUgdGhlcmVhZnRlci4KLSAqLwotcHVibGljIHZvaWQgcGxheVJlcXVlc3QoYnl0ZVtdW10gZ2FtZSwgaW50IHR5cGUpIHsKLQl0aHJlYWRTdG9wID0gdHJ1ZTsKLQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJYmVzdEluZGV4ID0gLTE7Ci0JCWJlc3RTY29yZSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCQljb252ZXJ0KGdhbWUsIHRoaXMuZ2FtZSk7Ci0JCWluaXRQYXduQm9yZGVycyh0aGlzLmdhbWUsIGdhbWVXYWxsV2VpZ2h0KTsKLQkJLyogUXVpY2tseSBjb21wdXRlIGEgbGVnYWwgbW92ZSAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZ2FtZS5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRoaXMuZ2FtZVtpXSA9PSBFTVBUWSkgewotCQkJCWJlc3RJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzeW5jaHJvbml6ZWQoUGF3bnMudGhpcykgewotCQkJCQl0aHJlYWRTdG9wID0gZmFsc2U7Ci0JCQkJCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbMl07Ci0JCQkJCS8qIGlmIGxvbmcgdGltZSwgbXVzdCBjaGVjayBmb3IgdGhyZWFkU3RvcCBhbmQgZXhpdCBlYXJseSAqLyAKLQkJCQkJZXZhbEJlc3QoUGF3bnMudGhpcy5nYW1lLCBCTEFDSywgMiwgcmVzdWx0KTsKLQkJCQkJYmVzdEluZGV4ID0gcmVzdWx0WzBdOwotCQkJCQliZXN0U2NvcmUgPSByZXN1bHRbMV07Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JfQotfQotCi0vKiBGZXRjaCBiZXN0IG1vdmUgaW4gbmF0dXJhbCBjb29yZGluYXRlcyBmb3IgdGhlIGJvYXJkIHByZXZpb3VzbHkgZ2l2ZW4gaW4KLSAqIHRoZSBjYWxsIHRvIHBsYXlSZXF1ZXN0LgotICovCi1wdWJsaWMgdm9pZCBnZXRCZXN0TW92ZShpbnRbXSBwb2ludCkgewotCWNvbnZlcnQoYmVzdEluZGV4LCBwb2ludCk7Ci0JdGhyZWFkU3RvcCA9IHRydWU7Ci19Ci0KLS8qIEdpdmVuIGFuIGV4cGFuZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBib2FyZCwgZm9ybWF0IGludGVybmFsIGNvbXBhY3QgbW9kZSAqLwotc3RhdGljIHZvaWQgY29udmVydChieXRlW11bXSBib2FyZCwgYnl0ZVtdIGcpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IGJvYXJkLmxlbmd0aDsgaSsrKSBTeXN0ZW0uYXJyYXljb3B5KGJvYXJkW2ldLCAwLCBnLCBpICogOCwgOCk7Ci19Ci0vKiBVcGRhdGUgZ2l2ZW4gY29tcGFjdCBtb2RlbCBiYXNlZCBvbiBwbGF5ZXIgbW92ZSBpbiBuYXR1cmFsIGNvb3JkaW5hdGVzICovCi1zdGF0aWMgdm9pZCBzZXQoYnl0ZVtdIGcsIGludCB4LCBpbnQgeSwgYnl0ZSB0eXBlKSB7Ci0JZ1t4KjgreV0gPSB0eXBlOwotfQotLyogR2l2ZW4gYW4gaW5kZXggaW4gY29tcGFjdCByZXByZXNlbnRhdGlvbiwgcmV0dXJuIG5hdHVyYWwgY29vcmRpbmF0ZXMgKi8KLXN0YXRpYyB2b2lkIGNvbnZlcnQoaW50IGluZGV4LCAvKm91dCBbMF0geCBbMV0geSAqL2ludFtdIHBvaW50KSB7Ci0JcG9pbnRbMF0gPSBpbmRleCAvIDg7Ci0JcG9pbnRbMV0gPSBpbmRleCAlIDg7Ci19Ci0vKiBHaXZlbiBhbiBpbmRleCBpbnRvIHRoZSBjb21wYWN0IG1vZGVsIGFuZCB0aGUgbmVpZ2hib3VyIGNvZGUsCi0gKiByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nIG5laWdoYm91ciBpbmRleC4KLSAqIFJldHVybnMgLTEgaWYgdGhlcmUgaXMgbm8gbmVpZ2hib3VyLgotICogCi0gKiBOZWlnaGJvdXIgY29kZSBmb3IgdGhlIGluZGV4IFgKLSAqIDAgMSAyCi0gKiAzIFggNAotICogNSA2IDcgCi0gKi8KLXN0YXRpYyBpbnQgZ2V0TmVpZ2hib3VySW5kZXgoYnl0ZVtdIGcsIGludCBpbmRleCwgaW50IG5laWdoYm91cikgewotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZy5sZW5ndGgpIHJldHVybiAtMTsKLQlpbnQgcmVzdWx0ID0gLTE7Ci0Jc3dpdGNoIChuZWlnaGJvdXIpIHsKLQkJY2FzZSAwOiByZXN1bHQgPSBpbmRleCA8IDggfHwgaW5kZXggJSA4ID09IDAgPyAtMSA6IGluZGV4IC0gOTsgYnJlYWs7Ci0JCWNhc2UgMTogcmVzdWx0ID0gaW5kZXggPCA4ID8gLTEgOiBpbmRleCAtIDg7IGJyZWFrOwotCQljYXNlIDI6IHJlc3VsdCA9IGluZGV4IDwgOCB8fCBpbmRleCAlIDggPT0gNyA/IC0xIDogaW5kZXggLSA3OyBicmVhazsKLQkJY2FzZSAzOiByZXN1bHQgPSBpbmRleCAlIDggPT0gMCA/IC0xIDogaW5kZXggLSAxOyBicmVhazsKLQkJY2FzZSA0OiByZXN1bHQgPSBpbmRleCAlIDggPT0gNyA/IC0xIDogaW5kZXggKyAxOyBicmVhazsKLQkJY2FzZSA1OiByZXN1bHQgPSBpbmRleCAlIDggPT0gMCB8fCBpbmRleCA+PSA1NiA/IC0xIDogaW5kZXggKyA3OyBicmVhazsKLQkJY2FzZSA2OiByZXN1bHQgPSBpbmRleCA+PSA1NiA/IC0xIDogaW5kZXggKyA4OyBicmVhazsKLQkJY2FzZSA3OiByZXN1bHQgPSBpbmRleCAlIDggPT0gNyB8fCBpbmRleCA+PSA1NiA/IC0xIDogaW5kZXggKyA5OyBicmVhazsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qIE1ha2UgdGhlIHBsYXllciB0eXBlIHBsYXkgYXQgaW5kZXggb24gZ2l2ZW4gY29tcGFjdCBib2FyZCAKLSAqIENvbXB1dGUgYWxsIHBhd25zIHRoYXQgbXVzdCBiZSByZXZlcnNlZC4KLSAqLwotc3RhdGljIHZvaWQgcGxheShieXRlW10gZywgaW50IGluZGV4LCBieXRlIHR5cGUpIHsKLQlieXRlIG9wcG9uZW50VHlwZSA9IHR5cGUgPT0gV0hJVEUgPyBCTEFDSyA6IFdISVRFOwotCWZvciAoaW50IG5laWdoYm91ciA9IDA7IG5laWdoYm91ciA8PSA3OyBuZWlnaGJvdXIrKykgewotCQlpbnQgbkluZGV4ID0gZ2V0TmVpZ2hib3VySW5kZXgoZywgaW5kZXgsIG5laWdoYm91cik7Ci0JCWludFtdIHJldmVyc2lJbmRlY2VzID0gbmV3IGludFs2XTsKLQkJaW50IG5SZXZlcnNpID0gMDsKLQkJd2hpbGUgKG5JbmRleCAhPSAtMSAmJiBuUmV2ZXJzaSA8IDYgJiYgZ1tuSW5kZXhdID09IG9wcG9uZW50VHlwZSkgewotCQkJcmV2ZXJzaUluZGVjZXNbblJldmVyc2ldID0gbkluZGV4OwotCQkJblJldmVyc2krKzsKLQkJCW5JbmRleCA9IGdldE5laWdoYm91ckluZGV4KGcsIG5JbmRleCwgbmVpZ2hib3VyKTsJCQkKLQkJfQotCQlpZiAoblJldmVyc2kgPiAwICYmIG5JbmRleCAhPSAtMSAmJiBnW25JbmRleF0gPT0gdHlwZSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmV2ZXJzaTsgaSsrKSBnW3JldmVyc2lJbmRlY2VzW2ldXSA9IHR5cGU7Ci0JCX0KLQl9Ci0JZ1tpbmRleF0gPSB0eXBlOwotfQotLyogRXZhbHVhdGUgdGhlIGdpdmVuIGNvbXBhY3QgbW9kZWwgYmFzZWQgb24gcGF3bnMgZGlzdHJpYnV0aW9uIAotICogSGlnaCBtZWFucyB3aGl0ZSBoYXMgYWR2YW50YWdlLiBCZWxvdyB6ZXJvIG1lYW5zIGJsYWNrIGhhcyBhZHZhbnRhZ2UuCi0gKi8KLXN0YXRpYyBpbnQgZXZhbChieXRlW10gZykgewotCWludCBjbnRXaGl0ZSA9IDAsIGNudEJsYWNrID0gMCwgY250RW1wdHkgPSAwOwotCWludCBjbnRXaGl0ZVdhbGxBZHZhbnRhZ2UgPSAwLCBjbnRCbGFja1dhbGxBZHZhbnRhZ2UgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQlpZiAoZ1tpXSA9PSBXSElURSkgewotCQkJY250V2hpdGUrKzsKLQkJCWNudFdoaXRlV2FsbEFkdmFudGFnZSArPSBnYW1lV2FsbFdlaWdodFtpXTsKLQkJfQotCQllbHNlIGlmIChnW2ldID09IEJMQUNLKSB7Ci0JCQljbnRCbGFjaysrOwotCQkJY250QmxhY2tXYWxsQWR2YW50YWdlICs9IGdhbWVXYWxsV2VpZ2h0W2ldOwotCQl9Ci0JCWVsc2UgaWYgKGdbaV0gPT0gRU1QVFkpIGNudEVtcHR5Kys7Ci0JfQotCWlmIChjbnRFbXB0eSA9PSAwKSB7Ci0JCWlmIChjbnRXaGl0ZSA+IGNudEJsYWNrKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7IC8qIFdoaXRlIHdpbnMgKi8KLQkJaWYgKGNudFdoaXRlIDwgY250QmxhY2spIHJldHVybiBJbnRlZ2VyLk1JTl9WQUxVRTsgLyogQmxhY2sgd2lucyAqLwotCQlyZXR1cm4gMDsgLyogU3RhbGVtYXRlICovCi0JfQotCXJldHVybiBjbnRXaGl0ZSArIGNudFdoaXRlV2FsbEFkdmFudGFnZSAtIGNudEJsYWNrIC0gY250QmxhY2tXYWxsQWR2YW50YWdlOwotfQotCi0vKiBSZWNvZ25pemUgcGF3bnMgcHJvdGVjdGVkIGJ5IHdhbGxzIG9yIGJvcmRlcnMgCi0gKiBUQkQgLSBub3RlIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggY2VsbCBhbmQgc3RvcmVkCi0gKiBpbiBhIHNlcGFyYXRlIGJ5dGVbXSBnV2FsbEdhaW4KLSAqICovCi1zdGF0aWMgdm9pZCBpbml0UGF3bkJvcmRlcnMoYnl0ZVtdIGcsIGludFtdIGdhbWVXYWxsV2VpZ2h0KSB7Ci0JLyogQSBwYXduIGhhcyA4IG5laWdoYm91cnMgb24gNCBheGVzLgotCSAqIFN0cmF0ZWdpYyBwYXducyBoYXZlIG9uZSBzaWRlIG9mIGVhY2ggYXhpcyBwcm90ZWN0ZWQgYnkgYSB3YWxsIGFuZCB0aGUgb3RoZXIKLQkgKiBzaWRlIG5vdCBjbG9zZWQgYnkgYSB3YWxsLgotCSAqIEEgcGF3biBjYW5ub3QgYmUgcmV2ZXJzZWQgd2hlbiBlYWNoIG9mIGl0cyA0IGF4ZXMgYXJlIHByb3RlY3RlZCBieSBhIHdhbGwgb24KLQkgKiBvbmUgc2lkZS4gUGF3bnMgdGhhdCBoYXZlIG1vcmUgdGhhbiA0IHdhbGxzIGFyZSBsZXNzIGludGVyZXN0aW5nIHNpbmNlIHRoZXkKLQkgKiBhcmUgbm90IG9wZW4gZW5vdWdoIHRvIHRoZSBib2FyZC4KLQkgKiAKLQkgKiBOYnIgd2FsbHMsIG5iciBheGlzIGNvdmVyZWQsIGVzdGltYXRlZCB2YWx1ZQotCSAqIDAgbi9hIDAKLQkgKiAxIDEgMgotCSAqIDIgMSAxCi0JICogMiAyIDYKLQkgKiAzIDIgNAotCSAqIDQgMiAyCi0JICogMyAzIDkKLQkgKiA0IDMgOAotCSAqIDQgNCAxNgotCSAqIDUgNCAxNAotCSAqIDYgNCA5Ci0JICogNyA0IDYKLQkgKiA4IDQgMAotCSAqLwotCWludFtdIG5UeXBlcyA9IG5ldyBpbnRbOF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWludCBuV2FsbHMgPSAwOwotCQlpbnQgbkF4aXMgPSAwOwotCQlmb3IgKGludCBuID0gMDsgbiA8IDg7IG4rKykgewotCQkJaW50IG5JbmRleCA9IGdldE5laWdoYm91ckluZGV4KGcsIGksIG4pOwotCQkJblR5cGVzW25dID0gbkluZGV4ICE9IC0xID8gZ1tuSW5kZXhdIDogV0FMTDsKLQkJCWlmIChuVHlwZXNbbl0gPT0gV0FMTCkgbldhbGxzKys7Ci0JCX0KLQkJaW50IHNjb3JlID0gbldhbGxzOwotCQlpZiAobldhbGxzID4gMCkgewotCQkJaWYgKG5UeXBlc1swXSA9PSBXQUxMIHx8IG5UeXBlc1s3XSA9PSBXQUxMKSBuQXhpcysrOwotCQkJaWYgKG5UeXBlc1sxXSA9PSBXQUxMIHx8IG5UeXBlc1s2XSA9PSBXQUxMKSBuQXhpcysrOwotCQkJaWYgKG5UeXBlc1syXSA9PSBXQUxMIHx8IG5UeXBlc1s1XSA9PSBXQUxMKSBuQXhpcysrOwotCQkJaWYgKG5UeXBlc1s0XSA9PSBXQUxMIHx8IG5UeXBlc1szXSA9PSBXQUxMKSBuQXhpcysrOwotCQkJc3dpdGNoIChuQXhpcykgewotCQkJCWNhc2UgNDogc3dpdGNoIChuV2FsbHMpIHsgY2FzZSA0OiBzY29yZSA9IDE2OyBicmVhazsgY2FzZSA1OiBzY29yZSA9IDE0OyBicmVhazsgY2FzZSA2OiBzY29yZSA9IDk7IGNhc2UgNzogc2NvcmUgPSA2OyBicmVhazsgY2FzZSA4OiBzY29yZSA9IDA7IGJyZWFrO30gYnJlYWs7Ci0JCQkJY2FzZSAzOiBzd2l0Y2ggKG5XYWxscykgeyBjYXNlIDM6IHNjb3JlID0gOTsgYnJlYWs7IGNhc2UgNDogc2NvcmUgPSA4O30gYnJlYWs7Ci0JCQkJY2FzZSAyOiBzd2l0Y2ggKG5XYWxscykgeyBjYXNlIDI6IHNjb3JlID0gNjsgYnJlYWs7IGNhc2UgMzogc2NvcmUgPSA0OyBicmVhazsgY2FzZSA0OiBzY29yZSA9IDI7IH0gYnJlYWs7Ci0JCQkJY2FzZSAxOiBzd2l0Y2ggKG5XYWxscykgeyBjYXNlIDE6IHNjb3JlID0gMjsgYnJlYWs7IGNhc2UgMjogc2NvcmUgPSAxOyBicmVhazt9IGJyZWFrOwotCQkJfQotCQl9Ci0JCWdhbWVXYWxsV2VpZ2h0W2ldID0gc2NvcmU7Ci0JfQotfQotCi0vKiBFdmFsdWF0ZSB0aGUgYmVzdCBtb3ZlIGZvciBwbGF5ZXIgdHlwZSBmb3IgdGhlIGdpdmVuIGJvYXJkLCBkb2luZyBhIGRlcHRoIDEgc2VhcmNoICovCi1zdGF0aWMgdm9pZCBldmFsQmVzdChieXRlW10gZywgYnl0ZSB0eXBlLCBpbnQgZGVwdGgsIC8qIG91dCBbMF0gYmVzdCBtb3ZlLCBbMV0gbWluaW1heCAqL2ludFtdIHJlc3VsdCkgewotCWJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVs2NF07Ci0JYnl0ZSBvcHBvbmVudFR5cGUgPSB0eXBlID09IFdISVRFID8gQkxBQ0sgOiBXSElURTsKLQlyZXN1bHRbMF0gPSAtMTsgcmVzdWx0WzFdID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWlmIChnW2ldID09IEVNUFRZKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGcsIDAsIHRtcCwgMCwgNjQpOwotCQkJcGxheSh0bXAsIGksIHR5cGUpOwotCQkJaW50IHNjb3JlID0gZXZhbCh0bXApOwotCQkJaWYgKGRlcHRoID4gMSkgewotCQkJCWludFtdIHRtcFJlc3VsdCA9IG5ldyBpbnRbMl07Ci0JCQkJZXZhbEJlc3QodG1wLCBvcHBvbmVudFR5cGUsIGRlcHRoIC0gMSwgdG1wUmVzdWx0KTsKLQkJCQlzY29yZSA9IHRtcFJlc3VsdFsxXTsKLQkJCX0KLQkJCWlmICgodHlwZSA9PSBXSElURSAmJiBzY29yZSA+IHJlc3VsdFsxXSkgfHwgKHR5cGUgPT0gQkxBQ0sgJiYgc2NvcmUgPCByZXN1bHRbMV0pIHx8IHJlc3VsdFswXSA9PSAtMSkgewotCQkJCXJlc3VsdFswXSA9IGk7Ci0JCQkJcmVzdWx0WzFdID0gc2NvcmU7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvQnJvd3NlckRlbW9WaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvQnJvd3NlckRlbW9WaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOTNlNzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL0Jyb3dzZXJEZW1vVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyRGVtb1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JQWN0aW9uIHBhd25BY3Rpb247Ci0JQWN0aW9uIGVkaXRBY3Rpb247Ci0JQ29tcG9zaXRlIHBhcmVudDsKLQkKLQlwdWJsaWMgQnJvd3NlckRlbW9WaWV3KCkgewotCX0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlicm93c2VyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCXRleHQuc2V0VGV4dCgiQnJvd3NlciB3aWRnZXQgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gVGhlIGV4YWN0IGVycm9yIGlzOlxyXG4iK2UpOwotCQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlUYWJGb2xkZXIgZm9sZGVyID0gbmV3IFRhYkZvbGRlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCW5ldyBQYXduVGFiKGl0ZW0pOwotCQkKLQkJaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQluZXcgRWRpdG9yVGFiKGl0ZW0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9FZGl0b3JUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9FZGl0b3JUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzE2NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvRWRpdG9yVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEVkaXRvclRhYiB7Ci0JQnJvd3NlciBicm93c2VyOwotCVRleHQgaHRtbFRleHQsIHNjcmlwdFRleHQ7Ci0JQnV0dG9uIGh0bWxCdXR0b24sIHNjcmlwdEJ1dHRvbjsKLQlzdGF0aWMgU3RyaW5nIGh0bWwgPSAKLQkJIjxodG1sPlxyXG4iKwotCQkiCTxib2R5PlxyXG4iKwotCQkiCQk8aDEgaWQ9J215aWQnPkhUTUwgRG9jdW1lbnQ8L2gxPlxyXG4iKwotCQkiCQk8aDI+U2V0IEhUTUwgY29udGVudDwvaDI+XHJcbiIrCi0JCSIJCTxvbD5cclxuIisKLQkJIgkJCTxsaT5FbnRlciBodG1sIGRhdGEgaW50byB0aGUgJ3NldFRleHQnIHBhbmU8L2xpPlxyXG4iKwotCQkiCQkJPGxpPkNsaWNrIG9uICdzZXRUZXh0JyB0byBzZXQgdGhlIG5ldyBjb250ZW50PC9saT5cclxuIisKLQkJIgkJPC9vbD5cclxuIisKLQkJIgkJPGgyPlF1ZXJ5IG9yIG1vZGlmeSBIVE1MIGRvY3VtZW50PC9oMj5cclxuIisKLQkJIgkJPG9sPlxyXG4iKwotCQkiCQk8bGk+RW50ZXIgamF2YXNjcmlwdCBjb21tYW5kcyBpbnRvIHRoZSAnZXhlY3V0ZScgcGFuZTwvbGk+XHJcbiIrCi0JCSIJCTxsaT5DbGljayBvbiAnZXhlY3V0ZScgdG8gcnVuIHRoZSBqYXZhc2NyaXB0IGluIHRoZSBjdXJyZW50IGRvY3VtZW50PC9saT5cclxuIisKLQkJIgkJPC9vbD5cclxuIisKLQkJIgk8L2JvZHk+XHJcbiIrCi0JCSI8L2h0bWw+IjsKLQkKLQlzdGF0aWMgU3RyaW5nIHNjcmlwdCA9IAotCQkidmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQJyk7XHJcbiIrCi0JCSJ2YXIgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdDb250ZW50IGluc2VydGVkIScpO1xyXG4iKwotCQkibm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuIisKLQkJImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWlkJykuYXBwZW5kQ2hpbGQobm9kZSk7XHJcblxyXG4iKwotCQkiZG9jdW1lbnQuYmdDb2xvciA9ICd5ZWxsb3cnOyI7Ci0JCi0JcHVibGljIEVkaXRvclRhYihUYWJJdGVtIGl0ZW0pIHsKLQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoaXRlbS5nZXRQYXJlbnQoKSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIkVkaXRvciIpOwotCQlpdGVtLnNldENvbnRyb2wocGFyZW50KTsKLQkJCi0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgU2FzaCBzYXNoID0gbmV3IFNhc2gocGFyZW50LCBTV1QuVkVSVElDQUwpOwotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlmaW5hbCBGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCgpOwotCQlwYXJlbnQuc2V0TGF5b3V0KGZvcm0pOwotCQkKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlicm93c2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlzYXNoRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAwKTsKLQkJc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlzYXNoRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJc2FzaC5zZXRMYXlvdXREYXRhKHNhc2hEYXRhKTsKLQkJc2FzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBzYXNoLmdldEJvdW5kcygpOwotCQkJCVJlY3RhbmdsZSBwYXJlbnRSZWN0ID0gc2FzaC5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJaW50IHJpZ2h0ID0gcGFyZW50UmVjdC53aWR0aCAtIHJlY3Qud2lkdGggLSAyMDsKLQkJCQllLnggPSBNYXRoLm1heChNYXRoLm1pbihlLngsIHJpZ2h0KSwgMjApOwotCQkJCWlmIChlLnggIT0gcmVjdC54KSB7Ci0JCQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgZS54KTsKLQkJCQkJcGFyZW50LmxheW91dCgpOwotCQkJCX0KLQkJCX0JCQkKLQkJfSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJLyogSW5pdGlhbGl6ZSBQYW5lbCAqLwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCUdyb3VwIGh0bWxHcm91cCA9IG5ldyBHcm91cChwYW5lbCwgU1dULk5PTkUpOwotCQlodG1sR3JvdXAuc2V0VGV4dCgic2V0VGV4dCIpOwotCQlodG1sVGV4dCA9IG5ldyBUZXh0KGh0bWxHcm91cCwgU1dULk1VTFRJKTsKLQkJaHRtbEJ1dHRvbiA9IG5ldyBCdXR0b24oaHRtbEdyb3VwLCBTV1QuUFVTSCk7Ci0JCWh0bWxCdXR0b24uc2V0VGV4dCgic2V0VGV4dCIpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlodG1sR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlodG1sVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJaHRtbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaHRtbEdyb3VwLmxheW91dCgpOwotCQkKLQkJR3JvdXAgc2NyaXB0R3JvdXAgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OT05FKTsKLQkJc2NyaXB0R3JvdXAuc2V0VGV4dCgiZXhlY3V0ZSIpOwotCQlzY3JpcHRUZXh0ID0gbmV3IFRleHQoc2NyaXB0R3JvdXAsIFNXVC5NVUxUSSk7Ci0JCXNjcmlwdEJ1dHRvbiA9IG5ldyBCdXR0b24oc2NyaXB0R3JvdXAsIFNXVC5QVVNIKTsKLQkJc2NyaXB0QnV0dG9uLnNldFRleHQoImV4ZWN1dGUiKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXNjcmlwdEdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJc2NyaXB0VGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJc2NyaXB0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlzY3JpcHRHcm91cC5sYXlvdXQoKTsKLQkJCi0JCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQkJaHRtbFRleHQuc2V0VGV4dChodG1sKTsKLQkJc2NyaXB0VGV4dC5zZXRUZXh0KHNjcmlwdCk7Ci0JCXBhcmVudC5sYXlvdXQoKTsKLQkJCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVdpZGdldCB3ID0gZS53aWRnZXQ7Ci0JCQkJaWYgKHcgPT0gaHRtbEJ1dHRvbikgYnJvd3Nlci5zZXRUZXh0KGh0bWxUZXh0LmdldFRleHQoKSk7Ci0JCQkJaWYgKHcgPT0gc2NyaXB0QnV0dG9uKSBicm93c2VyLmV4ZWN1dGUoc2NyaXB0VGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9OwotCQkKLQkJaHRtbEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCXNjcmlwdEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL1Bhd25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9QYXduVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxM2YxMmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL1Bhd25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5Ccm93c2VyRGVtb1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5QYXduczsKLQotcHVibGljIGNsYXNzIFBhd25UYWIgewotCi0JQWN0aW9uIHBhd25BY3Rpb247Ci0JQWN0aW9uIGVkaXRBY3Rpb247Ci0JCi0JQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQlSZXZlcnNpTGlzdGVuZXIgcmV2ZXJzaUxpc3RlbmVyOwotCi0JZmluYWwgc3RhdGljIGludCBUWVBFX1dFTENPTUUgPSAxOwotCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9TVEFSVCA9IDI7Ci0JZmluYWwgc3RhdGljIGludCBUWVBFX0JPQVJEID0gMzsKLQlmaW5hbCBzdGF0aWMgaW50IFRZUEVfQk9BUkRfT1ZFUiA9IDQ7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTCA9ICJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zLyI7Ci0Jc3RhdGljIFN0cmluZyBQTFVHSU5fUEFUSCA9IEJyb3dzZXJEZW1vUGx1Z2luLlBMVUdJTl9QQVRIOwotCXN0YXRpYyBTdHJpbmcgQ1NTX0ZPTERFUiA9ICJjc3MyIjsKLQlzdGF0aWMgU3RyaW5nIFVSTF9DU1MgPSBQTFVHSU5fUEFUSCtDU1NfRk9MREVSKyIvc3R5bGUuY3NzIjsKLQlzdGF0aWMgU3RyaW5nIFVSTF9XRUxDT01FID1QTFVHSU5fUEFUSCtDU1NfRk9MREVSKyIvd2VsY29tZS5odG1sIjsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1NUQVJUXzJfUExBWUVSUyA9ICJhY3Rpb25zdGFydDJwbGF5ZXJzIjsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9TVEFSVF8xX1BMQVlFUiA9ICJhY3Rpb25zdGFydDFwbGF5ZXIiOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1dISVRFID0gImFjdGlvbndoaXRlIjsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9CTEFDSyA9ICJhY3Rpb25ibGFjayI7Ci0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fVEhFTUUgPSAiYWN0aW9udGhlbWUiOwotCi0Jc3RhdGljIGJ5dGVbXVtdIGdhbWUgPSBudWxsOwotCXN0YXRpYyBib29sZWFuIGlzV2hpdGUgPSB0cnVlOwotCXN0YXRpYyBpbnQgY250V2hpdGUgPSAwLCBjbnRCbGFjayA9IDA7Ci0Jc3RhdGljIGJvb2xlYW4gY29tcHV0ZXIgPSBmYWxzZTsKLQlzdGF0aWMgaW50IGN4LCBjeTsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBFTVBUWSA9IDA7Ci0JZmluYWwgc3RhdGljIGJ5dGUgV0hJVEUgPSAxOwotCWZpbmFsIHN0YXRpYyBieXRlIEJMQUNLID0gMjsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXQUxMID0gMzsKLQkKLQlzdGF0aWMgUGF3bnMgdHRyID0gbnVsbDsKLQlzdGF0aWMgaW50W10gbW92ZSA9IG5ldyBpbnRbMl07Ci0Jc3RhdGljIE1lbnUgbWVudSA9IG51bGw7Ci0JCi0JcHVibGljIFBhd25UYWIoVGFiSXRlbSBpdGVtKSB7CQkKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihpdGVtLmdldFBhcmVudCgpLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaXRlbS5zZXRUZXh0KCJQYXducyIpOwotCQlpdGVtLnNldENvbnRyb2woYnJvd3Nlcik7Ci0KLQkJbWVudSA9IG5ldyBNZW51KGJyb3dzZXIuZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7Ci0JCU1lbnVJdGVtIGl0ZW0yID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbTIuc2V0VGV4dCgiRW5kIEdhbWUiKTsKLQkJaXRlbTIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWdhbWUgPSBudWxsOwotCQkJCWlzV2hpdGUgPSB0cnVlOwotCQkJCWNudFdoaXRlID0gMDsgY250QmxhY2sgPSAwOwotCQkJCXR0ciA9IG51bGw7Ci0JCQkJYnJvd3Nlci5zZXRVcmwoVVJMX1dFTENPTUUpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5zZXRNZW51KG1lbnUpOwotCQkKLQkJcmV2ZXJzaUxpc3RlbmVyID0gbmV3IFJldmVyc2lMaXN0ZW5lcigpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIocmV2ZXJzaUxpc3RlbmVyKTsKLQkJYnJvd3Nlci5zZXRVcmwoVVJMX1dFTENPTUUpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0SHRtbChpbnQgdHlwZSkgewotCQlTdHJpbmcgaHRtbCA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFRZUEVfQk9BUkQ6Ci0JCWNhc2UgVFlQRV9CT0FSRF9PVkVSOiB7Ci0JCQlodG1sID0gIjxodG1sPjxoZWFkZXI+PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIiK1VSTF9DU1MrIlwiPjwvaGVhZGVyPjxib2R5PjxkaXYgY2xhc3M9XCJib2FyZFwiPjx0YWJsZT48dGJvZHk+IjsKLQkJCVN0cmluZyBjbGFzc1BsYXllcldoaXRlID0gInBsYXllcndoaXRlIiwgY2xhc3NQbGF5ZXJCbGFjayA9ICJwbGF5ZXJibGFjayI7Ci0JCQlpZiAodHlwZSA9PSBUWVBFX0JPQVJEX09WRVIpIHsKLQkJCQlpZiAoY250V2hpdGUgPiBjbnRCbGFjaykgewotCQkJCQljbGFzc1BsYXllcldoaXRlICs9ICIgd2lubmVyIjsKLQkJCQkJY2xhc3NQbGF5ZXJCbGFjayArPSAiIGxvc2VyIjsKLQkJCQl9IGVsc2UgewotCQkJCQljbGFzc1BsYXllcldoaXRlICs9ICIgbG9zZXIiOwotCQkJCQljbGFzc1BsYXllckJsYWNrICs9ICIgd2lubmVyIjsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgd2hpdGUgPSAiPHRkIGNsYXNzPVwid2hpdGVcIi8+IjsKLQkJCVN0cmluZyBibGFjayA9ICI8dGQgY2xhc3M9XCJibGFja1wiLz4iOwotCQkJU3RyaW5nIHdhbGwgPSAiPHRkIGNsYXNzPVwid2FsbFwiLz4iOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaHRtbCArPSAiPHRyPiI7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBnYW1lWzBdLmxlbmd0aDsgaisrKSB7Ci0JCQkJCXN3aXRjaCAoZ2FtZVtpXVtqXSkgewotCQkJCQkJY2FzZSBFTVBUWTogewotCQkJCQkJCVN0cmluZyBlbXB0eSA9ICI8dGQgY2xhc3M9XCIiKyhpc1doaXRlID8gIndoaXRlbGluayIgOiAiYmxhY2tsaW5rIikrIlwiPiIrIChpc1doaXRlIHx8ICghaXNXaGl0ZSAmJiAhY29tcHV0ZXIpID8gIjxhIGhyZWY9XCIiK1VSTCsoaXNXaGl0ZSA/IEFDVElPTl9XSElURSA6IEFDVElPTl9CTEFDSykrIi94eCIraSsieXkiK2orIlwiIGNsYXNzPVwiZW1wdHlcIi8+IiA6ICI8ZGl2IGNsYXNzPVwiZW1wdHlcIi8+IikrIjwvdGQ+IjsKLQkJCQkJCQlodG1sICs9IGVtcHR5OyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgV0hJVEU6IGh0bWwgKz0gd2hpdGU7IGJyZWFrOwotCQkJCQkJY2FzZSBCTEFDSzogaHRtbCArPSBibGFjazsgYnJlYWs7Ci0JCQkJCQljYXNlIFdBTEw6IGh0bWwgKz0gd2FsbDsgYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaHRtbCArPSI8L3RyPiI7Ci0JCQl9Ci0JCQlodG1sICs9ICI8L3Rib2R5PjwvdGFibGU+PC9kaXY+IjsKLQkJCWh0bWwgKz0gIjxkaXYgY2xhc3M9XCIiK2NsYXNzUGxheWVyV2hpdGUrIlwiPiIrY250V2hpdGUrIjwvZGl2PiI7Ci0JCQlodG1sICs9ICI8ZGl2IGNsYXNzPVwiIitjbGFzc1BsYXllckJsYWNrKyJcIj4iK2NudEJsYWNrKyI8L2Rpdj4iOwotCQkJaHRtbCArPSAiPC9ib2R5PjwvaHRtbD4iOwotCQkJYnJlYWs7Ci0JCX0KLQkJfQotCQlyZXR1cm4gaHRtbDsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUmV2ZXJzaUxpc3RlbmVyIGltcGxlbWVudHMgTG9jYXRpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBlKSB7Ci0JCQl0cnkgewotCQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZS53aWRnZXQ7Ci0JCQlpZiAoZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9TVEFSVF8xX1BMQVlFUikgIT0gLTEgfHwgZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9TVEFSVF8yX1BMQVlFUlMpICE9IC0xKSB7Ci0JCQkJY29tcHV0ZXIgPSBlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1NUQVJUXzFfUExBWUVSKSAhPSAtMTsKLQkJCQlnYW1lID0gbmV3IGJ5dGVbOF1bOF07Ci0JCQkJaWYgKGNvbXB1dGVyKSB0dHIgPSBuZXcgUGF3bnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgZ2FtZVsoaW50KShNYXRoLnJhbmRvbSgpKmdhbWUubGVuZ3RoKV1bKGludCkoTWF0aC5yYW5kb20oKSpnYW1lWzBdLmxlbmd0aCldID0gV0FMTDsKLQkJCQllLmRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJYnJvd3Nlci5zZXRUZXh0KGdldEh0bWwoVFlQRV9CT0FSRCkpOwotCQkJCX19KTsKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9USEVNRSkgIT0gLTEpIHsKLQkJCQlpbnQgaW5kZXggPSBlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1RIRU1FKSArIEFDVElPTl9USEVNRS5sZW5ndGgoKSArIDE7Ci0JCQkJQ1NTX0ZPTERFUiA9IGUubG9jYXRpb24uc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDQpOwotCQkJCVVSTF9DU1MgPSBQTFVHSU5fUEFUSCtDU1NfRk9MREVSKyIvc3R5bGUuY3NzIjsKLQkJCQlVUkxfV0VMQ09NRSA9IFBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi93ZWxjb21lLmh0bWwiOwotCQkJCWUuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlicm93c2VyLnNldFVybChVUkxfV0VMQ09NRSk7Ci0JCQkJfX0pOwotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWJ5dGUgcGxheWVyID0gRU1QVFk7Ci0JCQlpZiAoZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9XSElURSkgIT0gLTEpIHBsYXllciA9IFdISVRFOwotCQkJZWxzZSBpZiAoZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9CTEFDSykgIT0gLTEpIHBsYXllciA9IEJMQUNLOwotCQkJaWYgKHBsYXllciAhPSBFTVBUWSkgewotCQkJCWludCBpbmRleCA9IGUubG9jYXRpb24uaW5kZXhPZigieHgiKSArIDI7Ci0JCQkJaW50IHggPSBJbnRlZ2VyLnBhcnNlSW50KGUubG9jYXRpb24uc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDEpKTsKLQkJCQlpbmRleCA9IGUubG9jYXRpb24uaW5kZXhPZigieXkiKSArIDI7Ci0JCQkJaW50IHkgPSBJbnRlZ2VyLnBhcnNlSW50KGUubG9jYXRpb24uc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDEpKTsKLQkJCQlib29sZWFuIGhhc01vcmUgPSBhZGQoeCwgeSwgcGxheWVyKTsKLQkJCQlpc1doaXRlID0gcGxheWVyICE9IFdISVRFOwotCQkJCWJyb3dzZXIuc2V0VGV4dChnZXRIdG1sKGhhc01vcmUgPyBUWVBFX0JPQVJEIDogVFlQRV9CT0FSRF9PVkVSKSk7Ci0JCQkJaWYgKGNvbXB1dGVyICYmIGhhc01vcmUgJiYgIWlzV2hpdGUpIHBsYXkoZS5kaXNwbGF5LCBicm93c2VyLCA1MDAwKTsKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJCX1jYXRjaCAoRXhjZXB0aW9uIGUxICkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZChpbnQgeCwgaW50IHksIGJ5dGUgY29sb3IpIHsKLQkJZ2FtZVt4XVt5XSA9IGNvbG9yOwotCQlpbnQgY250ID0gTWF0aC5taW4oeCwgeSksIG4gPSAwOwotCQlpbnQgb3RoZXJfY29sb3IgPSBjb2xvciA9PSBXSElURSA/IEJMQUNLIDogV0hJVEU7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4LWRdW3ktZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeC1kXVt5LWRdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3gtZF1beS1kXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IE1hdGgubWluKGdhbWUubGVuZ3RoIC0gMSAtIHgsIGdhbWVbMF0ubGVuZ3RoIC0gMSAtIHkpOyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3grZF1beStkXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4K2RdW3krZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeCtkXVt5K2RdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gTWF0aC5taW4oZ2FtZS5sZW5ndGggLSAxIC0geCwgeSk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeCtkXVt5LWRdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3grZF1beS1kXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4K2RdW3ktZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSBNYXRoLm1pbih4LCBnYW1lWzBdLmxlbmd0aCAtIDEgLSB5KTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4LWRdW3krZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeC1kXVt5K2RdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3gtZF1beStkXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IHk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeF1beS1kXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4XVt5LWRdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3hdW3ktZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSBnYW1lWzBdLmxlbmd0aCAtIDEgLSB5OyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3hdW3krZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeF1beStkXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4XVt5K2RdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0geDsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4LWRdW3ldID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3gtZF1beV0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeC1kXVt5XSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IGdhbWUubGVuZ3RoIC0gMSAtIHg7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeCtkXVt5XSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4K2RdW3ldICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3grZF1beV0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCi0JCWJvb2xlYW4gaGFzTW9yZSA9IGZhbHNlOwotCQljbnRXaGl0ZSA9IDA7IGNudEJsYWNrID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnYW1lLmxlbmd0aDsgaSsrKQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBnYW1lWzBdLmxlbmd0aDsgaisrKSB7Ci0JCQkJc3dpdGNoIChnYW1lW2ldW2pdKSB7Ci0JCQkJCWNhc2UgRU1QVFk6IGhhc01vcmUgPSB0cnVlOyBicmVhazsKLQkJCQkJY2FzZSBXSElURTogY250V2hpdGUrKzsgYnJlYWs7Ci0JCQkJCWNhc2UgQkxBQ0s6IGNudEJsYWNrKys7IGJyZWFrOwotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIGhhc01vcmU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwbGF5KGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgQnJvd3NlciBicm93c2VyLCBpbnQgZGVsYXkpIHsKLQkJdHRyLnBsYXlSZXF1ZXN0KGdhbWUsIEJMQUNLKTsKLQkJZGlzcGxheS50aW1lckV4ZWMoMzAwMCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHRyLmdldEJlc3RNb3ZlKG1vdmUpOwotCQkJCQlib29sZWFuIGhhc01vcmUgPSBhZGQobW92ZVswXSwgbW92ZVsxXSwgQkxBQ0spOwotCQkJCQlpc1doaXRlID0gdHJ1ZTsKLQkJCQkJYnJvd3Nlci5zZXRUZXh0KGdldEh0bWwoaGFzTW9yZSA/IFRZUEVfQk9BUkQgOiBUWVBFX0JPQVJEX09WRVIpKTsKLQkJCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTRlMTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkNWVlNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzN2E0Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxNDo0MCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlNjQ0Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotCSAgICAgICAgICAgKi5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCSAgICAgICAKLXNvdXJjZS5icm93c2VyZXhhbXBsZS5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1ZTE4MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIEJyb3dzZXI8L2gyPgotCi08cD4KLVRoZSBCcm93c2VyIEV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LiAKLUl0IGNvbnNpc3RzIG9mIGEgY29tcG9zaXRlIGNvbnRhaW5pbmcgYSBCcm93c2VyIHdpZGdldCB0byByZW5kZXIgSFRNTCBhbmQgc29tZQotYWRkaXRpb25hbCB3aWRnZXRzIHRvIGltcGxlbWVudCBhY3Rpb25zIGNvbW1vbmx5IGZvdW5kIG9uIGJyb3dzZXJzICh0b29sYmFyCi13aXRoIGJhY2ssIGZvcndhcmQsIHJlZnJlc2ggYW5kIHN0b3AgYnV0dG9ucywgc3RhdHVzIGJhciBldGMuKS4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlckV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkJyb3dzZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9pY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvaWNvbnMvYnJvd3Nlcl9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZTIyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9pY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5N2NmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUQnJvd3NlckV4YW1wbGUubmFtZSA9IFNXVCBCcm93c2VyIEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBXZWIgQnJvd3NlcgotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBXZWIgQnJvd3NlcgotbGF1bmNoaXRlbS5Ccm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbnRlZ3JhdGUgYSBXZWIgQnJvd3NlciB3aXRoIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIGNvbXBvc2l0ZSBjb250YWluaW5nIGEgQnJvd3NlciB3aWRnZXQgdG8gcmVuZGVyIEhUTUwuIFwKLQlBZGRpdGlvbmFsIHdpZGdldHMgYWxsb3cgdGhlIHVzZXIgdG8gcGVyZm9ybSB0eXBpY2FsIGJyb3dzZXIgYWN0aW9ucyAoZm9yIGV4YW1wbGUsIG5hdmlnYXRlIHRvIGEgcGFydGljdWxhciBVUkwsIGdvIGJhY2ssIGZvcndhcmQsIHJlZnJlc2ggYW5kIHN0b3ApLgotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhNTNlYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlciIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlclBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iYnJvd3NlcmV4YW1wbGUuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkJyb3dzZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlclZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLnZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjE2MGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEJyb3dzZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGY2Y2UwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiA8Y29kZT5Ccm93c2VyVmlldzwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgY29udHJvbC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JQnJvd3NlckV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgQnJvd3NlckV4YW1wbGUoZnJhbWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2UuZm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGM2OGViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3YjNhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTQ6MjEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ1Yzc2Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLQkgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQkgICAgICAgCi1zb3VyY2UuY29udHJvbHMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTQ2MzA5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9kb2MtaHRtbC9zd3RfY29udHJvbHNfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBDb250cm9sczwvaDI+Ci0KLTxwPgotVGhlIENvbnRyb2xzIEV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGNvbnRyb2xzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciAKLXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgY29udHJvbC4KLVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIGVhY2ggY29udHJvbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuQ29udHJvbEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkNvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjBkMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIEN1c3RvbSBDb250cm9sczwvaDI+Ci0KLTxwPgotVGhlIEN1c3RvbSBDb250cm9scyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgZW11bGF0ZWQgU1dUIGNvbnRyb2xzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciAKLXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgZW11bGF0ZWQgY29udHJvbC4KLVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIGVhY2ggY29udHJvbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuQ3VzdG9tQ29udHJvbEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkN1c3RvbSBDb250cm9sczwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2ljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2ljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmRlZTk3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9pY29ucy9jb250cm9sc19leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA3YzBjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVENvbnRyb2xzRXhhbXBsZS5uYW1lID0gU1dUIENvbnRyb2xzIEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkNvbnRyb2xzRXhhbXBsZS5uYW1lID0gU1dUIENvbnRyb2xzCi12aWV3LkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lID0gU1dUIEN1c3RvbSBDb250cm9scwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkNvbnRyb2xzRXhhbXBsZS5uYW1lID0gQ29udHJvbHMKLWxhdW5jaGl0ZW0uQ29udHJvbHNFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIG5hdGl2ZSBTV1QgY29udHJvbHMuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgYWxsb3dzIHRoZSB1c2VyIFwKLQl0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBjb250cm9sLiBcCi0JVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgdGhlIGNvbnRyb2wuCi0JCi1sYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lID0gQ3VzdG9tIENvbnRyb2xzCi1sYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjdXN0b20gU1dUIGNvbnRyb2xzLlxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGFsbG93cyB0aGUgdXNlciBcCi0JdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgY3VzdG9tIGNvbnRyb2wuIFwKLQlUaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyB0aGUgY29udHJvbC4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyNzdkZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scyIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUQ29udHJvbHNFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMTAwLnF1YWxpZmllciIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLkNvbnRyb2xQbHVnaW4iPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImNvbnRyb2xzLmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5Db250cm9sc0V4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMuQ29udHJvbFZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLnZpZXciPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy5DdXN0b21Db250cm9sVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY3VzdG9tY29udHJvbHMudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uQ29udHJvbHNFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9jb250cm9sc19leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Db250cm9sc0V4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMudmlld2xhdW5jaGVyIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5DdXN0b21Db250cm9sc0V4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jdXN0b21jb250cm9scy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmN1c3RvbWNvbnRyb2xzLnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlYjZkNTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ29udHJvbFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDb250cm9sUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTk1MzI3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogPGNvZGU+Q29udHJvbHM8L2NvZGU+IGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24KLSAqIG9mIHRoZSBuYXRpdmUgY29udHJvbHMgZGVmaW5lZCBieSBTV1QuICBJdCBjb25zaXN0cyBvZiBhIHdvcmtiZW5jaAotICogdmlldyBhbmQgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUKLSAqIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGNvbnRyb2wuCi0gKiAKLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCUNvbnRyb2xFeGFtcGxlIGluc3RhbmNlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IENvbnRyb2xFeGFtcGxlKGZyYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB3ZSBtdXN0IGdyYWIgZm9jdXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I3NldEZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWluc3RhbmNlLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFZpZXcgaXMgdG8gYmUgZGlzcG9zZWQKLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9DdXN0b21Db250cm9sVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ3VzdG9tQ29udHJvbFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0MzAyZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9DdXN0b21Db250cm9sVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiA8Y29kZT5DdXN0b21Db250cm9sczwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIGN1c3RvbSBjb250cm9scyBkZWZpbmVkIGJ5IFNXVC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgY29udHJvbC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udHJvbFZpZXcgZXh0ZW5kcyBDb250cm9sVmlldyB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IEN1c3RvbUNvbnRyb2xFeGFtcGxlKGZyYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjYzdmZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZWFmODQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjE0OjExIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxOWU0OTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MvLFwKLSAgICAgICAgICAgICAgIGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotCSAgICAgICAgICAgKi5qYXIKLQkgICAgICAgICAgIAotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCi1zb3VyY2UubGF1bmNoZXIuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNWY0ZjhjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIEV4YW1wbGUgTGF1bmNoZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvaDI+Ci0KLTxwPgotVGhlIEV4YW1wbGUgTGF1bmNoZXIgaXMgdXNlZCB0byBsYXVuY2ggU1dUIGV4YW1wbGVzLCB3aGljaCBjYW4gZWl0aGVyIGJlIFdvcmtiZW5jaCB2aWV3cyAKLW9yIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zLgotPC9wPgotCi08dWw+Ci08bGk+V29ya2JlbmNoIHZpZXdzIGFyZSBleGFtcGxlcyB0aGF0IGFyZSBpbnRlZ3JhdGVkIGludG8gRWNsaXBzZS4gIFdoZW4gdGhlIGxhdW5jaGVyCi1zdGFydHMgYSBXb3JrYmVuY2ggdmlldywgaXQgaXMgb3BlbmVkIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBlcnNwZWN0aXZlLgotPGxpPlN0YW5kYWxvbmUgYXBwbGljYXRpb25zIGFyZSBsYXVuY2hlZCBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KLTwvdWw+Ci0KLTxwPgotRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBydW4gdGhlIHN0YW5kYWxvbmUgZXhhbXBsZXMgd2l0aG91dCB0aGUgU1dUIEV4YW1wbGUgTGF1bmNoZXIsIAotcmVmZXIgdG8gPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+LgotPC9wPgotPHA+Ci1UaGUgU1dUIFdvcmtiZW5jaCB2aWV3IGV4YW1wbGVzIGNhbiBhbHNvIGJlIGxhdW5jaGVkIGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgdGhlIFNXVCBFeGFtcGxlIAotTGF1bmNoZXIuICBTV1QgV29ya2JlbmNoIHZpZXcgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSA8c3Ryb25nPlNXVCBFeGFtcGxlczwvc3Ryb25nPiBjYXRlZ29yeSBvZiB0aGUgCi08c3Ryb25nPlNob3cgVmlld3M8L3N0cm9uZz4gZGlhbG9nLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgRXhhbXBsZSBMYXVuY2hlcjwvaDM+Ci0KLTxwPgotRnJvbSBFY2xpcHNlJ3MgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gbWVudSwgc2VsZWN0IDxzdHJvbmc+U2hvdyBWaWV3ICZndDsgT3RoZXI8L3N0cm9uZz4uIAotSW4gdGhlIDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+IGRpYWxvZywgZXhwYW5kIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGFuZCBzZWxlY3QgdGhlIDxzdHJvbmc+U1dUIEV4YW1wbGUgTGF1bmNoZXI8L3N0cm9uZz4gdmlldy4gCi1BIHZpZXcgY29udGFpbmluZyBhIGxpc3Qgb2YgZXhhbXBsZXMgd2lsbCBhcHBlYXIgaW4geW91ciBjdXJyZW50IHBlcnNwZWN0aXZlLgotV2hlbiB5b3Ugc2VsZWN0IGFuIGV4YW1wbGUgZnJvbSB0aGUgbGlzdCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBleGFtcGxlIGlzIGRpc3BsYXllZC4KLUNsaWNrIG9uIHRoZSA8c3Ryb25nPlJ1bjwvc3Ryb25nPiBidXR0b24gdG8gbGF1bmNoIHRoZSBleGFtcGxlLgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2VkZjkxOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIRUFEPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci08SFRNTD4KLTxCT0RZPgotPEgxPjxDRU5URVI+TGF1bmNoIEl0ZW1zPC9DRU5URVI+PC9IMT4KLTxIMj5JZGVudGlmaWVyPC9IMj4KLW9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtczxIMj5EZXNjcmlwdGlvbjwvSDI+Ci1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCAnc3RhbmRhbG9uZSBwcm9ncmFtJyBhbmQKLSdXb3JrYmVuY2ggdmlldycKLWxhdW5jaCBpdGVtcyB0byB0aGUgTGF1bmNoZXIsIG9wdGlvbmFsbHkgZ3JvdXBpbmcgdGhlbSBpbnRvCi1jYXRlZ29yaWVzIHNvIGFzIHRvIGZvcm0gYSBtdWx0aS10aWVyZWQgaGllcmFyY2h5LgotU3RhbmRhbG9uZSBwcm9ncmFtcyBhcmUgZXhlY3V0ZWQgdXNpbmcgdGhlIHBsYXRmb3JtJ3MgZXZlbnQgbG9vcC4KLVdvcmtiZW5jaCB2aWV3cyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIGFjdGl2ZSBXb3JrYmVuY2ggUGVyc3BlY3RpdmUuPEgyPk1hcmt1cDwvSDI+Ci08cD48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIGV4dGVuc2lvbiBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBleHRlbnNpb248L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L3NhbXA+Ci08dWw+Ci08bGk+PGI+cG9pbnQ8L2I+IC0gPC9saT48bGk+PGI+aWQ8L2I+IC0gPC9saT48bGk+PGI+bmFtZTwvYj4gLSA8L2xpPjwvdWw+Ci08cD48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIHByb2dyYW0gRU1QVFkmZ3Q7PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUFUVExJU1QgcHJvZ3JhbTwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDttYWluQ2xhc3MmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cGx1Z2luSWQmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L3NhbXA+Ci08dWw+Ci08bGk+PGI+bWFpbkNsYXNzPC9iPiAtIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgd2hvc2UgbWFpbigpIG1ldGhvZCBpcyB0byBiZSBsYXVuY2hlZC48L2xpPjxsaT48Yj5wbHVnaW5JZDwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBFY2xpcHNlIFBsYXRmb3JtIHBsdWdpbiBjb250YWluaW5nIHRoZSBwcm9ncmFtLjwvbGk+PC91bD4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgdmlldyBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCB2aWV3PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3ZpZXdJZCZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj52aWV3SWQ8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgV29ya2JlbmNoIFZpZXcgdG8gYmUgYWN0aXZhdGVkIHdoZW4gdGhlIGl0ZW0gaXMgbGF1bmNoZWQuPC9saT48L3VsPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCBjYXRlZ29yeSBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBjYXRlZ29yeTwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2lkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2NhdGVnb3J5Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L3NhbXA+Ci08dWw+Ci08bGk+PGI+bmFtZTwvYj4gLSBUaGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyBjYXRlZ29yeS48L2xpPjxsaT48Yj5pZDwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoaXMgY2F0ZWdvcnkuICBDYXRlZ29yaWVzIHdpdGggZHVwbGljYXRlIGlkJ3Mgd2lsbCBiZSBkaXNjYXJkZWQuPC9saT48bGk+PGI+Y2F0ZWdvcnk8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcGFyZW50IGNhdGVnb3J5LjwvbGk+PC91bD4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgaXRlbSBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBpdGVtPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2F0ZWdvcnkmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpY29uJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZW5hYmxlZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyh0cnVlIHwgZmFsc2UpICJmYWxzZSIidHJ1ZSI8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZGVzY3JpcHRpb24mbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGxhdW5jaCBpdGVtLjwvbGk+PGxpPjxiPmlkPC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBsYXVuY2ggaXRlbS4gTGF1bmNoIGl0ZW1zIHdpdGggZHVwbGljYXRlIGlkJ3Mgd2lsbCBiZSBkaXNjYXJkZWQuPC9saT48bGk+PGI+Y2F0ZWdvcnk8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgY2F0ZWdvcnkgdGhpcyBsYXVuY2ggaXRlbSBiZWxvbmdzIHRvLjwvbGk+PGxpPjxiPmljb248L2I+IC0gVGhlIGRlY2xhcmluZyBwbHVnaW4gcmVsYXRpdmUgcGF0aCBvZiBhbiBpY29uIHRvIGRpc3BsYXkgd2l0aCB0aGlzIGxhdW5jaCBpdGVtIGluIHRoZSBMYXVuY2hlci48L2xpPjxsaT48Yj5lbmFibGVkPC9iPiAtIFNldCB0byAiZmFsc2UiIHRvIGRpc2FibGUgdGhpcyBsYXVuY2ggaXRlbSwgb3IgdG8gInRydWUiIHRvIGVuYWJsZSBpdCAoZGVmYXVsdCkuPC9saT48bGk+PGI+ZGVzY3JpcHRpb248L2I+IC0gVGhlIGxvY2FsaXplZCBwbGFpbi10ZXh0IGRlc2NyaXB0aW9uIG9mIHRoaXMgbGF1bmNoIGl0ZW0uPC9saT48L3VsPgotPEgyPkV4YW1wbGU8L0gyPgotPEgyPkFQSSBJbmZvcm1hdGlvbjwvSDI+Ci08SDI+U3VwcGxpZWQgSW1wbGVtZW50YXRpb248L0gyPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2Nsb3NlZEZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvY2xvc2VkRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmViNmVkMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvY2xvc2VkRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9nZW5lcmljX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5ZmI2YjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhYjRkMzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2xhdW5jaGVyX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL29wZW5Gb2xkZXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL29wZW5Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOWM3NzczNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvb3BlbkZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhMDNhYTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RMYXVuY2hlckV4YW1wbGUubmFtZSA9IFNXVCBMYXVuY2hlciBFeGFtcGxlIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5MYXVuY2hlckV4YW1wbGUubmFtZSA9IFNXVCBFeGFtcGxlIExhdW5jaGVyCi0KLWV4dGVuc2lvbi1wb2ludC5sYXVuY2hJdGVtcy5uYW1lID0gTGF1bmNoIEl0ZW1zCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uTGF1bmNoZXJFeGFtcGxlLm5hbWUgPSBMYXVuY2hlcgotbGF1bmNoaXRlbS5MYXVuY2hlckV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhlIEV4YW1wbGUgTGF1bmNoZXIgaXMgdXNlZCB0byBsYXVuY2ggU1dUIGV4YW1wbGVzIHdoaWNoIGNhbiBlaXRoZXIgYmUgXAotCVdvcmtiZW5jaCBWaWV3cywgb3IgU3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuXG5cblwKLQlXb3JrYmVuY2ggVmlld3MgYXJlIGV4YW1wbGVzIHRoYXQgYXJlIGludGVncmF0ZWQgaW50byBFY2xpcHNlLiAgV2hlbiB0aGUgTGF1bmNoZXIgXAotCXN0YXJ0cyBhIFdvcmtiZW5jaCBWaWV3LCBpdCBpcyBvcGVuZWQgaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGVyc3BlY3RpdmUuXG5cblwKLQlTdGFuZGFsb25lIGFwcGxpY2F0aW9ucyBhcmUgbGF1bmNoZWQgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuCi0KLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotZXJyb3IuQ291bGROb3RGaW5kUmVnaXN0ZXJlZEV4dGVuc2lvbnMgPSBDb3VsZCBOb3QgRmluZCBSZWdpc3RlcmVkIEV4dGVuc2lvbnMKLWVycm9yLkluY29tcGxldGVQcm9ncmFtTGF1bmNoSXRlbSA9IEluY29tcGxldGUgWE1MIFByb2dyYW1MYXVuY2hJdGVtIGRlZmluaXRpb24sIGlkID0gezB9Ci1lcnJvci5JbmNvbXBsZXRlVmlld0xhdW5jaEl0ZW0gPSBJbmNvbXBsZXRlIFhNTCBWaWV3TGF1bmNoSXRlbSBkZWZpbml0aW9uLCBpZCA9IHswfQotZXJyb3IuSW5jb21wbGV0ZUxhdW5jaEl0ZW0gPSBJbmNvbXBsZXRlIG9yIHVucmVjb2duaXplZCBYTUwgTGF1bmNoSXRlbSBkZWZpbml0aW9uLCBpZCA9IHswfQotCi1sYXVuY2hpdGVtLk51bGwuZGVzY3JpcHRpb24gPSA8PG5vIGl0ZW0gc2VsZWN0ZWQ+PgotCi1sYXVuY2hpdGVtLk1pc3NpbmcubmFtZSA9IDw8dW5uYW1lZD4+Ci1sYXVuY2hpdGVtLk1pc3NpbmcuZGVzY3JpcHRpb24gPSA8PG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZT4+Ci0KLXZpZXcubGF1bmNoR3JvdXAudGV4dCA9IEV4YW1wbGVzCi12aWV3LmxhdW5jaEJ1dHRvbi50ZXh0ID0gUnVuCi12aWV3LmRlc2NyaXB0aW9uR3JvdXAudGV4dCA9IERlc2NyaXB0aW9uCi0KLXJ1bi5lcnJvci5JbnZvY2F0aW9uID0gQSBmYXRhbCBlcnJvciBvY2N1cnJlZCB3aGlsZSBsYXVuY2hpbmcgdGhlIHByb2dyYW0uCi1ydW4uZXJyb3IuRG9lc05vdEltcGxlbWVudE1ldGhvZCA9IFRoZSBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZW4oKSBtZXRob2QuCi1ydW4uZXJyb3IuQ291bGROb3RGaW5kQ2xhc3MgPSBDb3VsZCBub3QgZmluZCB0aGUgY2xhc3MgdG8gcnVuLgotcnVuLmVycm9yLkNvdWxkTm90SW5zdGFudGlhdGVDbGFzcyA9IENvdWxkIG5vdCBpbnN0YW50aWF0ZSB0aGUgY2xhc3MgdG8gcnVuLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzNiODJiMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyIgotICAgbmFtZT0iJXBsdWdpbi5TV1RMYXVuY2hlckV4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIuTGF1bmNoZXJQbHVnaW4iPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci08IS0tIFJ1bnRpbWUgLS0+Ci08IS0tIFJ1bnRpbWUgLS0+Ci08IS0tIFJ1bnRpbWUgLS0+Ci0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxhdW5jaGVyLmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ib290Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibGF1bmNoSXRlbXMiIG5hbWU9IiVleHRlbnNpb24tcG9pbnQubGF1bmNoSXRlbXMubmFtZSIgc2NoZW1hPSJzY2hlbWEvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmV4c2QiLz4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuTGF1bmNoZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLkxhdW5jaGVyVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uTGF1bmNoZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBlbmFibGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2xhdW5jaGVyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkxhdW5jaGVyRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NjaGVtYS9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuZXhzZCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zY2hlbWEvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjdkOGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NjaGVtYS9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciIgaWQ9ImxhdW5jaEl0ZW1zIiBuYW1lPSJMYXVuY2ggSXRlbXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhZGQgJmFwb3M7c3RhbmRhbG9uZSBwcm9ncmFtJmFwb3M7IGFuZAotJmFwb3M7V29ya2JlbmNoIHZpZXcmYXBvczsKLWxhdW5jaCBpdGVtcyB0byB0aGUgTGF1bmNoZXIsIG9wdGlvbmFsbHkgZ3JvdXBpbmcgdGhlbSBpbnRvCi1jYXRlZ29yaWVzIHNvIGFzIHRvIGZvcm0gYSBtdWx0aS10aWVyZWQgaGllcmFyY2h5LgotU3RhbmRhbG9uZSBwcm9ncmFtcyBhcmUgZXhlY3V0ZWQgdXNpbmcgdGhlIHBsYXRmb3JtJmFwb3M7cyBldmVudCBsb29wLgotV29ya2JlbmNoIHZpZXdzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYWN0aXZlIFdvcmtiZW5jaCBQZXJzcGVjdGl2ZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Iml0ZW0iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9ncmFtIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgYSAmcXVvdDtTdGFuZGFsb25lIFByb2dyYW0mcXVvdDsgZm9yIGEgbGF1bmNoIGl0ZW0gdG8gcnVuLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYWluQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aG9zZSBtYWluKCkgbWV0aG9kIGlzIHRvIGJlIGxhdW5jaGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIEVjbGlwc2UgUGxhdGZvcm0gcGx1Z2luIGNvbnRhaW5pbmcgdGhlIHByb2dyYW0uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZpZXciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBhICZxdW90O1dvcmtiZW5jaCBWaWV3JnF1b3Q7IGZvciBhIGxhdW5jaCBpdGVtIHRvIGFjdGl2YXRlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3SWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgV29ya2JlbmNoIFZpZXcgdG8gYmUgYWN0aXZhdGVkIHdoZW4gdGhlIGl0ZW0gaXMgbGF1bmNoZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNhdGVnb3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgYSBsYXVuY2ggaXRlbSBjYXRlZ29yeSBoZWFkaW5nLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGNhdGVnb3J5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBjYXRlZ29yeS4gIENhdGVnb3JpZXMgd2l0aCBkdXBsaWNhdGUgaWQmYXBvcztzIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHBhcmVudCBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSBsYXVuY2ggaXRlbSBjYXRlZ29yeSBkZXNjcmlwdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaXRlbSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIGEgbGF1bmNoIGl0ZW0uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2aWV3Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2dyYW0iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGxhdW5jaCBpdGVtLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBsYXVuY2ggaXRlbS4gTGF1bmNoIGl0ZW1zIHdpdGggZHVwbGljYXRlIGlkJmFwb3M7cyB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBjYXRlZ29yeSB0aGlzIGxhdW5jaCBpdGVtIGJlbG9uZ3MgdG8uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZGVjbGFyaW5nIHBsdWdpbiByZWxhdGl2ZSBwYXRoIG9mIGFuIGljb24gdG8gZGlzcGxheSB3aXRoIHRoaXMgbGF1bmNoIGl0ZW0gaW4gdGhlIExhdW5jaGVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9InRydWUiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNldCB0byAmcXVvdDtmYWxzZSZxdW90OyB0byBkaXNhYmxlIHRoaXMgbGF1bmNoIGl0ZW0sIG9yIHRvICZxdW90O3RydWUmcXVvdDsgdG8gZW5hYmxlIGl0IChkZWZhdWx0KS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbG9jYWxpemVkIHBsYWluLXRleHQgZGVzY3JpcHRpb24gb2YgdGhpcyBsYXVuY2ggaXRlbS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1EZXNjcmlwdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzEwNWYyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogSXRlbURlc2NyaXB0b3IgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgYSBsYXVuY2ggaXRlbS4KLSAqLwotY2xhc3MgSXRlbURlc2NyaXB0b3IgewotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBJbWFnZSAgaWNvbjsKLQlwcml2YXRlIFN0cmluZyB2aWV3OwotCXByaXZhdGUgU3RyaW5nIG1haW5UeXBlOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JCi0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBJdGVtRGVzY3JpcHRvci4KLQkgKgotCSAqIEBwYXJhbSBpZCB0aGUgaWQKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gaWNvbiB0aGUgaWNvbgotCSAqIEBwYXJhbSB2aWV3IHRoZSBob3N0IHZpZXcgbWF5IGJlIG51bGwgaWYgaXQgaXMgYSBzdGFuZGFsb25lIGFwcGxpY2F0aW9uCi0JICogQHBhcmFtIG1haW5UeXBlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byBydW4gbWF5IGJlIG51bGwgaWYgaXQgaXMgYSB2aWV3Ci0JICogQHBhcmFtIHBsdWdpbklkIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gd2hpY2ggY29udGFpbnMgdGhlIG1haW4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgSXRlbURlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQlJbWFnZSBpY29uLCBTdHJpbmcgdmlldywgU3RyaW5nIG1haW5UeXBlLCBTdHJpbmcgcGx1Z2luSWQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmljb24gPSBpY29uOwotCQl0aGlzLnZpZXcgPSB2aWV3OwotCQl0aGlzLm1haW5UeXBlID0gbWFpblR5cGU7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb24ncyBzcGVjaWZpZWQgdHlwZSwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB0eXBlIHdhcyBzcGVjaWZpZWQgYnkgdGhlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb24ncyBzcGVjaWZpZWQgdHlwZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlSXRlbUluc3RhbmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihMYXVuY2hlclBsdWdpbi5MQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU1fQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIGZvciB0aGlzIHByb2dyYW0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB1c2VyLXNwZWNpZmllZCBJRCBmb3IgdGhpcyBwcm9ncmFtCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0cmFuc2xhdGVkIG5hbWUgZm9yIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hvcnQgZGVzY3JpcHRpb24gZm9yIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXdsaW5lLWRlbGltaXRlZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvZ3JhbSwgbnVsbCBpZiBubyBkZXNjcmlwdGlvbiBpcyBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpY29uIGZvciB0aGlzIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcmV0dXJucyBhbiBpY29uLCBudWxsIGlmIHRoZSBpdGVtIGlzIGEgZm9sZGVyCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0JCXJldHVybiBpY29uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBob3N0IHZpZXcgZm9yIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhvc3QgdmlldywgbnVsbCBpZiB0aGUgaXRlbSBpcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpZXcgKCkgewotCQlyZXR1cm4gdmlldzsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIHRvIHJ1bgotCSAqIGZvciB0aGUgcHJvZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjbGFzcyB0byBydW4gZm9yIHRoZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpblR5cGUgKCkgewotCQlyZXR1cm4gbWFpblR5cGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0aGF0IGNvbnRhaW5zIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0aGF0IGNvbnRhaW5zIHRoZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQgKCkgewotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgYW4gaXRlbSBpcyBhIGZvbGRlci4KLQkgKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaXRlbSBpcyBhIGZvbGRlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9sZGVyKCkgewotCQlyZXR1cm4gKG1haW5UeXBlID09IG51bGwgJiYgdmlldyA9PSBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB0aGUgZXF1YWxpdHkgb2YgZGVzY3JpcHRvcnMuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMuZ2V0SWQoKS5lcXVhbHNJZ25vcmVDYXNlKG90aGVyLmdldElkKCkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAob3RoZXIgaW5zdGFuY2VvZiBJdGVtRGVzY3JpcHRvcikgewotCQkJSXRlbURlc2NyaXB0b3Igb3RoZXJEZXNjcmlwdG9yID0gKEl0ZW1EZXNjcmlwdG9yKSBvdGhlcjsKLQkJCXJldHVybiBnZXRJZCgpLmVxdWFsc0lnbm9yZUNhc2Uob3RoZXJEZXNjcmlwdG9yLmdldElkKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUHJvZHVjZXMgYSBoYXNoY29kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBoYXNoY29kZQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBpZC50b1VwcGVyQ2FzZSgpLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvSXRlbVRyZWVOb2RlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtVHJlZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDYwMzBhNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtVHJlZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcyB1c2VkIHRvIHN0b3JlIHRyZWUgc3RydWN0dXJlcyBvZiBJdGVtRGVzY3JpcHRvcnMKLSAqLwotY2xhc3MgSXRlbVRyZWVOb2RlIHsKLQlwcml2YXRlIEl0ZW1UcmVlTm9kZSBuZXh0U2libGluZzsKLQlwcml2YXRlIEl0ZW1UcmVlTm9kZSBmaXJzdENoaWxkOwotCXByaXZhdGUgSXRlbURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBsZWFmIEl0ZW1UcmVlTm9kZSB3aXRoIGEgZ2l2ZW4gZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJdGVtVHJlZU5vZGUoSXRlbURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQl0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBub2RlIHRvIHRoZSBUcmVlIGluIHNvcnRlZCBvcmRlciBieSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGFkZC4gTm90ZSB0aGF0IG5vZGUubmV4dFNpYmxpbmcgbXVzdCBiZSBudWxsCi0JICovCi0JcHVibGljIHZvaWQgYWRkU29ydGVkTm9kZShJdGVtVHJlZU5vZGUgbm9kZSkgewotCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKSB7Ci0JCQlmaXJzdENoaWxkID0gbm9kZTsKLQkJfSBlbHNlIGlmIChmaXJzdENoaWxkLmRlc2NyaXB0b3IuZ2V0TmFtZSgpLmNvbXBhcmVUbyhub2RlLmRlc2NyaXB0b3IuZ2V0TmFtZSgpKSA+IDApIHsKLQkJCW5vZGUubmV4dFNpYmxpbmcgPSBmaXJzdENoaWxkOwotCQkJZmlyc3RDaGlsZCA9IG5vZGU7Ci0JCX0gZWxzZSB7Ci0JCQlJdGVtVHJlZU5vZGUgY3Vyc29yOwotCQkJZm9yIChjdXJzb3IgPSBmaXJzdENoaWxkOyBjdXJzb3IubmV4dFNpYmxpbmcgIT0gbnVsbDsgY3Vyc29yID0gY3Vyc29yLm5leHRTaWJsaW5nKSB7Ci0JCQkJSXRlbVRyZWVOb2RlIHNpYmxpbmcgPSBjdXJzb3IubmV4dFNpYmxpbmc7Ci0JCQkJaWYgKHNpYmxpbmcuZGVzY3JpcHRvci5nZXROYW1lKCkuY29tcGFyZVRvKG5vZGUuZGVzY3JpcHRvci5nZXROYW1lKCkpID4gMCkgYnJlYWs7Ci0JCQl9Ci0JCQlub2RlLm5leHRTaWJsaW5nID0gY3Vyc29yLm5leHRTaWJsaW5nOwotCQkJY3Vyc29yLm5leHRTaWJsaW5nID0gbm9kZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIG5vZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJdGVtRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgc2libGluZywgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIG5leHRTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBjaGlsZCwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gZmlyc3RDaGlsZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWI2NDFiZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMYXVuY2hlclBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwotCQlMQVVOQ0hfSVRFTVNfUE9JTlRfSUQgPSAib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSA9ICJjYXRlZ29yeSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfSVRFTSA9ICJpdGVtIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9JVEVNX0lDT04gPSAiaWNvbiIsCi0JCUxBVU5DSF9JVEVNU19YTUxfSVRFTV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiIsCi0JCUxBVU5DSF9JVEVNU19YTUxfUFJPR1JBTSA9ICJwcm9ncmFtIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNX1BMVUdJTiA9ICJwbHVnaW5JZCIsCi0JCUxBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9DTEFTUyA9ICJtYWluQ2xhc3MiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1ZJRVcgPSAidmlldyIsCi0JCUxBVU5DSF9JVEVNU19YTUxfVklFV19WSUVXSUQgPSAidmlld0lkIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfSUQgPSAiaWQiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9OQU1FID0gIm5hbWUiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9FTkFCTEVEID0gImVuYWJsZWQiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9DQVRFR09SWSA9ICJjYXRlZ29yeSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfVkFMVUVfVFJVRSA9ICJ0cnVlIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7CQkKLQotCXN0YXRpYyBmaW5hbCBpbnQKLQkJbGlDbG9zZWRGb2xkZXIgPSAwLAotCQlsaU9wZW5Gb2xkZXIgPSAxLAotCQlsaUdlbmVyaWNFeGFtcGxlID0gMjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCSJpY29ucy9jbG9zZWRGb2xkZXIuZ2lmIiwKLQkJImljb25zL29wZW5Gb2xkZXIuZ2lmIiwKLQkJImljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYiIH07Ci0Jc3RhdGljIEltYWdlIGltYWdlc1tdOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyB0aGUgTGF1bmNoZXJQbHVnaW4uCi0JICovCi0JcHVibGljIExhdW5jaGVyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQ2xlYW4gdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMYXVuY2hlclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQlpbWFnZXNbaV0gPSBnZXRJbWFnZUZyb21QbHVnaW4ocGx1Z2luLmdldEJ1bmRsZSgpLCBpbWFnZUxvY2F0aW9uc1tpXSk7Ci0JCQkJaWYgKGltYWdlc1tpXSA9PSBudWxsKSB7Ci0JCQkJCWZyZWVSZXNvdXJjZXMoKTsKLQkJCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpLCBudWxsKTsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0KLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJaW1hZ2VzID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAotCSAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXBsdWdpbi5nZXRMb2coKS5sb2cobmV3IFN0YXR1cygKLQkJCUlTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotCi0JLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpc3Qgb2YgYXZhaWxhYmxlIHByb2dyYW1zIGZyb20gcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gSXRlbVRyZWVOb2RlIHJlcHJlc2VudGluZyB0aGUgcm9vdCBvZiBhIHRyZWUgb2YgaXRlbXMgKHRoZSByb290IGlzIG5vdCB0byBiZSBkaXNwbGF5ZWQpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVtVHJlZU5vZGUgZ2V0TGF1bmNoSXRlbVRyZWUoKSB7Ci0JCUl0ZW1UcmVlTm9kZSBjYXRlZ29yeVRyZWUgPQotCQkJbmV3IEl0ZW1UcmVlTm9kZShuZXcgSXRlbURlc2NyaXB0b3IoIjw8Um9vdD4+IiwgIjw8Um9vdD4+IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCi0JCS8vIGdldCB0aGUgcGxhdGZvcm0ncyBwdWJsaWMgcGx1Z2luIHJlZ2lzdHJ5Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCS8vIHJldHJpZXZlIGFsbCBjb25maWd1cmF0aW9uIGVsZW1lbnRzIHJlZ2lzdGVyZWQgYXQgb3VyIGxhdW5jaEl0ZW1zIGV4dGVuc2lvbi1wb2ludAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWd1cmF0aW9uRWxlbWVudHMgPQotCQkJZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKExBVU5DSF9JVEVNU19QT0lOVF9JRCk7Ci0JCQkKLQkJaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9PSBudWxsIHx8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90RmluZFJlZ2lzdGVyZWRFeHRlbnNpb25zIiksIG51bGwpOwotCQkJcmV0dXJuIGNhdGVnb3J5VHJlZTsKLQkJfQotCQkKLQkJLyogQ29sbGVjdCBhbGwgbGF1bmNoIGNhdGVnb3JpZXMgLS0gY29hbGVzY2UgdGhvc2Ugd2l0aCBzYW1lIElEICovCi0JCUhhc2hNYXAgaWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlID0gY29uZmlndXJhdGlvbkVsZW1lbnRzW2ldOwotCQkJZmluYWwgU3RyaW5nIGNlTmFtZSA9IGNlLmdldE5hbWUoKTsKLQkJCWZpbmFsIFN0cmluZyBhdHRyaWJJZCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0lELCBudWxsKTsKLQkJCQotCQkJaWYgKGlkTWFwLmNvbnRhaW5zS2V5KGF0dHJpYklkKSkgY29udGludWU7Ci0JCQlpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSkpIHsKLQkJCQlmaW5hbCBTdHJpbmcgYXR0cmliTmFtZSA9IGdldEl0ZW1OYW1lKGNlKTsgCi0JCQkJSXRlbURlc2NyaXB0b3IgdGhlRGVzY3JpcHRvciA9IG5ldyBJdGVtRGVzY3JpcHRvcihhdHRyaWJJZCwgYXR0cmliTmFtZSwKLQkJCQkJZ2V0SXRlbURlc2NyaXB0aW9uKGNlKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgY2UpOwotCQkJCWlkTWFwLnB1dChhdHRyaWJJZCwgbmV3IEl0ZW1UcmVlTm9kZSh0aGVEZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIEdlbmVyYXRlIGxhdW5jaCBjYXRlZ29yeSBoaWVyYXJjaHkgKi8KLQkJU2V0IHRlbXBJZFNldCA9IG5ldyBIYXNoU2V0KCk7IC8vIHVzZWQgdG8gcHJldmVudCBkdXBsaWNhdGVzIGZyb20gYmVpbmcgZW50ZXJlZCBpbnRvIHRoZSB0cmVlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbkVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgPSBjb25maWd1cmF0aW9uRWxlbWVudHNbaV07Ci0JCQlmaW5hbCBTdHJpbmcgY2VOYW1lID0gY2UuZ2V0TmFtZSgpOwotCQkJZmluYWwgU3RyaW5nIGF0dHJpYklkID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfSUQsIG51bGwpOwotCQkJCi0JCQlpZiAodGVtcElkU2V0LmNvbnRhaW5zKGF0dHJpYklkKSkgY29udGludWU7Ci0JCQlpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSkpIHsKLQkJCQlmaW5hbCBJdGVtVHJlZU5vZGUgdGhlTm9kZSA9IChJdGVtVHJlZU5vZGUpIGlkTWFwLmdldChhdHRyaWJJZCk7Ci0JCQkJYWRkSXRlbUJ5Q2F0ZWdvcnkoY2UsIGNhdGVnb3J5VHJlZSwgdGhlTm9kZSwgaWRNYXApOwotCQkJCXRlbXBJZFNldC5hZGQoYXR0cmliSWQpOwotCQkJfQotCQl9Ci0JCQotCQkvKiBHZW5lcmF0ZSBwcm9ncmFtIHRyZWUgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uRWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA9IGNvbmZpZ3VyYXRpb25FbGVtZW50c1tpXTsKLQkJCWZpbmFsIFN0cmluZyBjZU5hbWUgPSBjZS5nZXROYW1lKCk7Ci0JCQlmaW5hbCBTdHJpbmcgYXR0cmliSWQgPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9JRCwgbnVsbCk7Ci0KLQkJCWlmIChpZE1hcC5jb250YWluc0tleShhdHRyaWJJZCkpIGNvbnRpbnVlOwotCQkJaWYgKGNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBVU5DSF9JVEVNU19YTUxfQ0FURUdPUlkpKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9IGVsc2UgaWYgKGNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBVU5DSF9JVEVNU19YTUxfSVRFTSkpIHsKLQkJCQlmaW5hbCBTdHJpbmcgZW5hYmxlZCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0VOQUJMRUQsIAotCQkJCQlMQVVOQ0hfSVRFTVNfWE1MX1ZBTFVFX1RSVUUpOwotCQkJCWlmIChlbmFibGVkLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9WQUxVRV9GQUxTRSkpIGNvbnRpbnVlOwotCQkJCUl0ZW1EZXNjcmlwdG9yIHRoZURlc2NyaXB0b3IgPSBjcmVhdGVJdGVtRGVzY3JpcHRvcihjZSwgYXR0cmliSWQpOwkJCQkKLQkJCQotCQkJCWlmICh0aGVEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJZmluYWwgSXRlbVRyZWVOb2RlIHRoZU5vZGUgPSBuZXcgSXRlbVRyZWVOb2RlKHRoZURlc2NyaXB0b3IpOwotCQkJCQlhZGRJdGVtQnlDYXRlZ29yeShjZSwgY2F0ZWdvcnlUcmVlLCB0aGVOb2RlLCBpZE1hcCk7Ci0JCQkJCWlkTWFwLnB1dChhdHRyaWJJZCwgdGhlTm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjYXRlZ29yeVRyZWU7Ci0JfQotCi0JCQkJCi0JLyoqCi0JICogQWRkcyBhbiBpdGVtIHRvIHRoZSBjYXRlZ29yeSB0cmVlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSXRlbUJ5Q2F0ZWdvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBJdGVtVHJlZU5vZGUgcm9vdCwKLQkJSXRlbVRyZWVOb2RlIHRoZU5vZGUsIEhhc2hNYXAgaWRNYXApIHsKLQkJZmluYWwgU3RyaW5nIGF0dHJpYkNhdGVnb3J5ID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfQ0FURUdPUlksIG51bGwpOwotCQkJCQotCQkvLyBsb2NhdGUgdGhlIHBhcmVudCBub2RlCi0JCUl0ZW1UcmVlTm9kZSBwYXJlbnROb2RlID0gbnVsbDsKLQkJaWYgKGF0dHJpYkNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudE5vZGUgPSAoSXRlbVRyZWVOb2RlKSBpZE1hcC5nZXQoYXR0cmliQ2F0ZWdvcnkpOwotCQl9Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpIHBhcmVudE5vZGUgPSByb290OwotCQkJCQotCQkvLyBhZGQgdGhlIGl0ZW0KLQkJcGFyZW50Tm9kZS5hZGRTb3J0ZWROb2RlKHRoZU5vZGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gSXRlbURlc2NyaXB0b3IgZnJvbSBhbiBYTUwgZGVmaW5pdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHBhcmFtIGF0dHJpYklkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcmV0dXJuIGEgbmV3IEl0ZW1EZXNjcmlwdG9yLCBvciBudWxsIGlmIGFuIGVycm9yIG9jY3VycwotCSAqLwotCXByaXZhdGUgc3RhdGljIEl0ZW1EZXNjcmlwdG9yIGNyZWF0ZUl0ZW1EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSwgU3RyaW5nIGF0dHJpYklkKSB7Ci0JCWZpbmFsIFN0cmluZyBhdHRyaWJOYW1lID0gZ2V0SXRlbU5hbWUoY2UpOwotCQlmaW5hbCBJbWFnZSAgYXR0cmliSWNvbiA9IGdldEl0ZW1JY29uKGNlKTsKLQkJZmluYWwgU3RyaW5nIGF0dHJpYkRlc2NyaXB0aW9uID0gZ2V0SXRlbURlc2NyaXB0aW9uKGNlKTsKLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgdmlld0NFID0gZ2V0SXRlbUVsZW1lbnQoY2UsIExBVU5DSF9JVEVNU19YTUxfVklFVyk7Ci0JCWlmICh2aWV3Q0UgIT0gbnVsbCkgewotCQkJLy9JdGVtIGlzIGEgdmlldwotCQkJZmluYWwgU3RyaW5nIGF0dHJpYlZpZXcgPSBnZXRJdGVtQXR0cmlidXRlKHZpZXdDRSwgTEFVTkNIX0lURU1TX1hNTF9WSUVXX1ZJRVdJRCwgbnVsbCk7CQkKLQkJCWlmIChhdHRyaWJWaWV3ID09IG51bGwpIHsKLQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuSW5jb21wbGV0ZVZpZXdMYXVuY2hJdGVtIiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgYXR0cmliSWQgfSApLCBudWxsKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBuZXcgSXRlbURlc2NyaXB0b3IoYXR0cmliSWQsIGF0dHJpYk5hbWUsIGF0dHJpYkRlc2NyaXB0aW9uLAotCQkJCQlhdHRyaWJJY29uLCBhdHRyaWJWaWV3LCBudWxsLCBudWxsLCB2aWV3Q0UpOwotCQl9IGVsc2UgewotCQkJLy9JdGVtIGlzIGEgc3RhbmRhbG9uZQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHByb2dyYW1DRSA9IGdldEl0ZW1FbGVtZW50KGNlLCBMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU0pOwotCQkJaWYgKHByb2dyYW1DRSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGF0dHJpYlBsdWdpbklkID0gZ2V0SXRlbUF0dHJpYnV0ZShwcm9ncmFtQ0UsIExBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9QTFVHSU4sIG51bGwpOwotCQkJCWZpbmFsIFN0cmluZyBhdHRyaWJDbGFzcyAgICA9IGdldEl0ZW1BdHRyaWJ1dGUocHJvZ3JhbUNFLCBMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU1fQ0xBU1MsIG51bGwpOwotCQkJCWlmIChhdHRyaWJDbGFzcyA9PSBudWxsIHx8IGF0dHJpYlBsdWdpbklkID09IG51bGwpIHsKLQkJCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkluY29tcGxldGVQcm9ncmFtTGF1bmNoSXRlbSIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IGF0dHJpYklkIH0gKSwgbnVsbCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IEl0ZW1EZXNjcmlwdG9yKGF0dHJpYklkLCBhdHRyaWJOYW1lLCBhdHRyaWJEZXNjcmlwdGlvbiwKLQkJCQkJYXR0cmliSWNvbiwgbnVsbCwgYXR0cmliQ2xhc3MsIGF0dHJpYlBsdWdpbklkLCBwcm9ncmFtQ0UpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuSW5jb21wbGV0ZUxhdW5jaEl0ZW0iLAotCQkJCQluZXcgT2JqZWN0W10geyBhdHRyaWJJZCB9ICksIG51bGwpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIGNoaWxkIFhNTCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHBhcmVudAotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGZldGNoCi0JICogQHJldHVybiB0aGUgZWxlbWVudCdzIElDb25maWd1cmF0aW9uRWxlbWVudCwgb3IgbnVsbCBpZiBub3QgZm91bmQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0SXRlbUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBTdHJpbmcgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50Q0VzID0gY2UuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiAoZWxlbWVudENFcyAhPSBudWxsICYmIGVsZW1lbnRDRXMubGVuZ3RoICE9IDApID8gZWxlbWVudENFc1swXSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYW4gWE1MIGF0dHJpYnV0ZSBmb3IgYW4gaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHRvIGZldGNoCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEl0ZW1BdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGNlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGdpdmVuIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZm9yIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEByZXR1cm4gYSBuZXdsaW5lLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhpcyBpdGVtLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SXRlbURlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0lURU1fREVTQ1JJUFRJT04sICIiKTsKLQkJcmV0dXJuIChkZXNjcmlwdGlvbi5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJdGVtTmFtZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKLQkJcmV0dXJuIGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX05BTUUsCi0JCQlnZXRSZXNvdXJjZVN0cmluZygibGF1bmNoaXRlbS5NaXNzaW5nLm5hbWUiKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpY29uIGZvciBhbiBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2NyaWJpbmcgdGhlIGl0ZW0KLQkgKiBAcmV0dXJuIGFuIGljb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBnZXRJdGVtSWNvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKLQkJU3RyaW5nIGljb25QYXRoID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9JVEVNX0lDT04sICIiKTsKLQkJaWYgKGljb25QYXRoLmxlbmd0aCgpICE9IDApIHsKLQkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSBjZS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoc3ltYm9saWNOYW1lKTsKLQkJCUltYWdlIGljb24gPSBnZXRJbWFnZUZyb21QbHVnaW4oYnVuZGxlLCBpY29uUGF0aCk7Ci0JCQlpZiAoaWNvbiAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VbXSBuZXdJbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VzLCAwLCBuZXdJbWFnZXMsIDAsIGltYWdlcy5sZW5ndGgpOwotCQkJCW5ld0ltYWdlc1tpbWFnZXMubGVuZ3RoXSA9IGljb247Ci0JCQkJaW1hZ2VzID0gbmV3SW1hZ2VzOwotCQkJCXJldHVybiBpY29uOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZXNbbGlHZW5lcmljRXhhbXBsZV07Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbiBpbWFnZSBmcm9tIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGJ1bmRsZSB0aGUgcGx1Z2luIGRlc2NyaXB0b3IgZm9yIHRoZSBwbHVnaW4gd2l0aCB0aGUgaW1hZ2UKLQkgKiBAcGFyYW0gaWNvblBhdGggdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGluc3RhbGwgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2VGcm9tUGx1Z2luKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpY29uUGF0aCkgewotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVybCwgaWNvblBhdGgpOwotCQkJaXMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoaXMpOwotCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCXJldHVybiBpbWFnZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpIGlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMmM5MzRmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi0vKioKLSAqIExhdW5jaGVyIHVzZXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0PC9jb2RlPiAKLSAqIHRvIGxhdW5jaCB0aGUgb3RoZXIgcmVnaXN0ZXJlZCBleGFtcGxlcy4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCXByaXZhdGUgU2hlbGwgd29ya2JlbmNoU2hlbGw7Ci0JCi0JcHJpdmF0ZSBUcmVlIGxhdW5jaFRyZWU7Ci0JcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBydW5CdXR0b247Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgTGF1bmNoZXJWaWV3LgotCSAqLwotCXB1YmxpYyBMYXVuY2hlclZpZXcoKSB7Ci0JCUxhdW5jaGVyUGx1Z2luLmluaXRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlLgotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXdvcmtiZW5jaFNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IFNwbGl0TGF5b3V0KCkpOwotCQkJCQotCQlHcm91cCBsYXVuY2hHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGF1bmNoR3JvdXAuc2V0VGV4dChMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygidmlldy5sYXVuY2hHcm91cC50ZXh0IikpOwotCQkKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF1bmNoR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCWxhdW5jaFRyZWUgPSBuZXcgVHJlZShsYXVuY2hHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhdW5jaFRyZWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWxhdW5jaFRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBJdGVtRGVzY3JpcHRvciBpdGVtID0gZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JCQkJc2V0RGVzY3JpcHRpb25CeUl0ZW0oaXRlbSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBJdGVtRGVzY3JpcHRvciBpdGVtID0gZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JCQkJc2V0RGVzY3JpcHRpb25CeUl0ZW0oaXRlbSk7Ci0JCQkJaWYgKGl0ZW0uZ2V0TWFpblR5cGUoKSA9PSBudWxsICYmIGl0ZW0uZ2V0VmlldygpID09IG51bGwpIHsKLQkJCQkJLy8gQ2F0ZWdvcnkgc2VsZWN0ZWQsIHNvIGp1c3QgZXhwYW5kL2NvbGFwc2UgdGhlIG5vZGUKLQkJCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCWJvb2xlYW4gZXhwYW5kZWQgPSB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpOwotCQkJCQlpZiAodHJlZUl0ZW0gIT0gbnVsbCkgdHJlZUl0ZW0uc2V0RXhwYW5kZWQoIWV4cGFuZGVkKTsKLQkJCQkJdHJlZUl0ZW0uc2V0SW1hZ2UoTGF1bmNoZXJQbHVnaW4uaW1hZ2VzW2V4cGFuZGVkID8gTGF1bmNoZXJQbHVnaW4ubGlDbG9zZWRGb2xkZXIgOiBMYXVuY2hlclBsdWdpbi5saU9wZW5Gb2xkZXJdKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYXVuY2hJdGVtKGdldFNlbGVjdGVkSXRlbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlsYXVuY2hUcmVlLmFkZFRyZWVMaXN0ZW5lcihuZXcgVHJlZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlpdGVtLnNldEltYWdlKExhdW5jaGVyUGx1Z2luLmltYWdlc1tMYXVuY2hlclBsdWdpbi5saUNsb3NlZEZvbGRlcl0pOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJCWl0ZW0uc2V0SW1hZ2UoTGF1bmNoZXJQbHVnaW4uaW1hZ2VzW0xhdW5jaGVyUGx1Z2luLmxpT3BlbkZvbGRlcl0pOwotCQkJfQotCQl9KTsKLQotCQlydW5CdXR0b24gPSBuZXcgQnV0dG9uKGxhdW5jaEdyb3VwLCBTV1QuUFVTSCk7Ci0JCXJ1bkJ1dHRvbi5zZXRUZXh0KExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJ2aWV3LmxhdW5jaEJ1dHRvbi50ZXh0IikpOwotCQlydW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlsYXVuY2hJdGVtKGdldFNlbGVjdGVkSXRlbSgpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQotCQlHcm91cCBkZXNjcmlwdGlvbkdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlkZXNjcmlwdGlvbkdyb3VwLnNldFRleHQoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInZpZXcuZGVzY3JpcHRpb25Hcm91cC50ZXh0IikpOwotCQlkZXNjcmlwdGlvbkdyb3VwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCWRlc2NyaXB0aW9uVGV4dCA9IG5ldyBUZXh0KGRlc2NyaXB0aW9uR3JvdXAsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfAotCQkJU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQotCQlzZXREZXNjcmlwdGlvbkJ5SXRlbShudWxsKTsKLQkJc2V0SXRlbURlc2NyaXB0b3JzKExhdW5jaGVyUGx1Z2luLmdldExhdW5jaEl0ZW1UcmVlKCkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpICB7Ci0JCWxhdW5jaFRyZWUuc2V0Rm9jdXMoKTsKLQkJcnVuQnV0dG9uLmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihydW5CdXR0b24pOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXdvcmtiZW5jaFNoZWxsID0gbnVsbDsKLQkJbGF1bmNoVHJlZSA9IG51bGw7Ci0JCWRlc2NyaXB0aW9uVGV4dCA9IG51bGw7Ci0JCXJ1bkJ1dHRvbiA9IG51bGw7CQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEluc3RhbGxzIGEgbmV3IGxhdW5jaCBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBuZXdSb290IHRoZSBuZXcgdHJlZSBvZiBsYXVuY2ggaXRlbXMgZm9yIHRoZSBVSQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEl0ZW1EZXNjcmlwdG9ycyhmaW5hbCBJdGVtVHJlZU5vZGUgbmV3Um9vdCkgewotCQlpZiAod29ya2JlbmNoU2hlbGwgPT0gbnVsbCkgcmV0dXJuOwotCQl3b3JrYmVuY2hTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICgobGF1bmNoVHJlZSA9PSBudWxsKSB8fCAobGF1bmNoVHJlZS5pc0Rpc3Bvc2VkKCkpKSByZXR1cm47Ci0JCQkJbGF1bmNoVHJlZS5yZW1vdmVBbGwoKTsKLQkJCQotCQkJCWZvciAoSXRlbVRyZWVOb2RlIG5vZGUgPSBuZXdSb290LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOwotCQkJCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWRvTm9kZShub2RlLCBuZXcgVHJlZUl0ZW0obGF1bmNoVHJlZSwgU1dULk5PTkUpKTsgLy8gdG9wLWxldmVsIFRyZWVJdGVtCi0JCQkJfQotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGFkZEdyb3VwKFRyZWVJdGVtIHBhcmVudCwgSXRlbVRyZWVOb2RlIG5vZGUpIHsKLQkJCQlmb3IgKDtub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJZG9Ob2RlKG5vZGUsIG5ldyBUcmVlSXRlbShwYXJlbnQsIFNXVC5OT05FKSk7IC8vIFRyZWVJdGVtIGF0IGRlcHRoID4gMAotCQkJCX0KLQkJCX0KLQkJCXByaXZhdGUgdm9pZCBkb05vZGUoSXRlbVRyZWVOb2RlIG5vZGUsIFRyZWVJdGVtIHRyZWVJdGVtKSB7Ci0JCQkJZmluYWwgSXRlbURlc2NyaXB0b3IgaXRlbSA9IG5vZGUuZ2V0RGVzY3JpcHRvcigpOwotCQkJCXRyZWVJdGVtLnNldFRleHQoaXRlbS5nZXROYW1lKCkpOwotCQkJCXRyZWVJdGVtLnNldERhdGEoaXRlbSk7Ci0JCQkJaWYgKG5vZGUuZ2V0RGVzY3JpcHRvcigpLmlzRm9sZGVyKCkpIHsKLQkJCQkJdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJCQl0cmVlSXRlbS5zZXRJbWFnZShMYXVuY2hlclBsdWdpbi5pbWFnZXNbTGF1bmNoZXJQbHVnaW4ubGlDbG9zZWRGb2xkZXJdKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0cmVlSXRlbS5zZXRJbWFnZShub2RlLmdldERlc2NyaXB0b3IoKS5nZXRJY29uKCkpOwotCQkJCX0KLQkJCQlhZGRHcm91cCh0cmVlSXRlbSwgbm9kZS5nZXRGaXJzdENoaWxkKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBzcGVjaWZpZWQgbGF1bmNoIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW1EZXNjcmlwdG9yIHRoZSBsYXVuY2ggaXRlbSB0byBleGVjdXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxhdW5jaEl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbURlc2NyaXB0b3IpIHsKLQkJLyogQ2FzZSAxOiBUaGUgbGF1bmNoIGl0ZW0gaXMgYSB2aWV3ICovCi0JCVN0cmluZyBwbHVnaW5WaWV3SWQgPSBpdGVtRGVzY3JpcHRvci5nZXRWaWV3ICgpOwotCQlpZiAocGx1Z2luVmlld0lkICE9IG51bGwpIHsKLQkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQgPSB0aGlzOwotCQkJZmluYWwgSVdvcmtiZW5jaFBhcnRTaXRlIHdvcmtiZW5jaFBhcnRTaXRlID0gd29ya2JlbmNoUGFydC5nZXRTaXRlKCk7Ci0JCQlmaW5hbCBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoUGFydFNpdGUuZ2V0UGFnZSgpOwotCQkJdHJ5IHsKLQkJCQl3b3JrYmVuY2hQYWdlLnNob3dWaWV3KHBsdWdpblZpZXdJZCk7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGF1bmNoZXJQbHVnaW4ubG9nRXJyb3IoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bi5lcnJvci5JbnZvY2F0aW9uIiksIGUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCS8qIENhc2UgMjogVGhlIGxhdW5jaCBpdGVtIGlzIGEgc3RhbmRhbG9uZSBwcm9ncmFtICovCi0JCWlmICh3b3JrYmVuY2hTaGVsbCA9PSBudWxsKSByZXR1cm47Ci0JCXRyeSB7Ci0JCQlPYmplY3QgaW5zdGFuY2UgPSBpdGVtRGVzY3JpcHRvci5jcmVhdGVJdGVtSW5zdGFuY2UoKTsKLQkJCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gd29ya2JlbmNoU2hlbGwuZ2V0RGlzcGxheSgpOwotCQkJCU1ldGhvZCBvcGVuTWV0aG9kID0gaW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgib3BlbiIsIG5ldyBDbGFzc1tdIHtEaXNwbGF5LmNsYXNzfSk7Ci0JCQkJb3Blbk1ldGhvZC5pbnZva2UoaW5zdGFuY2UsIG5ldyBPYmplY3RbXSB7ZGlzcGxheX0pOwotCQkJfQotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJTGF1bmNoZXJQbHVnaW4ubG9nRXJyb3IoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bi5lcnJvci5Eb2VzTm90SW1wbGVtZW50TWV0aG9kIiksIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGF1bmNoZXJQbHVnaW4ubG9nRXJyb3IoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bi5lcnJvci5Db3VsZE5vdEluc3RhbnRpYXRlQ2xhc3MiKSwgZSk7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIE9idGFpbnMgdGhlIHNlbGVjdGVkIGxhdW5jaCBpdGVtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBJdGVtRGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgSXRlbURlc2NyaXB0b3IgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlmaW5hbCBUcmVlSXRlbVtdIHNlbGVjdGlvbnMgPSBsYXVuY2hUcmVlLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7Ci0JCWZpbmFsIEl0ZW1EZXNjcmlwdG9yIGl0ZW1EZXNjcmlwdG9yID0gKEl0ZW1EZXNjcmlwdG9yKSBzZWxlY3Rpb25zWzBdLmdldERhdGEoKTsKLQkJcmV0dXJuIGl0ZW1EZXNjcmlwdG9yOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBkZXNjcmlwdGlvbiB0ZXh0IHRvIHJlZmxlY3QgdGhhdCBvZiBhIHBhcnRpY3VsYXIgSXRlbURlc2NyaXB0b3IuCi0JICoKLQkgKiBAcGFyYW0gaXRlbURlc2NyaXB0b3IgdGhlIGxhdW5jaCBpdGVtIHdob3NlIGRlc2NyaXB0aW9uIGlzIHRvIGJlIGRpc3BsYXllZCwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlc2NyaXB0aW9uQnlJdGVtKEl0ZW1EZXNjcmlwdG9yIGl0ZW1EZXNjcmlwdG9yKSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbjsKLQkJaWYgKGl0ZW1EZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uID0gTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImxhdW5jaGl0ZW0uTnVsbC5kZXNjcmlwdGlvbiIpOwotCQkJaWYgKHJ1bkJ1dHRvbiAhPSBudWxsKSBydW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXNjcmlwdGlvbiA9IGl0ZW1EZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJsYXVuY2hpdGVtLk1pc3NpbmcuZGVzY3JpcHRpb24iKTsKLQkJCWlmIChydW5CdXR0b24gIT0gbnVsbCkgewotCQkJCXJ1bkJ1dHRvbi5zZXRFbmFibGVkKGl0ZW1EZXNjcmlwdG9yLmdldFZpZXcoKSAhPSBudWxsIHx8IGl0ZW1EZXNjcmlwdG9yLmdldE1haW5UeXBlKCkgIT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQoZGVzY3JpcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL1NwbGl0TGF5b3V0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9TcGxpdExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjM3YWYxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL1NwbGl0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQSBMYXlvdXQgY2xhc3MgdGhhdCBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzIGZyb20gYSBob3Jpem9udGFsIHNwbGl0IHRvIGEgdmVydGljYWwKLSAqIHNwbGl0IGxheW91dCB0byBhY2NvbW9kYXRlIGNoYW5naW5nIHNpemUgY29uZGl0aW9ucy4KLSAqIAotICogTGF0ZXIgb24gd2UgbWlnaHQgaW1wcm92ZSB0aGlzIGNsYXNzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSAicHJlZmVycmVkIiBzaXplIG9mCi0gKiB0aGUgd2lkZ2V0cy4KLSAqLwotcHVibGljIGNsYXNzIFNwbGl0TGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQKLQkJc3BsaXRIb3Jpem9udGFsbHkgPSAwLAotCQlzcGxpdFZlcnRpY2FsbHkgPSAxOwotCXByaXZhdGUgaW50IHNwbGl0RGlyZWN0aW9uID0gc3BsaXRIb3Jpem9udGFsbHk7Ci0KLQlwdWJsaWMgaW50IHNwYWNpbmcgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luVG9wID0gMzsKLQlwdWJsaWMgaW50IG1hcmdpbkxlZnQgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luUmlnaHQgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luQm90dG9tID0gMzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGF5b3V0Ci0JICovCi0JcHVibGljIFNwbGl0TGF5b3V0KCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgTGF5b3V0I2NvbXB1dGVTaXplKENvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJaWYgKHdIaW50ID09IFNXVC5ERUZBVUxUKSB7Ci0JCQlpZiAoaEhpbnQgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQlQb2ludCBoU3BsaXRTaXplID0gY29tcHV0ZUhTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJCVBvaW50IHZTcGxpdFNpemUgPSBjb21wdXRlVlNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmFsc2UpOwotCQkJCWludCBoU3BsaXRBcmVhID0gaFNwbGl0U2l6ZS54ICogaFNwbGl0U2l6ZS55OwotCQkJCWludCB2U3BsaXRBcmVhID0gdlNwbGl0U2l6ZS54ICogdlNwbGl0U2l6ZS55OwotCQkJCS8vIENob29zZSBkaXJlY3Rpb24gY29uc3VtaW5nIGxlYXN0IGFyZWEKLQkJCQlpZiAoaFNwbGl0QXJlYSA8IHZTcGxpdEFyZWEpIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdEhvcml6b250YWxseTsKLQkJCQkJcmV0dXJuIGhTcGxpdFNpemU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdFZlcnRpY2FsbHk7Ci0JCQkJCXJldHVybiB2U3BsaXRTaXplOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQ29uc3RyYWluZWQgaW4gaGVpZ2h0OiBzcGxpdCB2ZXJ0aWNhbGx5Ci0JCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdFZlcnRpY2FsbHk7Ci0JCQkJcmV0dXJuIGNvbXB1dGVWU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCkgewotCQkJCS8vIENvbnN0cmFpbmVkIGluIHdpZHRoOiBzcGxpdCBob3Jpem9udGFsbHkKLQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0SG9yaXpvbnRhbGx5OwotCQkJCXJldHVybiBjb21wdXRlSFNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChoSGludCA8IHdIaW50KSB7Ci0JCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRWZXJ0aWNhbGx5OwotCQkJCQlyZXR1cm4gY29tcHV0ZVZTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRIb3Jpem9udGFsbHk7Ci0JCQkJCXJldHVybiBjb21wdXRlSFNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQkJfQkJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHNlZSBMYXlvdXQjbGF5b3V0KENvbXBvc2l0ZSwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJY29tcHV0ZVNpemUoY29tcG9zaXRlLCBjbGllbnRBcmVhLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCwgZmFsc2UpOwotCQkKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWNsaWVudEFyZWEueCArPSBtYXJnaW5MZWZ0OwotCQljbGllbnRBcmVhLnkgKz0gbWFyZ2luVG9wOwotCQljbGllbnRBcmVhLndpZHRoIC09IG1hcmdpblJpZ2h0ICsgbWFyZ2luTGVmdDsKLQkJY2xpZW50QXJlYS5oZWlnaHQgLT0gbWFyZ2luQm90dG9tICsgbWFyZ2luVG9wOwotCQlQb2ludCBwb3NpdGlvbiA9IG5ldyBQb2ludChjbGllbnRBcmVhLngsIGNsaWVudEFyZWEueSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJZmluYWwgUmVjdGFuZ2xlIGJvdW5kczsKLQkJCWlmIChzcGxpdERpcmVjdGlvbiA9PSBzcGxpdEhvcml6b250YWxseSkgewotCQkJCWludCBoZWlnaHQgPSBjbGllbnRBcmVhLmhlaWdodCAvIGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIGNsaWVudEFyZWEud2lkdGgsIGhlaWdodCk7Ci0JCQkJcG9zaXRpb24ueSArPSBoZWlnaHQgKyBzcGFjaW5nOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgd2lkdGggPSBjbGllbnRBcmVhLndpZHRoIC8gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgd2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCQlwb3NpdGlvbi54ICs9IHdpZHRoICsgc3BhY2luZzsKLQkJCX0KLQkJCWJvdW5kcy53aWR0aCA9IE1hdGgubWF4KGJvdW5kcy53aWR0aCwgMCk7Ci0JCQlib3VuZHMuaGVpZ2h0ID0gTWF0aC5tYXgoYm91bmRzLmhlaWdodCwgMCk7Ci0JCQljaGlsZC5zZXRCb3VuZHMoYm91bmRzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZUhTcGxpdFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlQb2ludCBzaXplID0gbmV3IFBvaW50KG1hcmdpbkxlZnQgKyBtYXJnaW5SaWdodCwgbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tKTsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIENvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQotCQkJUG9pbnQgY2hpbGRTaXplID0gY2hpbGQuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCXNpemUueCA9IE1hdGgubWF4KHNpemUueCwgY2hpbGRTaXplLngpOwotCQkJc2l6ZS55ICs9IGNoaWxkU2l6ZS55ICsgc3BhY2luZzsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVWU3BsaXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJUG9pbnQgc2l6ZSA9IG5ldyBQb2ludChtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQsIG1hcmdpblRvcCArIG1hcmdpbkJvdHRvbSk7Ci0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0KLQkJCVBvaW50IGNoaWxkU2l6ZSA9IGNoaWxkLmNvbXB1dGVTaXplKHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQlzaXplLnggKz0gY2hpbGRTaXplLnggKyBzcGFjaW5nOwotCQkJc2l6ZS55ID0gTWF0aC5tYXgoc2l6ZS55LCBjaGlsZFNpemUueSk7Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmZjMmNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjUzNjJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjE0OjAzIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGU1NWQ1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS5sYXlvdXRzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4MjlmYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBMYXlvdXQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gTGF5b3V0czwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBsYXlvdXRzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgCi11c2VyIHRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGxheW91dC4KLVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEKLXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCB0aGUgdW5kZXJseWluZwotY29kZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSA8c3Ryb25nPkNvZGU8L3N0cm9uZz4gYnV0dG9uLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlLkxheW91dEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkxheW91dHM8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9pY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvaWNvbnMvbGF5b3V0c19leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NWRkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9pY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwYmRiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUTGF5b3V0RXhhbXBsZS5uYW1lID0gU1dUIExheW91dCBFeGFtcGxlIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5MYXlvdXRFeGFtcGxlLm5hbWUgPSBTV1QgTGF5b3V0cwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkxheW91dEV4YW1wbGUubmFtZSA9IExheW91dHMKLWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGxheW91dHMuIFxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGFsbG93cyB0aGUgXAotCXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LlwKLQlUaGUgdXNlciBjYW4gaW5zZXJ0IHdpZGdldHMgaW50byBhIGxheW91dCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGxheW91dCBkYXRhIFwKLQl1c2luZyBhIHByb3BlcnR5IHNoZWV0LiAgV2hlbiB0aGUgdXNlciBoYXMgYSBzdWl0YWJsZSBhcnJhbmdlbWVudCwgY29kZSBjYW4gYmUgXAotCWdlbmVyYXRlZCBieSBjbGlja2luZyBvbiB0aGUgQ29kZSBidXR0b24uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1MjNiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cyIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUTGF5b3V0RXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLkxheW91dFBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGF5b3V0cy5qYXIiPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuTGF5b3V0RXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbGF5b3V0c19leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMuTGF5b3V0VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5MYXlvdXRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkxheW91dEV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkMmRhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dHMvTGF5b3V0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBMYXlvdXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjliM2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0czsKLQotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogPGNvZGU+TGF5b3V0czwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIGxheW91dHMgZGVmaW5lZCBieSBTV1QuICBJdCBjb25zaXN0cyBvZiBhIHdvcmtiZW5jaAotICogdmlldyBhbmQgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUKLSAqIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGxheW91dC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlMYXlvdXRFeGFtcGxlIGluc3RhbmNlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IExheW91dEV4YW1wbGUoZnJhbWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2Uuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDBmNjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhZDg2OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjEzOjU0IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmZlNzYwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0gICAgICAgICAgICAKLXNvdXJjZS5vbGV3aW4zMi5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2RvYy1odG1sL3N3dF9vbGVfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvZG9jLWh0bWwvc3d0X29sZV9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjdkYThlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvZG9jLWh0bWwvc3d0X29sZV9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gT0xFIFdlYiBCcm93c2VyPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBPTEUgV2ViIEJyb3dzZXI8L2gyPgotCi08cD4KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gZW1iZWQgYW4gQWN0aXZlIFggY29udHJvbCBpbnRvIGFuIFNXVCBhcHBsaWNhdGlvbiBvciBhbiBFY2xpcHNlIHZpZXcuCi08L3A+Ci08cD4KLVdoZW4gdGhlIHZpZXcgaXMgb3BlbmVkLCBpdCB3aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgV2luZG93cyBJbnRlcm5ldCBFeHBsb3JlcgotY29udHJvbC4gIFRoZSBPTEUgd2ViIGJyb3dzZXIgaGFzCi08c3Ryb25nPkJhY2s8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Rm9yd2FyZDwvc3Ryb25nPiBidXR0b25zIHRvIHRha2UgeW91IHRvIHJlY2VudGx5IHZpc2l0ZWQgcGFnZXMuICBUaGUgYnJvd3NlciBhbHNvIGNvbnRhaW5zCi1hIDxzdHJvbmc+SG9tZTwvc3Ryb25nPiBidXR0b24gdG8gdGFrZSB5b3UgdG8gdGhlIHdlYiBicm93c2VyJ3MgaG9tZSBwYWdlLCBhIDxzdHJvbmc+U3RvcDwvc3Ryb25nPiBidXR0b24gd2hpY2ggc3RvcHMgdGhlIAotY3VycmVudCB0cmFuc2ZlciwgYSA8c3Ryb25nPlNlYXJjaDwvc3Ryb25nPiBidXR0b24gd2hpY2ggd2lsbCBzZWFyY2ggZm9yIHRleHQgdHlwZWQgaW4gdGhlIDxzdHJvbmc+QWRkcmVzczwvc3Ryb25nPiB0ZXh0IGZpZWxkLCBhbmQKLWEgPHN0cm9uZz5SZWZyZXNoPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCByZS1kcmF3cyB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZS4gVGhlcmUgaXMgYWxzbyBhCi08c3Ryb25nPkdvPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCwgd2hlbiBjbGlja2VkLCB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUgcGFnZSBzcGVjaWZpZWQgaW4gdGhlIDxzdHJvbmc+QWRkcmVzczwvc3Ryb25nPiBmaWVsZC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZyb20gRWNsaXBzZSdzIDxzdHJvbmc+V2luZG93PC9zdHJvbmc+IG1lbnUgc2VsZWN0IDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+ICZndDsgPHN0cm9uZz5PdGhlcjwvc3Ryb25nPi4gIAotSW4gdGhlIDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+IGRpYWxvZywgZXhwYW5kIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGFuZCBzZWxlY3QKLXRoZSB2aWV3IG5hbWVkIDxzdHJvbmc+T0xFIFdlYiBCcm93c2VyICh3aW4zMik8L3N0cm9uZz4uIEEgdmlldyBjb250YWluaW5nIGEgd2ViIGJyb3dzZXIgd2lsbCBhcHBlYXIuCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+T0xFIFdlYiBCcm93c2VyPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5XaW4zMiBvbmx5PC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvYmFja3dhcmRfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvYmFja3dhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZjZjQxYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2JhY2t3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2ZvcndhcmRfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvZm9yd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYjliNmFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvZm9yd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9ob21lX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdhMjMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvcmVmcmVzaF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNzBlMTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3NlYXJjaF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9zZWFyY2hfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzNhYzkxYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3NlYXJjaF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9zdG9wX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjUzZDM0Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODk1ZTIyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3dlYmJyb3dzZXJfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDRjMzYyZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RPTEVFeGFtcGxlLm5hbWUgPSBTV1QgT0xFIEV4YW1wbGUgUGx1Z2luIChXaW4zMikKLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuT0xFV2ViQnJvd3NlckV4YW1wbGUubmFtZSA9IE9MRSBXZWIgQnJvd3NlciAoV2luMzIpCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFdpbjMyT25seUV4YW1wbGVzLm5hbWUgPSBXaW4zMiBvbmx5Ci1sYXVuY2hjYXRlZ29yeS5TV1RXaW4zMk9ubHlFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgZm9yIFdpbmRvd3Mgc3lzdGVtcyBvbmx5LgotCi1sYXVuY2hpdGVtLk9MRVdlYkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBPTEUgV2ViIEJyb3dzZXIKLWxhdW5jaGl0ZW0uT0xFV2ViQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZW1iZWQgYW4gQWN0aXZlIFggY29udHJvbCBpbnRvIGFuIFNXVCBhcHBsaWNhdGlvbiBvciBhbiBFY2xpcHNlIHZpZXcuXG5cblwKLQlXaGVuIHRoZSB2aWV3IGlzIG9wZW5lZCwgaXQgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFdpbmRvd3MgSW50ZXJuZXQgRXhwbG9yZXIgXAotCWNvbnRyb2wuICBUaGUgT0xFIFdlYiBCcm93c2VyIGhhcyBcCi0JQmFjayBhbmQgRm9yd2FyZCBidXR0b25zIHRvIHRha2UgeW91IHRvIHJlY2VudGx5IHZpc2l0ZWQgcGFnZXMuICBUaGUgYnJvd3NlciBhbHNvIGNvbnRhaW5zIFwKLQlhIEhvbWUgYnV0dG9uIHRvIHRha2UgeW91IHRvIHRoZSB3ZWIgYnJvd3NlcidzIGhvbWUgcGFnZSwgYSBTdG9wIGJ1dHRvbiB3aGljaCBzdG9wcyB0aGUgXAotCWN1cnJlbnQgdHJhbnNmZXIsIGEgU2VhcmNoIGJ1dHRvbiB3aGljaCB3aWxsIHNlYXJjaCBmb3IgdGV4dCB0eXBlZCBpbiB0aGUgQWRkcmVzcyB0ZXh0IGZpZWxkLCBhbmQgXAotCWEgUmVmcmVzaCBidXR0b24gd2hpY2ggcmUtZHJhd3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIHBhZ2UuIFRoZXJlIGlzIGFsc28gYSBcCi0JR28gYnV0dG9uIHdoaWNoLCB3aGVuIGNsaWNrZWQsIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBwYWdlIHNwZWNpZmllZCBpbiB0aGUgQWRkcmVzcyBmaWVsZC4KLQotYnJvd3Nlci5CYWNrLnRleHQgPSBCYWNrd2FyZAotYnJvd3Nlci5CYWNrLnRvb2x0aXAgPSBHbyB0byBwcmV2aW91cyBXZWIgc2l0ZSBpbiB0aGUgaGlzdG9yeSBsaXN0Ci0KLWJyb3dzZXIuRm9yd2FyZC50ZXh0ID0gRm9yd2FyZAotYnJvd3Nlci5Gb3J3YXJkLnRvb2x0aXAgPSBHbyB0byBuZXh0IFdlYiBzaXRlIGluIHRoZSBoaXN0b3J5IGxpc3QKLQotYnJvd3Nlci5Ib21lLnRleHQgPSBIb21lCi1icm93c2VyLkhvbWUudG9vbHRpcCA9IEdvIHRvIGhvbWUgV2ViIHNpdGUKLQotYnJvd3Nlci5TdG9wLnRleHQgPSBTdG9wCi1icm93c2VyLlN0b3AudG9vbHRpcCA9IFN0b3AgbG9hZGluZyBjdXJyZW50IFdlYiBzaXRlCi0KLWJyb3dzZXIuUmVmcmVzaC50ZXh0ID0gUmVmcmVzaAotYnJvd3Nlci5SZWZyZXNoLnRvb2x0aXAgPSBSZWZyZXNoIGN1cnJlbnQgV2ViIHNpdGUKLQotYnJvd3Nlci5TZWFyY2gudGV4dCA9IFNlYXJjaAotYnJvd3Nlci5TZWFyY2gudG9vbHRpcCA9IFNlYXJjaCB0aGUgV2ViCi0KLWJyb3dzZXIuQWRkcmVzcy5sYWJlbCA9IEFkZHJlc3MgOgotCi1icm93c2VyLkdvLnRleHQgPSBHbwotCi1icm93c2VyLlN0YXRlLlVuaW5pdGlhbGl6ZWQudGV4dCA9IE5vdCByZWFkeS4KLWJyb3dzZXIuU3RhdGUuTG9hZGluZy50ZXh0ID0gTG9hZGluZyBXZWIgc2l0ZS4uLgotYnJvd3Nlci5TdGF0ZS5Mb2FkZWQudGV4dCA9IFJlYWR5LgotYnJvd3Nlci5TdGF0ZS5JbnRlcmFjdGl2ZS50ZXh0ID0gTG9hZGluZyBXZWIgc2l0ZS4uLgotYnJvd3Nlci5TdGF0ZS5Db21wbGV0ZS50ZXh0ID0gRG9uZS4KLQotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi1lcnJvci5Db3VsZE5vdENyZWF0ZUJyb3dzZXJDb250cm9sID0gVW5hYmxlIHRvIGNyZWF0ZSA8PEJyb3dzZXIgQ29udHJvbD4+Ci0KLWxhdW5jaGl0ZW0uT0xFRXhhbXBsZS5uYW1lPU9MRSBFeGFtcGxlCi1sYXVuY2hpdGVtLk9MRUV4YW1wbGUuZGVzY3JpcHRpb249XAotCVRoZSBPTEUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGVtYmVkIGFuIEFjdGl2ZSBYIGNvbnRyb2wgaW50byBcCi0JYW4gU1dUIGFwcGxpY2F0aW9uLlxuXG5cCi0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4ZTdmNWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gRmlsZSB3cml0dGVuIGJ5IFBERSAxLjAgLS0+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMiIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUT0xFRXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuT2xlUGx1Z2luIj4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLTxyZXF1aXJlcz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci08L3JlcXVpcmVzPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci08IS0tIFJ1bnRpbWUgLS0+Ci08cnVudGltZT4KLSAgIDxsaWJyYXJ5IG5hbWU9Im9sZXdpbjMyLmphciI+Ci0gICA8L2xpYnJhcnk+Ci08L3J1bnRpbWU+Ci0KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICA8dmlldwotICAgICAgICAgbmFtZT0iJXZpZXcuT0xFV2ViQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgICAgICAgIGljb249Imljb25zL3dlYmJyb3dzZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuT2xlQnJvd3NlclZpZXciCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5icm93c2VyVmlldyI+Ci0gICA8L3ZpZXc+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgPGNhdGVnb3J5Ci0gICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUV2luMzJPbmx5RXhhbXBsZXMubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUV2luMzJPbmx5RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFdpbjMyT25seUNhdGVnb3J5Ij4KLSAgIDwvY2F0ZWdvcnk+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uT0xFV2ViQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgICAgICAgIGljb249Imljb25zL3dlYmJyb3dzZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uT0xFV2ViQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFdpbjMyT25seUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIudmlld2xhdW5jaGVyIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuYnJvd3NlclZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLk9MRUV4YW1wbGUubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5PTEVFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hXaW4zMk9ubHlDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuT0xFRXhhbXBsZSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09MRUV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT0xFRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM4MmVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT0xFRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBPTEVFeGFtcGxlIGlzIGFuIGV4YW1wbGUgdGhhdCB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gCi0gKiBsaWJyYXJpZXMgdG8gaW1wbGVtZW50IGEgc2ltcGxlIFNXVCB3aW5kb3cgdGhhdCBjYW4gaG9zdCBkaWZmZXJlbnQgQWN0aXZlIFgKLSAqIGNvbnRyb2xzLgotICoKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLXB1YmxpYyBjbGFzcyBPTEVFeGFtcGxlIHsKLQotCU9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQlPbGVGcmFtZSBvbGVGcmFtZTsKLQlCdXR0b24gY2xvc2VCdXR0b247Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlPTEVFeGFtcGxlIGV4YW1wbGUgPSBuZXcgT0xFRXhhbXBsZSgpOwotCQlleGFtcGxlLm9wZW4oZGlzcGxheSk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCS8qKiAKLQkgKiBDcmVhdGUgYSBmaWxlIEV4aXQgbWVudSBpdGVtIAotCSAqLwotCXZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBzaGVsbC5nZXRNZW51QmFyKCk7Ci0JCWlmIChtZW51QmFyID09IG51bGwpIHsKLQkJCW1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQl9Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCWZyYW1lLnNldEZpbGVNZW51cyhuZXcgTWVudUl0ZW1bXSB7IGZpbGVNZW51IH0pOwotCQkKLQkJTWVudUl0ZW0gbWVudUZpbGVFeGl0ID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlRXhpdC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlRXhpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgZGlzcG9zZUNsaWVudCgpIHsKLQkJaWYgKGNsaWVudFNpdGUgIT0gbnVsbCkKLQkJCWNsaWVudFNpdGUuZGlzcG9zZSgpOwotCQljbGllbnRTaXRlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgdGhlIHVzZXIgZm9yIGEgZmlsZSBhbmQgdHJ5IHRvIG9wZW4gaXQgd2l0aCBzb21lIGtub3duIEFjdGl2ZVggY29udHJvbHMuCi0JICovCi0Jdm9pZCBmaWxlT3BlbigpIHsKLQkJU2hlbGwgc2hlbGwgPSBvbGVGcmFtZS5nZXRTaGVsbCgpOwotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsKSByZXR1cm47Ci0KLQkJZGlzcG9zZUNsaWVudCgpOwotCi0JCS8vIHRyeSBvcGVuaW5nIGEgLmRvYyBmaWxlIHVzaW5nIFdvcmQKLQkJaWYgKGNsaWVudFNpdGUgPT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJaWYgKGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiZG9jIikgfHwgCi0JCQkJCQlmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInJ0ZiIpIHx8Ci0JCQkJCQlmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInR4dCIpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiV29yZC5Eb2N1bWVudCIsIG5ldyBGaWxlKGZpbGVOYW1lKSk7Ci0JCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlcnJvcjIpIHsKLQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHRyeSBvcGVuaW5nIGEgeGxzIGZpbGUgd2l0aCBFeGNlbAotCQlpZiAoY2xpZW50U2l0ZSA9PSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ4bHMiKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIkV4Y2VsLlNoZWV0IiwgbmV3IEZpbGUoZmlsZU5hbWUpKTsKLQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yMikgewotCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdHJ5IG9wZW5pbmcgYSBtZWRpYSBmaWxlIHdpdGggTVBsYXllcgotCQlpZiAoY2xpZW50U2l0ZSA9PSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJtcGEiKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIk1QbGF5ZXIiLCBuZXcgRmlsZShmaWxlTmFtZSkpOwotCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXJyb3IyKSB7Ci0JCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB0cnkgb3BlbmluZyB3aXRoIHdtdiwgbXBnLCBtcGVnLCBhdmksIGFzZiwgd2F2IHdpdGggV01QbGF5ZXIKLQkJaWYgKGNsaWVudFNpdGUgPT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJaWYgKGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgid212IikKLQkJCQkJCXx8IGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgibXBnIikKLQkJCQkJCXx8IGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgibXBlZyIpCi0JCQkJCQl8fCBmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImF2aSIpCi0JCQkJCQl8fCBmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImFzZiIpCi0JCQkJCQl8fCBmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoIndhdiIpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiV01QbGF5ZXIuT0NYIik7Ci0JCQkJCQlPbGVBdXRvbWF0aW9uIHBsYXllciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNsaWVudFNpdGUpOwotCQkJCQkJaW50IHBsYXlVUkxbXSA9IHBsYXllci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJVUkwiIH0pOwotCQkJCQkJaWYgKHBsYXlVUkwgIT0gbnVsbCkgewotCQkJCQkJCWJvb2xlYW4gc3VjZWVkZWQgPSBwbGF5ZXIuc2V0UHJvcGVydHkocGxheVVSTFswXSwgbmV3IFZhcmlhbnQoZmlsZU5hbWUpKTsKLQkJCQkJCQlpZiAoIXN1Y2VlZGVkKQotCQkJCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJCX0KLQkJCQkJCXBsYXllci5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlcnJvcjIpIHsKLQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHRyeSBvcGVuaW5nIGEgUERGIGZpbGUgd2l0aCBBY3JvYmF0IHJlYWRlcgotCQlpZiAoY2xpZW50U2l0ZSA9PSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJwZGYiKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIlBERi5QZGZDdHJsLjUiKTsKLQkJCQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQkJCQkgICAgT2xlQXV0b21hdGlvbiBwZGYgPSBuZXcgT2xlQXV0b21hdGlvbiAoY2xpZW50U2l0ZSk7Ci0JCQkJCSAgICBpbnQgbG9hZEZpbGVbXSA9IHBkZi5nZXRJRHNPZk5hbWVzIChuZXcgU3RyaW5nIFtdIHsiTG9hZEZpbGUifSk7Ci0JCQkJCSAgICBpZiAobG9hZEZpbGUgIT0gbnVsbCkgewotCQkJCQkgICAgCVZhcmlhbnQgcmVzdWx0ID0gcGRmLmludm9rZShsb2FkRmlsZVswXSwgbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoZmlsZU5hbWUpfSk7Ci0JCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlyZXN1bHQuZGlzcG9zZSgpOwotCQkJCQkgICAgfSBlbHNlIHsKLQkJCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCSAgICB9Ci0JCQkJCSAgICBwZGYuZGlzcG9zZSgpOwotCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXJyb3IyKSB7Ci0JCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB0cnkgb3BlbmluZyB3aXRoIEV4cGxvcmVyCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCQkJT2xlQXV0b21hdGlvbiBleHBsb3JlciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNsaWVudFNpdGUpOwotCQkJCWludFtdIG5hdmlnYXRlID0gZXhwbG9yZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIn0pOyAKLQkJCQkKLQkJCQlpZiAobmF2aWdhdGUgIT0gbnVsbCkgewotCQkJCQlWYXJpYW50IHJlc3VsdCA9IGV4cGxvcmVyLmludm9rZShuYXZpZ2F0ZVswXSwgbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoZmlsZU5hbWUpfSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJZWxzZQotCQkJCQkJcmVzdWx0LmRpc3Bvc2UoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJfQotCQkJCWV4cGxvcmVyLmRpc3Bvc2UoKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlcnJvcjIpIHsKLQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY2xpZW50U2l0ZSAhPSBudWxsKXsKLQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQl9Ci0JfQotCi0Jdm9pZCBuZXdDbGllbnRTaXRlKFN0cmluZyBwcm9nSUQpIHsKLQkJZGlzcG9zZUNsaWVudCgpOwotCQl0cnkgewotCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgcHJvZ0lEKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yKSB7Ci0KLQkJfQotCQlpZiAoY2xpZW50U2l0ZSAhPSBudWxsKQotCQkJY2xpZW50U2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbihEaXNwbGF5IGRpc3BsYXkpIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIk9MRSBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIHRydWUpKTsKLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlidXR0b25zLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJQ29tcG9zaXRlIGRpc3BsYXlBcmVhID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlkaXNwbGF5QXJlYS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWRpc3BsYXlBcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMywgMSkpOwotCi0JCUJ1dHRvbiBleGNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlJBRElPKTsKLQkJZXhjZWxCdXR0b24uc2V0VGV4dCgiTmV3IEV4Y2VsIFNoZWV0Iik7Ci0JCWV4Y2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQluZXdDbGllbnRTaXRlKCJFeGNlbC5TaGVldCIpOwotCQkJfQotCQl9KTsKLQkJQnV0dG9uIG1lZGlhUGxheWVyQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUkFESU8pOwotCQltZWRpYVBsYXllckJ1dHRvbi5zZXRUZXh0KCJOZXcgTVBsYXllciIpOwotCQltZWRpYVBsYXllckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJbmV3Q2xpZW50U2l0ZSgiTVBsYXllciIpOwotCQkJfQotCQl9KTsKLQkJQnV0dG9uIHBvd2VyUG9pbnRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5SQURJTyk7Ci0JCXBvd2VyUG9pbnRCdXR0b24uc2V0VGV4dCgiTmV3IFBvd2VyUG9pbnQgU2xpZGUiKTsKLQkJcG93ZXJQb2ludEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJbmV3Q2xpZW50U2l0ZSgiUG93ZXJQb2ludC5TbGlkZSIpOwotCQkJfQotCQl9KTsKLQkJQnV0dG9uIHdvcmRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5SQURJTyk7Ci0JCXdvcmRCdXR0b24uc2V0VGV4dCgiTmV3IFdvcmQgRG9jdW1lbnQiKTsKLQkJd29yZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJbmV3Q2xpZW50U2l0ZSgiV29yZC5Eb2N1bWVudCIpOwotCQkJfQotCQl9KTsKLQkJbmV3IExhYmVsKGJ1dHRvbnMsIFNXVC5OT05FKTsKLQkJQnV0dG9uIG9wZW5CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5SQURJTyk7Ci0JCW9wZW5CdXR0b24uc2V0VGV4dCgiT3BlbiBmaWxlLi4uIik7Ci0JCW9wZW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCWZpbGVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTGFiZWwoYnV0dG9ucywgU1dULk5PTkUpOwotCQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlJBRElPKTsKLQkJY2xvc2VCdXR0b24uc2V0VGV4dCgiQ2xvc2UgZmlsZSIpOwotCQljbG9zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJfQotCQl9KTsJCi0JCWNsb3NlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCi0JCW9sZUZyYW1lID0gbmV3IE9sZUZyYW1lKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCWFkZEZpbGVNZW51KG9sZUZyYW1lKTsKLQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVCcm93c2VyVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVCcm93c2VyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOWJhNWQ0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlQnJvd3NlclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogT2xlIHVzZXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0PC9jb2RlPiB0byBkZW1vbnN0cmF0ZSBXaW4zMiBPTEUgLyBBY3RpdmVYCi0gKiBpbnRlZ3JhdGlvbi4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgT2xlQnJvd3NlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSAgICAgIGRpc3BsYXlBcmVhOwotCi0JcHJpdmF0ZSBPbGVGcmFtZSAgICAgICB3ZWJGcmFtZTsKLQlwcml2YXRlIE9sZVdlYkJyb3dzZXIgIHdlYkJyb3dzZXI7Ci0JcHJpdmF0ZSBUZXh0ICAgICAgICAgICB3ZWJVcmw7Ci0JcHJpdmF0ZSBPbGVDb250cm9sU2l0ZSB3ZWJDb250cm9sU2l0ZTsKLQlwcml2YXRlIFByb2dyZXNzQmFyICAgIHdlYlByb2dyZXNzOwotCXByaXZhdGUgTGFiZWwgICAgICAgICAgd2ViU3RhdHVzOwotCXByaXZhdGUgQnV0dG9uICAgICAgICAgd2ViTmF2aWdhdGVCdXR0b247Ci0JCi0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kQmFja3dhcmQ7Ci0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kRm9yd2FyZDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRIb21lOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZFN0b3A7Ci0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kUmVmcmVzaDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRTZWFyY2g7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFjdGl2YXRlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU1BJRF9BTUJJRU5UX0RMQ09OVFJPTCA9IC01NTEyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBETENUTF9OT19TQ1JJUFRTID0gMHg4MDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHRoZSBPTEUgYnJvd3NlciB2aWV3LgotCSAqLwotCXB1YmxpYyBPbGVCcm93c2VyVmlldygpIHsKLQkJT2xlUGx1Z2luLmluaXRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlLgotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWRpc3BsYXlBcmVhID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlkaXNwbGF5QXJlYS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCQotCQljcmVhdGVUb29sYmFyKCk7Ci0JCWNyZWF0ZUJyb3dzZXJGcmFtZSgpOwkJCi0JCWNyZWF0ZVN0YXR1c0FyZWEoKTsKLQkJY3JlYXRlQnJvd3NlckNvbnRyb2woKTsJCi0JfQotCQotCS8qKgotCSAqIENsZWFudXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYWN0aXZhdGVkKSB7Ci0JCQl3ZWJDb250cm9sU2l0ZS5kZWFjdGl2YXRlSW5QbGFjZUNsaWVudCgpOwotCQkJYWN0aXZhdGVkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHdlYkJyb3dzZXIgIT0gbnVsbCkgd2ViQnJvd3Nlci5kaXNwb3NlKCk7Ci0JCXdlYkJyb3dzZXIgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpICB7Ci0JCXdlYlVybC5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFdlYiBicm93c2VyIHRvb2xiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRvb2xiYXIoKSB7Ci0JCS8vIEFkZCBhIHRvb2xiYXIKLQkJVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhcihkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWJhci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBuYXZpZ2F0ZSBiYWNrd2FyZHMgdGhyb3VnaCBwcmV2aW91c2x5IHZpc2l0ZWQgd2ViIHNpdGVzCi0JCXdlYkNvbW1hbmRCYWNrd2FyZCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5CYWNrLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5CYWNrLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaUJhY2tdKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLkdvQmFjaygpOwotCQkJfQotCQl9KTsKLQkKLQkJLy8gQWRkIGEgYnV0dG9uIHRvIG5hdmlnYXRlIGZvcndhcmQgdGhyb3VnaCBwcmV2aW91c2x5IHZpc2l0ZWQgd2ViIHNpdGVzCi0JCXdlYkNvbW1hbmRGb3J3YXJkID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuRm9yd2FyZC50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Gb3J3YXJkLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpRm9yd2FyZF0pOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZEZvcndhcmQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLkdvRm9yd2FyZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSBzZXBhcmF0b3IKLQkJbmV3IFRvb2xJdGVtKGJhciwgU1dULlNFUEFSQVRPUik7Ci0JCQotCQkvLyBBZGQgYSBidXR0b24gdG8gbmF2aWdhdGUgdG8gdGhlIEhvbWUgcGFnZQotCQl3ZWJDb21tYW5kSG9tZSA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZEhvbWUuc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkhvbWUudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZEhvbWUuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuSG9tZS50ZXh0IikpOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaUhvbWVdKTsKLQkJd2ViQ29tbWFuZEhvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRIb21lLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5Hb0hvbWUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIGEgYnV0dG9uIHRvIGFib3J0IHdlYiBwYWdlIGxvYWRpbmcKLQkJd2ViQ29tbWFuZFN0b3AgPSBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSk7Ci0JCXdlYkNvbW1hbmRTdG9wLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdG9wLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRTdG9wLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0b3AudGV4dCIpKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlTdG9wXSk7Ci0JCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kU3RvcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuU3RvcCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSBidXR0b24gdG8gcmVmcmVzaCB0aGUgY3VycmVudCB3ZWIgcGFnZQotCQl3ZWJDb21tYW5kUmVmcmVzaCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlJlZnJlc2gudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuUmVmcmVzaC50ZXh0IikpOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaVJlZnJlc2hdKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRSZWZyZXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5SZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIHNlcGFyYXRvcgotCQluZXcgVG9vbEl0ZW0oYmFyLCBTV1QuU0VQQVJBVE9SKTsKLQotCQkvLyBBZGQgYSBidXR0b24gdG8gc2VhcmNoIHRoZSB3ZWIKLQkJd2ViQ29tbWFuZFNlYXJjaCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU2VhcmNoLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRTZWFyY2guc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU2VhcmNoLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRTZWFyY2guc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlTZWFyY2hdKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuR29TZWFyY2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIGEgdGV4dCBhcmVhIGZvciBVc2VycyB0byBlbnRlciBhIHVybAotCQlDb21wb3NpdGUgYWRkcmVzc0JhciA9IG5ldyBDb21wb3NpdGUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYWRkcmVzc0Jhci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJYWRkcmVzc0Jhci5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJTGFiZWwgYWRkcmVzc0xhYmVsID0gbmV3IExhYmVsKGFkZHJlc3NCYXIsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWFkZHJlc3NMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJYWRkcmVzc0xhYmVsLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkFkZHJlc3MubGFiZWwiKSk7Ci0JCWFkZHJlc3NMYWJlbC5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JCQotCQl3ZWJVcmwgPSBuZXcgVGV4dChhZGRyZXNzQmFyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXdlYlVybC5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQl3ZWJVcmwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXdlYlVybC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5nZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24od2ViTmF2aWdhdGVCdXR0b24pOwotCQkJfQotCQl9KTsKLQkKLQkJLy8gQWRkIGEgYnV0dG9uIHRvIG5hdmlnYXRlIHRvIHRoZSB3ZWIgc2l0ZSBzcGVjaWZpZWQgaW4gdGhlIFRleHQgYXJlYSBkZWZpbmVkIGFib3ZlCi0JCXdlYk5hdmlnYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihhZGRyZXNzQmFyLCBTV1QuUFVTSCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJd2ViTmF2aWdhdGVCdXR0b24uc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuR28udGV4dCIpKTsKLQkJd2ViTmF2aWdhdGVCdXR0b24uc2V0Rm9udChPbGVQbHVnaW4uYnJvd3NlckZvbnQpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLk5hdmlnYXRlKHdlYlVybC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBXZWIgYnJvd3NlciBPbGVGcmFtZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnJvd3NlckZyYW1lKCkgewotCQkvLyBFdmVyeSBjb250cm9sIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIE9sZUZyYW1lOgotCQl3ZWJGcmFtZSA9IG5ldyBPbGVGcmFtZShkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl3ZWJGcmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgV2ViIGJyb3dzZXIgc3RhdHVzIGFyZWEuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0YXR1c0FyZWEoKSB7Ci0JCS8vIEFkZCBhIHByb2dyZXNzIGJhciB0byBkaXNwbGF5IGRvd25sb2FkaW5nIHByb2dyZXNzIGluZm9ybWF0aW9uCi0JCXdlYlByb2dyZXNzID0gbmV3IFByb2dyZXNzQmFyKGRpc3BsYXlBcmVhLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQl3ZWJQcm9ncmVzcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsJCQotCi0JCS8vIEFkZCBhIGxhYmVsIGZvciBkaXNwbGF5aW5nIHN0YXR1cyBtZXNzYWdlcyBhcyB0aGV5IGFyZSByZWNlaXZlZCBmcm9tIHRoZSBjb250cm9sCi0JCXdlYlN0YXR1cyA9IG5ldyBMYWJlbChkaXNwbGF5QXJlYSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJd2ViU3RhdHVzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl3ZWJTdGF0dXMuc2V0Rm9udChPbGVQbHVnaW4uYnJvd3NlckZvbnQpOwotCX0JCi0KLQkvKioKLQkgKiBDcmVhdGVzIFdlYiBicm93c2VyIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJyb3dzZXJDb250cm9sKCkgewotCQl0cnkgewotCQkJLy8gQ3JlYXRlIGFuIEF1dG9tYXRpb24gb2JqZWN0IGZvciBhY2Nlc3MgdG8gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzCi0JCQl3ZWJDb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZSh3ZWJGcmFtZSwgU1dULk5PTkUsICJTaGVsbC5FeHBsb3JlciIpOwotCQkJVmFyaWFudCBkb3dubG9hZCA9IG5ldyBWYXJpYW50KERMQ1RMX05PX1NDUklQVFMpOwotCQkJd2ViQ29udHJvbFNpdGUuc2V0U2l0ZVByb3BlcnR5KERJU1BJRF9BTUJJRU5UX0RMQ09OVFJPTCwgZG93bmxvYWQpOwotCQkJT2xlQXV0b21hdGlvbiBvbGVBdXRvbWF0aW9uID0gbmV3IE9sZUF1dG9tYXRpb24od2ViQ29udHJvbFNpdGUpOwotCQkJd2ViQnJvd3NlciA9IG5ldyBPbGVXZWJCcm93c2VyKG9sZUF1dG9tYXRpb24pOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIENyZWF0aW9uIG1heSBoYXZlIGZhaWxlZCBiZWNhdXNlIGNvbnRyb2wgaXMgbm90IGluc3RhbGxlZCBvbiBtYWNoaW5lCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh3ZWJGcmFtZSwgU1dULkJPUkRFUik7Ci0JCQlPbGVQbHVnaW4ubG9nRXJyb3IoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdENyZWF0ZUJyb3dzZXJDb250cm9sIiksIGV4KTsKLQkJCWxhYmVsLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdENyZWF0ZUJyb3dzZXJDb250cm9sIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gUmVzcG9uZCB0byBQcm9ncmVzc0NoYW5nZSBldmVudHMgYnkgdXBkYXRpbmcgdGhlIFByb2dyZXNzIGJhcgotCQl3ZWJDb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKE9sZVdlYkJyb3dzZXIuUHJvZ3Jlc3NDaGFuZ2UsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFyaWFudCBwcm9ncmVzcyA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlWYXJpYW50IG1heFByb2dyZXNzID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCQkJCWlmIChwcm9ncmVzcyA9PSBudWxsIHx8IG1heFByb2dyZXNzID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQl3ZWJQcm9ncmVzcy5zZXRNYXhpbXVtKG1heFByb2dyZXNzLmdldEludCgpKTsKLQkJCQl3ZWJQcm9ncmVzcy5zZXRTZWxlY3Rpb24ocHJvZ3Jlc3MuZ2V0SW50KCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIFJlc3BvbmQgdG8gU3RhdHVzVGV4dENoYW5nZSBldmVudHMgYnkgdXBkYXRpbmcgdGhlIFN0YXR1cyBUZXh0IGxhYmVsCi0JCXdlYkNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoT2xlV2ViQnJvd3Nlci5TdGF0dXNUZXh0Q2hhbmdlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCVZhcmlhbnQgc3RhdHVzVGV4dCA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlpZiAoc3RhdHVzVGV4dCA9PSBudWxsKQlyZXR1cm47Ci0JCQkJU3RyaW5nIHRleHQgPSBzdGF0dXNUZXh0LmdldFN0cmluZygpOwotCQkJCWlmICh0ZXh0ICE9IG51bGwpCi0JCQkJCXdlYlN0YXR1cy5zZXRUZXh0KHRleHQpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIExpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgcmVhZHkgc3RhdGUgYW5kIHByaW50IG91dCB0aGUgY3VycmVudCBzdGF0ZSAKLQkJd2ViQ29udHJvbFNpdGUuYWRkUHJvcGVydHlMaXN0ZW5lcihPbGVXZWJCcm93c2VyLkRJU1BJRF9SRUFEWVNUQVRFLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kZXRhaWwgPT0gT0xFLlBST1BFUlRZX0NIQU5HSU5HKSByZXR1cm47Ci0JCQkJaW50IHN0YXRlID0gd2ViQnJvd3Nlci5nZXRSZWFkeVN0YXRlKCk7Ci0JCQkJc3dpdGNoIChzdGF0ZSkgewotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuUkVBRFlTVEFURV9VTklOSVRJQUxJWkVEOgotCQkJCQkJd2ViU3RhdHVzLnNldFRleHQoCi0JCQkJCQkJT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0YXRlLlVuaW5pdGlhbGl6ZWQudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXdlYkNvbW1hbmRGb3J3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZEhvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuUkVBRFlTVEFURV9MT0FESU5HOgotCQkJCQkJd2ViU3RhdHVzLnNldFRleHQoCi0JCQkJCQkJT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0YXRlLkxvYWRpbmcudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRIb21lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXdlYkNvbW1hbmRTZWFyY2guc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuUkVBRFlTVEFURV9MT0FERUQ6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuTG9hZGVkLnRleHQiKSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0lOVEVSQUNUSVZFOgotCQkJCQkJd2ViU3RhdHVzLnNldFRleHQoCi0JCQkJCQkJT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0YXRlLkludGVyYWN0aXZlLnRleHQiKSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0NPTVBMRVRFOgotCQkJCQkJd2ViU3RhdHVzLnNldFRleHQoCi0JCQkJCQkJT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0YXRlLkNvbXBsZXRlLnRleHQiKSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBhY3RpdmUgY29tbWFuZCBzdGF0ZXMKLQkJd2ViQ29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihPbGVXZWJCcm93c2VyLkNvbW1hbmRTdGF0ZUNoYW5nZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQudHlwZSAhPSBPbGVXZWJCcm93c2VyLkNvbW1hbmRTdGF0ZUNoYW5nZSkgcmV0dXJuOwotCQkJCWZpbmFsIGludCBjb21tYW5kSUQgPQotCQkJCQkoZXZlbnQuYXJndW1lbnRzWzBdICE9IG51bGwpID8gZXZlbnQuYXJndW1lbnRzWzBdLmdldEludCgpIDogMDsKLQkJCQlmaW5hbCBib29sZWFuIGNvbW1hbmRFbmFibGVkID0KLQkJCQkJKGV2ZW50LmFyZ3VtZW50c1sxXSAhPSBudWxsKSA/IGV2ZW50LmFyZ3VtZW50c1sxXS5nZXRCb29sZWFuKCkgOiBmYWxzZTsKLQkJCQkKLQkJCQlzd2l0Y2ggKGNvbW1hbmRJRCkgewotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuQ1NDX05BVklHQVRFQkFDSzoKLQkJCQkJIAl3ZWJDb21tYW5kQmFja3dhcmQuc2V0RW5hYmxlZChjb21tYW5kRW5hYmxlZCk7Ci0JCQkJCSAJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5DU0NfTkFWSUdBVEVGT1JXQVJEOgotCQkJCQkgCXdlYkNvbW1hbmRGb3J3YXJkLnNldEVuYWJsZWQoY29tbWFuZEVuYWJsZWQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBpbiBwbGFjZSBhY3RpdmF0ZSB0aGUgQWN0aXZlWCBjb250cm9sCQkKLQkJYWN0aXZhdGVkID0gKHdlYkNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKSA9PSBPTEUuU19PSyk7Ci0JCWlmIChhY3RpdmF0ZWQpIHdlYkJyb3dzZXIuR29Ib21lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1NWMyZTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMjsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIE9sZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBPbGVQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0Jc3RhdGljIGZpbmFsIGludAotCQliaUJhY2sgPSAwLAotCQliaUZvcndhcmQgPSAxLAotCQliaUhvbWUgPSAyLAotCQliaVN0b3AgPSAzLAotCQliaVJlZnJlc2ggPSA0LAotCQliaVNlYXJjaCA9IDU7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIGltYWdlTG9jYXRpb25zID0gewotCQkiaWNvbnMvYmFja3dhcmRfbmF2LmdpZiIsCi0JCSJpY29ucy9mb3J3YXJkX25hdi5naWYiLAotCQkiaWNvbnMvaG9tZV9uYXYuZ2lmIiwKLQkJImljb25zL3N0b3BfbmF2LmdpZiIsCi0JCSJpY29ucy9yZWZyZXNoX25hdi5naWYiLAotCQkiaWNvbnMvc2VhcmNoX25hdi5naWYiIH07Ci0Jc3RhdGljIEltYWdlIGltYWdlc1tdOwotCXN0YXRpYyBGb250ICBicm93c2VyRm9udDsKLSAgIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gT0xFIHBsdWdpbi4KLQkgKi8KLQlwdWJsaWMgT2xlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShnZXRCdW5kbGUoKSk7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIENsZWFuIHVwCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2xlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0Ci0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcGx1Z2luLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKAotCQkJSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzID09IG51bGwpIHsKLQkJCWltYWdlcyA9IG5ldyBJbWFnZVtpbWFnZUxvY2F0aW9ucy5sZW5ndGhdOwotCQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCWltYWdlc1tpXSA9IGdldEltYWdlRnJvbVBsdWdpbihwbHVnaW4uZ2V0QnVuZGxlKCksIGltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQlpZiAoaW1hZ2VzW2ldID09IG51bGwpIHsKLQkJCQkJZnJlZVJlc291cmNlcygpOwotCQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzIiksIG51bGwpOwotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChicm93c2VyRm9udCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWJyb3dzZXJGb250ID0gbmV3IEZvbnQgKG51bGwsICJNUyBTYW5zIFNlcmlmIiwgOCwgU1dULk5VTEwpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKGltYWdlcyA9PSBudWxsIHx8IGJyb3dzZXJGb250ID09IG51bGwpIHsKLQkJCWZyZWVSZXNvdXJjZXMoKTsKLQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSwgbnVsbCk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJaW1hZ2VzID0gbnVsbDsKLQkJfQotCQlpZiAoYnJvd3NlckZvbnQgIT0gbnVsbCkgYnJvd3NlckZvbnQuZGlzcG9zZSAoKTsKLQkJYnJvd3NlckZvbnQgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGFuIGltYWdlIGZyb20gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gcGQgdGhlIHBsdWdpbiBkZXNjcmlwdG9yIGZvciB0aGUgcGx1Z2luIHdpdGggdGhlIGltYWdlCi0JICogQHBhcmFtIGljb25QYXRoIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBpbnN0YWxsIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gdGhlIGltYWdlLCBvciBudWxsIGlmIG5vdCBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlIGdldEltYWdlRnJvbVBsdWdpbihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgaWNvblBhdGgpIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIGluc3RhbGxVcmwgPSBidW5kbGUuZ2V0RW50cnkoIi8iKTsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGluc3RhbGxVcmwsIGljb25QYXRoKTsKLQkJCWlzID0gdXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhKGlzKTsKLQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKG51bGwsIHNvdXJjZSwgbWFzayk7Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpcyAhPSBudWxsKSBpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVXZWJCcm93c2VyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVdlYkJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDQ5ODgxMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVdlYkJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotCi0vKioKLSAqIFdyYXBwZXIgZm9yIGFuIE9sZUF1dG9tYXRpb24gb2JqZWN0IHVzZWQgdG8gc2VuZCBjb21tYW5kcwotICogdG8gYSBXaW4zMiAiU2hlbGwuRXhwbG9yZXIiIE9MRSBjb250cm9sLgotICogCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBtYW5hZ2UgdGhlIHNldHVwLCB0eXBpY2FsIHVzZSBhbmQgdGVhcmRvd24gb2YKLSAqIGEgc2ltcGxlIHdlYiBicm93c2VyLgotICovCi1jbGFzcyBPbGVXZWJCcm93c2VyIHsKLQkvKiBTZWUgdGhlIFdpbmRvd3MgUGxhdGZvcm0gU0RLIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICogT0xFIGNvbnRyb2wgdXNlZCBoZXJlIGFuZCBpdHMgdXNhZ2UuCi0JICovCi0JLy8gR2VuZXJhdGVkIGZyb20gdHlwZWxpYiBmaWxlbmFtZTogc2hkb2N2dy5kbGwKLQotCS8vIENvbnN0YW50cyBmb3IgV2ViQnJvd3NlciBDb21tYW5kU3RhdGVDaGFuZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDU0NfVVBEQVRFQ09NTUFORFMgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDU0NfTkFWSUdBVEVGT1JXQVJEID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDU0NfTkFWSUdBVEVCQUNLID0gMjsKLQotCS8vIENPbnN0YW50cyBmb3IgV2ViIEJyb3dzZXIgUmVhZHlTdGF0ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfVU5JTklUSUFMSVpFRCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9MT0FESU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0xPQURFRCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9JTlRFUkFDVElWRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9DT01QTEVURSA9IDQ7Ci0JCi0JLy8gV2ViIEJyb3dzZXIgQ29udHJvbCBFdmVudHMgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQmVmb3JlTmF2aWdhdGUgICAgICAgID0gMTAwOyAvLyBGaXJlZCB3aGVuIGEgbmV3IGh5cGVybGluayBpcyBiZWluZyBuYXZpZ2F0ZWQgdG8uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTmF2aWdhdGVDb21wbGV0ZSAgICAgID0gMTAxOyAvLyBGaXJlZCB3aGVuIHRoZSBkb2N1bWVudCBiZWluZyBuYXZpZ2F0ZWQgdG8gYmVjb21lcyB2aXNpYmxlIGFuZCBlbnRlcnMgdGhlIG5hdmlnYXRpb24gc3RhY2suCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3RhdHVzVGV4dENoYW5nZSAgICAgID0gMTAyOyAvLyBTdGF0dXNiYXIgdGV4dCBjaGFuZ2VkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQ2hhbmdlICAgICAgICA9IDEwODsgLy8gRmlyZWQgd2hlbiBkb3dubG9hZCBwcm9ncmVzcyBpcyB1cGRhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERvd25sb2FkQ29tcGxldGUgICAgICA9IDEwNDsgLy8gRG93bmxvYWQgb2YgcGFnZSBjb21wbGV0ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDb21tYW5kU3RhdGVDaGFuZ2UgICAgPSAxMDU7IC8vIFRoZSBlbmFibGVkIHN0YXRlIG9mIGEgY29tbWFuZCBjaGFuZ2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG93bmxvYWRCZWdpbiAgICAgICAgID0gMTA2OyAvLyBEb3dubG9hZCBvZiBhIHBhZ2Ugc3RhcnRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOZXdXaW5kb3cgICAgICAgICAgICAgPSAxMDc7IC8vIEZpcmVkIHdoZW4gYSBuZXcgd2luZG93IHNob3VsZCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRpdGxlQ2hhbmdlICAgICAgICAgICA9IDExMzsgLy8gRG9jdW1lbnQgdGl0bGUgY2hhbmdlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZUJlZm9yZU5hdmlnYXRlICAgPSAyMDA7IC8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0byBpbiBhIGZyYW1lLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lTmF2aWdhdGVDb21wbGV0ZSA9IDIwMTsgLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvIGluIGEgZnJhbWUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVOZXdXaW5kb3cgICAgICAgID0gMjA0OyAvLyBGaXJlZCB3aGVuIGEgbmV3IHdpbmRvdyBzaG91bGQgYmUgY3JlYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRdWl0ICAgICAgICAgICAgICAgICAgPSAxMDM7IC8vIEZpcmVkIHdoZW4gYXBwbGljYXRpb24gaXMgcXVpdGluZy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dNb3ZlICAgICAgICAgICAgPSAxMDk7IC8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIG1vdmVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd1Jlc2l6ZSAgICAgICAgICA9IDExMDsgLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gc2l6ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QWN0aXZhdGUgICAgICAgID0gMTExOyAvLyBGaXJlZCB3aGVuIHdpbmRvdyBoYXMgYmVlbiBhY3RpdmF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvcGVydHlDaGFuZ2UgICAgICAgID0gMTEyOyAvLyBGaXJlZCB3aGVuIHRoZSBQdXRQcm9wZXJ0eSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotCi0JLy8gV2ViIEJyb3dzZXIgcHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BJRF9SRUFEWVNUQVRFID0gLTUyNTsKLQotCXByaXZhdGUgT2xlQXV0b21hdGlvbiAgb2xlQXV0b21hdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBXZWIgYnJvd3NlciBjb250cm9sLgotCSAqIDxwPgotCSAqIFR5cGljYWwgdXNlOjxicj4KLQkgKiA8Y29kZT4KLQkgKiBPbGVDb250cm9sU2l0ZSBvbGVDb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShvbGVGcmFtZSwgc3R5bGUsICJTaGVsbC5FeHBsb3JlciIpOzxicj4KLQkgKiBPbGVBdXRvbWF0aW9uIG9sZUF1dG9tYXRpb24gPSBuZXcgT2xlQXV0b21hdGlvbihvbGVDb250cm9sU2l0ZSk7PGJyPgotCSAqIE9sZVdlYkJyb3dzZXIgd2ViQnJvd3NlciA9IG5ldyBPbGVXZWJCcm93c2VyKG9sZUNvbnRyb2xTaXRlLCBvbGVBdXRvbWF0aW9uKTs8YnI+Ci0JICogPC9jb2RlPgotCSAqIAotICAgICAqIEBwYXJhbSBvbGVBdXRvbWF0aW9uIHRoZSBPbGVBdXRvbWF0aW9uIG9iamVjdCBmb3IgdGhpcyBjb250cm9sLgotICAgICAqIEBwYXJhbSBvbGVDb250cm9sU2l0ZSB0aGUgT2xlQ29udHJvbFNpdGUgb2JqZWN0IGZvciB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIE9sZVdlYkJyb3dzZXIoT2xlQXV0b21hdGlvbiBvbGVBdXRvbWF0aW9uKSB7Ci0JCXRoaXMub2xlQXV0b21hdGlvbiA9IG9sZUF1dG9tYXRpb247Ci0JfQotCQotCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoZSBXZWIgYnJvd3NlciBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChvbGVBdXRvbWF0aW9uICE9IG51bGwpIG9sZUF1dG9tYXRpb24uZGlzcG9zZSgpOwotCQlvbGVBdXRvbWF0aW9uID0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBJbnRlcmFjdCB3aXRoIHRoZSBDb250cm9sIHZpYSBPTEUgQXV0b21hdGlvbgotCSAqIAotCSAqIE5vdGU6IFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSURzIGlmIHlvdSBrbm93IHRoZW0gYmVmb3JlaGFuZAotCSAqICAgICAgIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheSwgYnV0IHlvdSBpbmNyZWFzZSBjb3VwbGluZwotCSAqICAgICAgIHRvIHRoZSBjb250cm9sLgotCSAqLwotCSAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHdlYiBwYWdlIHRpdGxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgd2ViIHBhZ2UgdGl0bGUgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbk5hbWUoKSB7Ci0JCS8vIGRpc3BpZD0yMTAsIHR5cGU9UFJPUEdFVCwgbmFtZT0iTG9jYXRpb25OYW1lIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkxvY2F0aW9uTmFtZSJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlQXV0b21hdGlvbi5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpICE9IE9MRS5WVF9CU1RSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0U3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgVVJMLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgVVJMIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkwoKSB7Ci0JCS8vIGRpc3BpZD0yMTEsIHR5cGU9UFJPUEdFVCwgbmFtZT0iTG9jYXRpb25VUkwiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTG9jYXRpb25VUkwifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCQotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVBdXRvbWF0aW9uLmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0JTVFIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb250cm9sLCBvbmUgb2Y6Ci0JICogICAgICAgICBSRUFEWVNUQVRFX1VOSU5JVElBTElaRUQ7Ci0JICogICAgICAgICBSRUFEWVNUQVRFX0xPQURJTkc7Ci0JICogICAgICAgICBSRUFEWVNUQVRFX0xPQURFRDsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfSU5URVJBQ1RJVkU7Ci0JICogICAgICAgICBSRUFEWVNUQVRFX0NPTVBMRVRFLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVhZHlTdGF0ZSgpIHsKLQkJLy8gZGlzcGlkPTQyOTQ5NjY3NzEsIHR5cGU9UFJPUEdFVCwgbmFtZT0iUmVhZHlTdGF0ZSIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJSZWFkeVN0YXRlIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQkKLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlQXV0b21hdGlvbi5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpICE9IE9MRS5WVF9JNCkgcmV0dXJuIC0xOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIGJhY2t3YXJkcyB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgR29CYWNrKCkgewotCQotCQkvLyBkaXNwaWQ9MTAwLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29CYWNrIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkdvQmFjayJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIGJhY2t3YXJkcyB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgR29Gb3J3YXJkKCkgewotCQotCQkvLyBkaXNwaWQ9MTAxLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29Gb3J3YXJkIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkdvRm9yd2FyZCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIHRvIGhvbWUgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBHb0hvbWUoKSB7Ci0JCS8vIGRpc3BpZD0xMDIsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb0hvbWUiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29Ib21lIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgdG8gdXNlci1zcGVjaWZpZWQgV2ViIHNlYXJjaCBnYXRld2F5LgotCSAqLwotCXB1YmxpYyB2b2lkIEdvU2VhcmNoKCkgewotCQkvLyBkaXNwaWQ9MTAzLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29TZWFyY2giCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29TZWFyY2gifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQotCQotCS8qKgotCSAqIE5hdmlnYXRlcyB0byBhIHBhcnRpY3VsYXIgVVJMLgotCSAqLwotCXB1YmxpYyB2b2lkIE5hdmlnYXRlKFN0cmluZyB1cmwpIHsKLQkJLy8gZGlzcGlkPTEwNCwgdHlwZT1NRVRIT0QsIG5hbWU9Ik5hdmlnYXRlIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJCi0JCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFsxXTsKLQkJcmd2YXJnWzBdID0gbmV3IFZhcmlhbnQodXJsKTsKLQkJaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50WzFdOwotCQlyZ2Rpc3BpZE5hbWVkQXJnc1swXSA9IHJnZGlzcGlkWzFdOyAvLyBpZGVudGlmaWVyIG9mIGFyZ3VtZW50Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlciwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0JfQotCQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgY3VycmVudGx5IHZpZXdlZCBwYWdlLgotCSAqCi0JICogQHJldHVybiB0aGUgcGxhdGZvcm0tZGVmaW5lZCByZXN1bHQgY29kZSBmb3IgdGhlICJSZWZyZXNoIiBtZXRob2QgaW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIFJlZnJlc2goKXsKLQkJLy8gZGlzcGlkPSA0Mjk0OTY2NzQ2LCB0eXBlPU1FVEhPRCwgbmFtZT0iUmVmcmVzaCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJSZWZyZXNoIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZU5vUmVwbHkoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQWJvcnRzIGxvYWRpbmcgb2YgdGhlIGN1cnJuZXQgcGFnZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBsYXRmb3JtLWRlZmluZWQgcmVzdWx0IGNvZGUgZm9yIHRoZSAiU3RvcCIgbWV0aG9kIGludm9jYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBTdG9wKCkgewotCQkvLyBkaXNwaWQ9MTA2LCB0eXBlPU1FVEhPRCwgbmFtZT0iU3RvcCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJTdG9wIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzOWFmMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzcxY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjEzOjQ1IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmMGFlMGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS5wYWludC5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0OGU3Y2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gUGFpbnQgVG9vbDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gUGFpbnQgVG9vbDwvaDI+Ci0KLTxwPgkKLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBTV1QgZ3JhcGhpY3Mgb3BlcmF0aW9ucyBpbiB0aGUgZm9ybSBvZiBhCi1ydWRpbWVudGFyeSBiaXRtYXAgcGFpbnRpbmcgcHJvZ3JhbS4gIFRoZSBQYWludCBUb29sIGltcGxlbWVudGF0aW9uIGFsc28gCi1kZW1vbnN0cmF0ZXMgYSBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIHRpbWVkIEdVSSBvcGVyYXRpb25zIGluIHRoZSBiYWNrZ3JvdW5kIAotdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IHVzZXIgaW5wdXQuCi08L3A+Ci08cD4JCi1TZWxlY3QgYSB0b29sIHdpdGggd2hpY2ggdG8gZHJhdyBpbiB0aGUgZHJhd2luZyBhcmVhLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRvb2xzCi10byBjaG9vc2UgZnJvbSBvbiB0aGUgdG9vbGJhci4gIFRvIGNoYW5nZSB0aGUgY29sb3Igc2VsZWN0aW9uLCBjbGljayBvbiBhIGNvbG9yIGluIHRoZQotcGFsZXR0ZSBiZWxvdyB0aGUgZHJhd2luZyBhcmVhOyBsZWZ0LWNsaWNrIHRvIHNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciwgcmlnaHQtY2xpY2sgdG8gc2V0IHRoZQotYmFja2dyb3VuZCBjb2xvci4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZyb20gRWNsaXBzZSdzIDxzdHJvbmc+V2luZG93PC9zdHJvbmc+IG1lbnUgc2VsZWN0IDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+ICZndDsgPHN0cm9uZz5PdGhlcjwvc3Ryb25nPi4gIAotSW4gdGhlIDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+IGRpYWxvZywgZXhwYW5kIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGFuZCBzZWxlY3QKLXRoZSB2aWV3IG5hbWVkIDxzdHJvbmc+UGFpbnQ8L3N0cm9uZz4uIEEgdmlldyBjb250YWluaW5nIHRoZSBwYWludCBwcm9ncmFtIHdpbGwgYXBwZWFyLgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPlBhaW50PC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5NDVkZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2ljb25zL3BhaW50X2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDc4NzU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUUGFpbnRFeGFtcGxlLm5hbWUgPSBTV1QgUGFpbnQgRXhhbXBsZSBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuUGFpbnRFeGFtcGxlLm5hbWUgPSBQYWludAotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLlBhaW50RXhhbXBsZS5uYW1lID0gUGFpbnQKLWxhdW5jaGl0ZW0uUGFpbnRFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBTV1QgZ3JhcGhpY3Mgb3BlcmF0aW9ucyBpbiB0aGUgZm9ybSBvZiBhIFwKLQlydWRpbWVudGFyeSBiaXRtYXAgcGFpbnRpbmcgcHJvZ3JhbS4gIFRoZSBBaXJicnVzaCBUb29sIGltcGxlbWVudGF0aW9uIGFsc28gXAotCWRlbW9uc3RyYXRlcyBhIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgdGltZWQgR1VJIG9wZXJhdGlvbnMgaW4gdGhlIGJhY2tncm91bmQgXAotCXRoYXQgYXJlIHRyaWdnZXJlZCBieSB1c2VyIGlucHV0LlxuXG5cCi0JU2VsZWN0IGEgdG9vbCB3aXRoIHdoaWNoIHRvIGRyYXcgaW4gdGhlIGRyYXdpbmcgYXJlYS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0b29scyBcCi0JdG8gY2hvb3NlIGZyb20gb24gdGhlIHRvb2xiYXIuICBUbyBjaGFuZ2UgdGhlIGNvbG9yIHNlbGVjdGlvbiwgY2xpY2sgb24gYSBjb2xvciBpbiB0aGUgXAotCXBhbGV0dGUgYmVsb3cgdGhlIGRyYXdpbmcgYXJlYTogbGVmdC1jbGljayBmb3IgdGhlIGZvcmVncm91bmQgY29sb3IsIHJpZ2h0LWNsaWNrIGZvciB0aGUgXAotCWJhY2tncm91bmQgY29sb3IuXG5cblwKLQlVc2VzIFNXVCdzIEdDIGFuZCBGb250RGlhbG9nLCBhbmQgSkZhY2UncyBJbnB1dERpYWxvZyBhbmQgYWN0aW9uIHNldCBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdiOTZiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50IgotICAgbmFtZT0iJXBsdWdpbi5TV1RQYWludEV4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQuUGFpbnRQbHVnaW4iPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InBhaW50LmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LlBhaW50RXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC5QYWludFZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LnZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLlBhaW50RXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uUGFpbnRFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50UGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTQzN2ZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFBhaW50UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgUGFpbnRQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyB0aGUgUGFpbnQgcGx1Z2luLgotCSAqLwotCXB1YmxpYyBQYWludFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0Ci0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcGx1Z2luLmdldExvZygpLmxvZygKLQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTI1MGY0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiBUaGUgdmlldyBmb3IgdGhlIHBhaW50IGFwcGxpY2F0aW9uLgotICogQWxsIHJlbmRlcmluZyBoYXBwZW5zIGluc2lkZSB0aGUgYXJlYSBjcmVhdGVkIGJ5IGNyZWF0ZVBhcnRDb250cm9sKCkuCi0gKiAKLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIFBhaW50VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlQYWludEV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBhaW50IHZpZXcuCi0JICovCi0JcHVibGljIFBhaW50VmlldygpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlLgotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluc3RhbmNlID0gbmV3IFBhaW50RXhhbXBsZShwYXJlbnQpOwotCQlpbnN0YW5jZS5jcmVhdGVHVUkocGFyZW50KTsKLQotCQkvKioqIEFkZCB0b29sYmFyIGNvbnRyaWJ1dGlvbnMgKioqLwotCQlmaW5hbCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCUlUb29sQmFyTWFuYWdlciB0b29sYmFyTWFuYWdlciA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJVG9vbCB0b29sc1tdID0gUGFpbnRFeGFtcGxlLnRvb2xzOwotCQlTdHJpbmcgZ3JvdXAgPSB0b29sc1swXS5ncm91cDsKLQkJdG9vbGJhck1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihncm91cCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUb29sIHRvb2wgPSB0b29sc1tpXTsKLQkJCWlmICghdG9vbC5ncm91cC5lcXVhbHMoZ3JvdXApKSB7Ci0JCQkJdG9vbGJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJdG9vbGJhck1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcih0b29sLmdyb3VwKSk7Ci0JCQl9Ci0JCQlncm91cCA9IHRvb2wuZ3JvdXA7Ci0JCQlQYWludEFjdGlvbiBhY3Rpb24gPSBuZXcgUGFpbnRBY3Rpb24odG9vbCk7Ci0JCQl0b29sYmFyTWFuYWdlci5hcHBlbmRUb0dyb3VwKGdyb3VwLCBhY3Rpb24pOwotCQkJaWYgKGkgPT0gUGFpbnRFeGFtcGxlLkRlZmF1bHRfdG9vbCB8fCBpID09IFBhaW50RXhhbXBsZS5EZWZhdWx0X2ZpbGwgfHwgaSA9PSBQYWludEV4YW1wbGUuRGVmYXVsdF9saW5lc3R5bGUpIHsKLQkJCQlhY3Rpb24uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCX0KLQkJfQotCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQotCQlpbnN0YW5jZS5zZXREZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIERpc3BsYXkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGlzcGxheSB3ZSdyZSB1c2luZwotCSAqLwotCXB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBpbnN0YW5jZS5nZXREaXNwbGF5KCk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2Uuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3Rpb24gc2V0IGdsdWUuCi0JICovCi0JY2xhc3MgUGFpbnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcml2YXRlIGludCBzdHlsZTsKLQkJcHJpdmF0ZSBSdW5uYWJsZSBhY3Rpb247Ci0JCXB1YmxpYyBQYWludEFjdGlvbihUb29sIHRvb2wpIHsKLQkJCXN1cGVyKCk7Ci0JCQlTdHJpbmcgaWQgPSB0b29sLmdyb3VwICsgJy4nICsgdG9vbC5uYW1lOwotCQkJc2V0SWQoaWQpOwotCQkJc3R5bGUgPSB0b29sLnR5cGUgPT0gU1dULlJBRElPID8gSUFjdGlvbi5BU19SQURJT19CVVRUT04gOiBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OOwotCQkJYWN0aW9uID0gdG9vbC5hY3Rpb247Ci0JCQlzZXRUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpZCArICIubGFiZWwiKSk7Ci0JCQlzZXRUb29sVGlwVGV4dChQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLnRvb2x0aXAiKSk7Ci0JCQlzZXREZXNjcmlwdGlvbihQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmRlc2NyaXB0aW9uIikpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZSgKLQkJCQkJUGFpbnRFeGFtcGxlLmNsYXNzLAotCQkJCQlQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmltYWdlIikpKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldFN0eWxlKCkgeyByZXR1cm4gc3R5bGU7IH0KLQkJcHVibGljIHZvaWQgcnVuKCkgeyBhY3Rpb24ucnVuKCk7IH0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzcyNTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTU3NTcxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNDozMTozNyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4MjY3Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNXZWQgTWF5IDAyIDE0OjI3OjIwIENFU1QgMjAwNwotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCi1jb21waWxlcnMucC5idWlsZD0xCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MgotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4NGQ5MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHN3dGV4YW1wbGVzLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBzcmMvCi0gICAgICAgICAgICAgICAKLXNvdXJjZS5zd3RleGFtcGxlcy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2FkZHJlc3Nib29rX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2FkZHJlc3Nib29rX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMDRjMmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9hZGRyZXNzYm9va19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQWRkcmVzcyBCb29rIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gQWRkcmVzcyBCb29rPC9oMj4KLQotPHA+Ci1UaGUgQWRkcmVzc0Jvb2sgZXhhbXBsZSBzaG93cyBob3cgYSBUYWJsZSBjb250cm9sIGNhbiBiZSB1c2VkIHRvCi1wcmVzZW50IGluZm9ybWF0aW9uIGluIGEgdGFidWxhciBmb3JtYXQuIFRoZSBhcHBsaWNhdGlvbiBjYW4gc2F2ZSBhbmQgbG9hZCBkYXRhIAotZnJvbSBhIGZpbGUsIHNvcnQgdGhlIGVudHJpZXMsIGFuZCBzZWFyY2ggZm9yIHN0cmluZ3Mgd2l0aGluIHRoZSBmaWVsZHMuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2s8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+QWRkcmVzcyBCb29rPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9icm93c2VyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5M2EzOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBCcm93c2VyPC9oMj4KLQotPHA+Ci1UaGUgQnJvd3NlciBFeGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4gCi1JdCBjb25zaXN0cyBvZiBhIGNvbXBvc2l0ZSBjb250YWluaW5nIGEgQnJvd3NlciB3aWRnZXQgdG8gcmVuZGVyIEhUTUwgYW5kIHNvbWUKLWFkZGl0aW9uYWwgd2lkZ2V0cyB0byBpbXBsZW1lbnQgYWN0aW9ucyBjb21tb25seSBmb3VuZCBvbiBicm93c2VycyAodG9vbGJhcgotd2l0aCBiYWNrLCBmb3J3YXJkLCByZWZyZXNoIGFuZCBzdG9wIGJ1dHRvbnMsIHN0YXR1cyBiYXIgZXRjLikuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlckV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+V2ViIEJyb3dzZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY2xpcGJvYXJkX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2NsaXBib2FyZF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmJlOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY2xpcGJvYXJkX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBDbGlwYm9hcmQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBzdGFuZGFsb25lIGV4YW1wbGUgLSBDbGlwYm9hcmQ8L2gyPgotCi08cD4KLVRoZSBDbGlwYm9hcmQgZXhhbXBsZSBzaG93cyB0aGUgdmFyaW91cyBTV1QgY2xpcGJvYXJkIHRyYW5zZmVyIHR5cGVzIGluIHVzZS4gIFRoZSBleGFtcGxlIGNhbgotY3V0LCBjb3B5IGFuZCBwYXN0ZSB1c2luZyBUZXh0LCBSVEYsIEhUTUwgYW5kIEZpbGUgdHJhbnNmZXIgdHlwZXMuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkLkNsaXBib2FyZEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q2xpcGJvYXJkPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJlNzhkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY29udHJvbHNfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBDb250cm9sczwvaDI+Ci0KLTxwPgotVGhlIENvbnRyb2xzIEV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGNvbnRyb2xzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciAKLXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgY29udHJvbC4KLVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIGVhY2ggY29udHJvbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZS5Db250cm9sRXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5Db250cm9sczwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVmMjk4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBDdXN0b20gQ29udHJvbHM8L2gyPgotCi08cD4KLVRoZSBDdXN0b20gQ29udHJvbHMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGVtdWxhdGVkIFNXVCBjb250cm9scy4gCi1JdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgaW4gdGhlIGZvbGRlciBhbGxvd3MgdGhlIHVzZXIgCi10byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IGVtdWxhdGVkIGNvbnRyb2wuCi1UaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyBlYWNoIGNvbnRyb2wuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSJzd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuQ3VzdG9tQ29udHJvbEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+Q3VzdG9tIENvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2RuZF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9kbmRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxYWE1Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2RuZF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gRHJhZyBhbmQgRHJvcCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIERyYWcgYW5kIERyb3A8L2gyPgotCi08cD4KLVRoZSBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc2hvd3MgdGhlIHZhcmlvdXMgU1dUIGRhdGEgdHJhbnNmZXIgdHlwZXMgaW4gdXNlLiAgVGhlIGV4YW1wbGUgY2FuCi1kcmFnIGFuZCBkcm9wIHVzaW5nIFRleHQsIFJURiwgSFRNTCBhbmQgRmlsZSB0cmFuc2ZlciB0eXBlcy4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQuRE5ERXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5EcmFnIGFuZCBEcm9wPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9maWxldmlld2VyX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ZpbGV2aWV3ZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyMWNjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ZpbGV2aWV3ZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIEZpbGUgVmlld2VyIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gRmlsZSBWaWV3ZXI8L2gyPgotCi08cD4KLVRoZSBGaWxlIFZpZXdlciBleGFtcGxlIHNob3dzIGhvdyBhIHNpbXBsZSBhcHBsaWNhdGlvbiBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcgU1dULgotVGhpcyBhcHBsaWNhdGlvbiBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBuYXZpZ2F0ZSBmaWxlcyBhbmQgZm9sZGVycyBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gYW5kIG1hbmlwdWxhdGUgdGhlbSB1c2luZyBkcmFnIGFuZCBkcm9wLgotSXQgdXNlcyBhbHRlcm5hdGUgdGhyZWFkcyBmb3IgbG9uZyBhY3Rpb25zIGFuZCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgVHJlZSwKLVRhYmxlLCBhbmQgVG9vbGJhciB3aWRnZXRzIGFuZCB0aGUgUHJvZ3JhbSBjbGFzcy4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5maWxldmlld2VyLkZpbGVWaWV3ZXI8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+RmlsZSBWaWV3ZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hlbGxvd29ybGRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaGVsbG93b3JsZF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2N2VjN2E0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaGVsbG93b3JsZF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSGVsbG8gV29ybGQgRXhhbXBsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gSGVsbG8gV29ybGQ8L2gyPgotCi08cD4KLVRoZSBIZWxsbyBXb3JsZCBleGFtcGxlcyBhcmUgYSBzZXQgb2YgaW50cm9kdWN0b3J5IGV4YW1wbGVzIHRoYXQgc2hvdyBob3cgdG8gZ2V0IHN0YXJ0ZWQgCi1vbiBjcmVhdGluZyBhbiBhcHBsaWNhdGlvbiB3aXRoIFNXVC4gIFRoZXkgY292ZXIgdGhlIGNyZWF0aW9uIG9mIGEgc2hlbGwsIHRoZSB1c2Ugb2YgZXZlbnQgbGlzdGVuZXJzLCAKLXVzaW5nIGxheW91dHMsIHByb2Nlc3NpbmcgZXZlbnRzIGluIGFuIGV2ZW50IGxvb3AsIGFuZCBkcmF3aW5nIHdpdGggYSBHcmFwaGljcyBDb250ZXh0LgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgMTwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIG9wZW4gYSBTaGVsbCBhbmQgcHJvY2VzcyB0aGUgZXZlbnRzLgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgMjwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gZGlzcGxheSBhIExhYmVsIGluc2lkZSBvZiB0aGUgU2hlbGwuCi08L3A+Ci0KLTxoND5IZWxsbyBXb3JsZCAzPC9oND4KLTxwPgotVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMiBhbmQgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgYSBsaXN0ZW5lciBtZWNoYW5pc20gdG8gcmVzaXplIHRoZSBMYWJlbAotd2hlbiB0aGUgU2hlbGwgc2l6ZSBjaGFuZ2VzLgotPC9wPgotCi08aDQ+SGVsbG8gV29ybGQgNDwvaDQ+Ci08cD4KLVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDIgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGEgTGF5b3V0IHRvIHJlc2l6ZSB0aGUgTGFiZWwKLXdoZW4gdGhlIFNoZWxsIHNpemUgY2hhbmdlcy4KLTwvcD4KLQotPGg0PkhlbGxvIFdvcmxkIDU8L2g0PgotPHA+Ci1UaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRyYXcgZGlyZWN0bHkKLW9uIGFuIFNXVCBDb250cm9sIHVzaW5nIGEgR3JhcGhpY3MgQ29udGV4dC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZFsxLTVdPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IG9uZSBvZiB0aGUgPHN0cm9uZz5IZWxsbyBXb3JsZDwvc3Ryb25nPiBpdGVtcyBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hvdmVyaGVscF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9ob3ZlcmhlbHBfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2ViODliMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2hvdmVyaGVscF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSG92ZXIgSGVscCBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIEhvdmVyIEhlbHA8L2gyPgotCi08cD4KLVRoZSBIb3ZlciBIZWxwIGV4YW1wbGUgc2hvd3MgaG93IHRvIGltcGxlbWVudCBjdXN0b20gdG9vbHRpcHMgYW5kIGhvdmVyIGhlbHAgc3VwcG9ydAotb24gdmFyaW91cyBTV1QgY29udHJvbHMgaW5jbHVkaW5nIEJ1dHRvbnMsIFRhYmxlSXRlbXMsIFRvb2xJdGVtcyBhbmQgVHJlZUl0ZW1zLgotVG8gc2VlIHRoZSBjdXN0b20gdG9vbHRpcHMgaW4gYWN0aW9uLCBob3ZlciBvdmVyIGFuIGl0ZW0gb3IgYnV0dG9uIGluIHRoZSBVSSwgYW5kCi1ub3RpY2UgdGhhdCBpbWFnZXMgYXBwZWFyIGluIHRoZSBsZWZ0LWhhbmQgY29ybmVyIG9mIHRoZSB0b29sdGlwLgotVG8gc2VlIHRoZSBjdXN0b20gaG92ZXIgaGVscCBpbiBhY3Rpb24sIGhvdmVyIG92ZXIgYW4gaXRlbSBvciBidXR0b24gaW4gdGhlIFVJIHVudGlsCi10aGUgdG9vbHRpcCBpcyBkaXNwbGF5ZWQuICBUaGVuLCB3aXRob3V0IG1vdmluZyB0aGUgbW91c2UsIHByZXNzIDxzdHJvbmc+RjE8L3N0cm9uZz4gYW5kIGEgbmV3Ci1TaGVsbCB3aWxsIGJlIHNob3duIHdpdGggdGhlIGV4dGVuZGVkIGhvdmVyIGhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBVSSBlbGVtZW50LgotPC9wPgkKLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ob3ZlcmhlbHAuSG92ZXJIZWxwPC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0ic3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkhvdmVyIEhlbHA8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2ltYWdlYW5hbHl6ZXJfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaW1hZ2VhbmFseXplcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTg0Y2RhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfaW1hZ2VhbmFseXplcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSW1hZ2UgQW5hbHl6ZXIgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBzdGFuZGFsb25lIGV4YW1wbGUgLSBJbWFnZSBBbmFseXplcjwvaDI+Ci0KLTxwPgotVGhlIEltYWdlQW5hbHl6ZXIgZXhhbXBsZSBvcGVucyBpbWFnZSBmaWxlcyBhbmQgZGlzcGxheXMgdGhlaXIgdmlzdWFsIGNvbnRlbnRzIGFuZAotYW4gaW1hZ2UgZGF0YSBzdW1tYXJ5LgotVGhlIHVzZXIgY2FuIG1ha2UgYWRqdXN0bWVudHMgdG8gdmFyaW91cyBlbGVtZW50cyBvZiB0aGUgaW1hZ2Ugc3VjaCBhcyBzY2FsaW5nIGFuZCBBbHBoYQotYmxlbmRpbmcsIGFuZCBjYW4gc2F2ZSB0aGVzZSBjaGFuZ2VzIHRvIGEgZmlsZS4KLTwvcD4KLTxwPgotVGhlIEltYWdlQW5hbHl6ZXIgY2FuIGxvYWQgYW5kIGRpc3BsYXkgaW1hZ2UgZmlsZXMgb2YgdHlwZSBHSUYsIEpQRUcsIEJNUCwgSUNPLCBhbmQgUE5HLgotSWYgYSBsb2FkZWQgZmlsZSBpcyBhbiBpbnRlcmxhY2VkIEdJRiBvciBQTkcsIG9yIGEgcHJvZ3Jlc3NpdmUgSlBFRywgYW5kIDxzdHJvbmc+SW5jcmVtZW50YWwgRGlzcGxheTwvc3Ryb25nPiBpcyBzZWxlY3RlZCwKLXRoZW4gdGhlIEltYWdlQW5hbHl6ZXIgd2lsbCBkaXNwbGF5IHRoZSBpbWFnZSBpbmNyZW1lbnRzIGFzIHRoZXkgYXJlIGxvYWRlZC4KLUlmIHRoZSBmaWxlIGNvbnRhaW5zIGFuIGFuaW1hdGVkIEdJRiwgdGhlbiB0aGUgPHN0cm9uZz5OZXh0PC9zdHJvbmc+LCA8c3Ryb25nPlByZXZpb3VzPC9zdHJvbmc+LCBhbmQgPHN0cm9uZz5BbmltYXRlPC9zdHJvbmc+IGJ1dHRvbnMgYmVjb21lIGVuYWJsZWQsCi1hbmQgY2FuIGJlIHVzZWQgdG8gY3ljbGUgdGhyb3VnaCBhbmQgYW5pbWF0ZSB0aGUgaW1hZ2VzIGluIHRoZSBmaWxlLiBJZiBhIEdJRiBkZWZpbmVzIGEgYmFja2dyb3VuZCBjb2xvciwKLWFzIG1hbnkgYW5pbWF0ZWQgR0lGcyBkbywgdGhlbiBzZWxlY3RpbmcgPHN0cm9uZz5CYWNrZ3JvdW5kPC9zdHJvbmc+IHdpbGwgdXNlIHRoZSBHSUYncyBiYWNrZ3JvdW5kIGNvbG9yLgotSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3ksIHdoaWNoIGlzIHBvc3NpYmxlIHdpdGggaW1hZ2VzIG9mIHR5cGUgR0lGLCBQTkcsIGFuZCBJQ08sIHRoZW4gc2VsZWN0aW5nIDxzdHJvbmc+RGlzcGxheSBNYXNrPC9zdHJvbmc+IHdpbGwgZHJhdyB0aGUgaW1hZ2UncyB0cmFuc3BhcmVuY3kKLW1hc2sgdG8gdGhlIHJpZ2h0IG9mIHRoZSBpbWFnZS4gWW91IGNhbiBjaGFuZ2UgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIEltYWdlQW5hbHl6ZXIgaW4gb3JkZXIgdG8gc2VlIHRoZSB0cmFuc3BhcmVuY3kgd29yay4KLVRvIHR1cm4gb2ZmIHRyYW5zcGFyZW5jeSwgZGVzZWxlY3QgPHN0cm9uZz5EaXNwbGF5IFRyYW5zcGFyZW5jeTwvc3Ryb25nPi4KLUFmdGVyIGFuIGltYWdlIGlzIGxvYWRlZCwgaXQgY2FuIGJlIHNjYWxlZCB3aXRoIHRoZSA8c3Ryb25nPlNjYWxlPC9zdHJvbmc+IGNvbWJvLCBvciBoYXZlIGFscGhhIHRyYW5zcGFyZW5jeSBhcHBsaWVkIHRvIGl0IHVzaW5nIHRoZSA8c3Ryb25nPkFscGhhLUs8L3N0cm9uZz4gY29tYm8KLWFuZCA8c3Ryb25nPkFscGhhPC9zdHJvbmc+IG1lbnUuIDxzdHJvbmc+RmlsZTwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+UmVvcGVuPC9zdHJvbmc+IHJlc3RvcmVzIHRoZSBzY2FsaW5nIGFuZCBhbHBoYSBhdHRyaWJ1dGVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFuZCByZWxvYWRzIHRoZSBjdXJyZW50IGltYWdlIGZpbGUuCi1JZiB0aGUgaW1hZ2UgaGFzIHRyYW5zcGFyZW5jeSwKLTxzdHJvbmc+RmlsZTwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+U2F2ZSBNYXNrIEFzLi4uPC9zdHJvbmc+IGNhbiBiZSB1c2VkIHRvIHNhdmUgdGhlIGltYWdlJ3MgdHJhbnNwYXJlbmN5IG1hc2suCi08L3A+Ci08cD4KLVdoZW4gU1dUIGxvYWRzIGFuIGltYWdlIGZpbGUsIGFuIGluc3RhbmNlIG9mIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE8L2NvZGU+IGlzIGNyZWF0ZWQgKHRob3VnaCBpbiB0aGUgY2FzZSBvZiBhbiBJQ08gZmlsZSBvcgotbXVsdGktaW1hZ2UgR0lGIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gaW5zdGFuY2VzIGlzIGNyZWF0ZWQpLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyBhbGwgb2YgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSA8Y29kZT5JbWFnZURhdGE8L2NvZGU+Ci1pbnN0YW5jZShzKSBmb3IgdGhlIGN1cnJlbnRseSBsb2FkZWQgaW1hZ2UgZmlsZSwgaW5jbHVkaW5nIHRoZSBwaXhlbCBkYXRhLiBIb3ZlcmluZyBvdmVyIGEgcGl4ZWwgaW4gdGhlIGltYWdlIGRpc3BsYXkgd2lsbCBzaG93IHRoZSBSR0IKLWNvbG9yIGRhdGEgZm9yIHRoYXQgcGl4ZWwuIEZvciBjZXJ0YWluIGltYWdlcywgcGFydGljdWxhcmx5IGFuaW1hdGVkIEdJRnMsIGFkZGl0aW9uYWwgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlcjwvY29kZT4KLWluc3RhbmNlIHRoYXQgaXMgdXNlZCB0byBsb2FkIHRoZSBpbWFnZS4gVGhlIEltYWdlQW5hbHl6ZXIgZGlzcGxheXMgdGhpcyBkYXRhIGFzIHdlbGwuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLQotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5pbWFnZWFuYWx5emVyLkltYWdlQW5hbHl6ZXI8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+SW1hZ2UgQW5hbHl6ZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2phdmF2aWV3ZXJfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfamF2YXZpZXdlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZDFlNzczLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfamF2YXZpZXdlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gSmF2YSBTeW50YXggVmlld2VyIEV4YW1wbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlIC0gSmF2YSBTeW50YXggVmlld2VyPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGltcGxlbWVudCBhIHVzZXItZGVmaW5lZCBsaW5lIHN0eWxlciBmb3IgdGhlIFN0eWxlZFRleHQgd2lkZ2V0LgotVGhlIGV4YW1wbGUgcHJvdmlkZXMgYSB0eXBpY2FsIGVkaXRvciBpbnRlcmZhY2UuCi1UbyBzZWUgdGhlIGVmZmVjdCBvZiB0aGUgbGluZSBzdHlsZXIsIG9wZW4gYSAqLmphdmEgZmlsZSwgYW5kCi13aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUgZGlzcGxheWVkIGluIHRoZSBlZGl0b3IgYXJlYSwgbm90aWNlIHRoYXQgdGhlIGtleXdvcmRzIGhhdmUgYmVlbiBoaWdobGlnaHRlZC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyLkphdmFWaWV3ZXI8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+SmF2YSBTeW50YXggVmlld2VyPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5TdGFuZGFsb25lPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiYzgyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIEV4YW1wbGUgTGF1bmNoZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvaDI+Ci0KLTxwPgotVGhlIEV4YW1wbGUgTGF1bmNoZXIgaXMgdXNlZCB0byBsYXVuY2ggU1dUIGV4YW1wbGVzLCB3aGljaCBjYW4gZWl0aGVyIGJlIFdvcmtiZW5jaCB2aWV3cyAKLW9yIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zLgotPC9wPgotCi08dWw+Ci08bGk+V29ya2JlbmNoIHZpZXdzIGFyZSBleGFtcGxlcyB0aGF0IGFyZSBpbnRlZ3JhdGVkIGludG8gRWNsaXBzZS4gIFdoZW4gdGhlIGxhdW5jaGVyCi1zdGFydHMgYSBXb3JrYmVuY2ggdmlldywgaXQgaXMgb3BlbmVkIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBlcnNwZWN0aXZlLgotPGxpPlN0YW5kYWxvbmUgYXBwbGljYXRpb25zIGFyZSBsYXVuY2hlZCBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KLTwvdWw+Ci0KLTxwPgotRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBydW4gdGhlIHN0YW5kYWxvbmUgZXhhbXBsZXMgd2l0aG91dCB0aGUgU1dUIEV4YW1wbGUgTGF1bmNoZXIsIAotcmVmZXIgdG8gPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4uCi08L3A+Ci08cD4KLVRoZSBTV1QgV29ya2JlbmNoIHZpZXcgZXhhbXBsZXMgY2FuIGFsc28gYmUgbGF1bmNoZWQgZGlyZWN0bHkgd2l0aG91dCB1c2luZyB0aGUgU1dUIEV4YW1wbGUgCi1MYXVuY2hlci4gIFNXVCBXb3JrYmVuY2ggdmlldyBleGFtcGxlcyBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGNhdGVnb3J5IG9mIHRoZSAKLTxzdHJvbmc+U2hvdyBWaWV3czwvc3Ryb25nPiBkaWFsb2cuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBFeGFtcGxlIExhdW5jaGVyPC9oMz4KLQotPHA+Ci1Gcm9tIEVjbGlwc2UncyA8c3Ryb25nPldpbmRvdzwvc3Ryb25nPiBtZW51LCBzZWxlY3QgPHN0cm9uZz5TaG93IFZpZXcgJmd0OyBPdGhlcjwvc3Ryb25nPi4gCi1JbiB0aGUgPHN0cm9uZz5TaG93IFZpZXc8L3N0cm9uZz4gZGlhbG9nLCBleHBhbmQgPHN0cm9uZz5TV1QgRXhhbXBsZXM8L3N0cm9uZz4gYW5kIHNlbGVjdCB0aGUgPHN0cm9uZz5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvc3Ryb25nPiB2aWV3LiAKLUEgdmlldyBjb250YWluaW5nIGEgbGlzdCBvZiBleGFtcGxlcyB3aWxsIGFwcGVhciBpbiB5b3VyIGN1cnJlbnQgcGVyc3BlY3RpdmUuCi1XaGVuIHlvdSBzZWxlY3QgYW4gZXhhbXBsZSBmcm9tIHRoZSBsaXN0IGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGV4YW1wbGUgaXMgZGlzcGxheWVkLgotQ2xpY2sgb24gdGhlIDxzdHJvbmc+UnVuPC9zdHJvbmc+IGJ1dHRvbiB0byBsYXVuY2ggdGhlIGV4YW1wbGUuCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X2xheW91dF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU4OWIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBMYXlvdXQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gTGF5b3V0czwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBsYXlvdXRzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgCi11c2VyIHRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGxheW91dC4KLVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEKLXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCB0aGUgdW5kZXJseWluZwotY29kZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSA8c3Ryb25nPkNvZGU8L3N0cm9uZz4gYnV0dG9uLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0ic3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGUuTGF5b3V0RXhhbXBsZTwvY29kZT4uCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9InN3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5MYXlvdXRzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwNThlZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCBTdGFuZGFsb25lIEV4YW1wbGVzIFNldHVwPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2gyPgotCi08aDM+QWRkaW5nIFNXVCB0byB5b3VyIHdvcmtzcGFjZTwvaDM+Ci0KLTxvbD4KLTxsaT5Eb3dubG9hZCBTV1QgZm9yIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zLiAgQSBzdGFuZGFsb25lIHZlcnNpb24gb2YgU1dUIGlzIGF2YWlsYWJsZSAKLW9uIHRoZSBzYW1lIGRvd25sb2FkIHBhZ2UgYXMgdGhlIEVjbGlwc2UgU0RLLiAgTG9vayBmb3IgdGhlIHNlY3Rpb24gdGl0bGVkIAotPHN0cm9uZz5TV1QgQmluYXJ5IGFuZCBTb3VyY2U8L3N0cm9uZz4uICBEbyBub3QgZXh0cmFjdCB0aGUgYXJjaGl2ZSBmaWxlLCBqdXN0IHNhdmUgaXQgdG8gZGlzay4KLTxsaT5TZWxlY3QgPHN0cm9uZz5JbXBvcnQuLi48L3N0cm9uZz4gZnJvbSB0aGUgPHN0cm9uZz5GaWxlPC9zdHJvbmc+IG1lbnUuPC9saT4KLTxsaT5TZWxlY3QgPHN0cm9uZz5FeGlzdGluZyBQcm9qZWN0cyBpbnRvIFdvcmtzcGFjZTwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+TmV4dDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5TZWxlY3QgPHN0cm9uZz5TZWxlY3QgYXJjaGl2ZSBmaWxlOjwvc3Ryb25nPiBhbmQgdXNlIHRoZSA8c3Ryb25nPkJyb3dzZTwvc3Ryb25nPiBidXR0b24gdG8gbG9jYXRlIHRoZSBTV1QgCi1zdGFuZGFsb25lIGFyY2hpdmUgeW91IGhhdmUgcHJldmlvdXNseSBkb3dubG9hZGVkLjwvbGk+Ci08bGk+Q2xpY2sgb24gdGhlIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC9vbD4KLQotPGgzPkltcG9ydGluZyBleGFtcGxlIHNvdXJjZTwvaDM+Ci0KLTxvbD4KLTxsaT5Eb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgRWNsaXBzZSBFeGFtcGxlIFBsdWctaW5zLiAgVGhlIEVjbGlwc2UgRXhhbXBsZSBQbHVnLWlucyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzYW1lCi1kb3dubG9hZCBwYWdlIGFzIHRoZSBFY2xpcHNlIFNESy4gIExvb2sgZm9yIHRoZSBzZWN0aW9uIHRpdGxlZCA8c3Ryb25nPkV4YW1wbGUgUGx1Zy1pbnM8L3N0cm9uZz4uCi1Zb3UgY2FuIGluc3RhbGwgdGhlIGV4YW1wbGVzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIHlvdSBpbnN0YWxsZWQgRWNsaXBzZSBvciB5b3UgY2FuIGNob29zZQotYSBkaWZmZXJlbnQgbG9jYXRpb24uICBJZiB5b3UgaW5zdGFsbCB0aGUgZXhhbXBsZXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgRWNsaXBzZSwgdGhlIGV4YW1wbGUgdmlld3MgCi1hbmQgZWRpdG9ycyB3aWxsIHNob3cgdXAgaW4geW91ciBFY2xpcHNlIGVudmlyb25tZW50IChlLmcuIDxzdHJvbmc+V2luZG93cyAmZ3Q7IFNob3cgVmlldyAuLi4gJmd0OyBPdGhlciAuLi4gJmd0OyBTV1QgRXhhbXBsZXM8L3N0cm9uZz4KLUlmIHRoZSBTV1QgZXhhbXBsZSB2aWV3cyBkbyBub3QgYXBwZWFyIHJpZ2h0IGF3YXkgaW4geW91ciBtZW51LCByZXN0YXJ0IGVjbGlwc2Ugd2l0aCB0aGUgPHN0cm9uZz4tY2xlYW48L3N0cm9uZz4gYXJndW1lbnQpLgotVGhpcyBpcyBmaW5lIGJ1dCBpdCBpcyBub3QgbmVjZXNzYXJ5LgotPGxpPlNlbGVjdCA8c3Ryb25nPk5ldyAmZ3Q7IFByb2plY3QgLi4uPC9zdHJvbmc+IGZyb20gdGhlIDxzdHJvbmc+RmlsZTwvc3Ryb25nPiBtZW51LgotPGxpPlNlbGVjdCA8c3Ryb25nPkphdmEgUHJvamVjdDwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+TmV4dDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5HaXZlIHRoZSBqYXZhIHByb2plY3QgYSBuYW1lIHN1Y2ggYXMgIlNXVCBFeGFtcGxlcyIuPC9saT4KLTxsaT5TZWxlY3QgPHN0cm9uZz5DcmVhdGUgcHJvamVjdCBmcm9tIGV4aXN0aW5nIHNvdXJjZTwvc3Ryb25nPiBhbmQgY2xpY2sgb24gdGhlIDxzdHJvbmc+QnJvd3NlIC4uLjwvc3Ryb25nPiAKLWJ1dHRvbiB0byBsb2NhdGUgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnk6Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Y29kZT5lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uuc2RrLmV4YW1wbGVzLnNvdXJjZV8zLjEuMC9zcmMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzXzMuMS4wPC9jb2RlPgotPGxpPkNsaWNrIG9uIHRoZSA8c3Ryb25nPk5leHQ8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+Q2xpY2sgb24gdGhlIDxzdHJvbmc+UHJvamVjdHM8L3N0cm9uZz4gdGFiIGFuZCBjbGljayBvbiB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08bGk+UGxhY2UgYSBjaGVjayBiZXNpZGUgPHN0cm9uZz5vcmcuZWNsaXBzZS5zd3Q8L3N0cm9uZz4gYW5kIGNsaWNrIG9uIHRoZSA8c3Ryb25nPk9LPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPGxpPkNsaWNrIG9uIHRoZSA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTwvb2w+Ci0KLTxwPkF0IHRoaXMgcG9pbnQgeW91ciBTV1QgZXhhbXBsZXMgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IGVycm9ycy4gIENoZWNrIHRoZSA8c3Ryb25nPlByb2JsZW1zPC9zdHJvbmc+IAotdmlldyBmb3IgZXJyb3JzLiAgSWYgeW91IGdldCBhbiBlcnJvciBsaWtlICI8Y29kZT5qYXZhLmxhbmcuT2JqZWN0PC9jb2RlPiBub3QgZm91bmQiIGl0IG1lYW5zIAoteW91IGhhdmUgbm90IGNvbmZpZ3VyZWQgYSBKUkUuICBHbyB0byB0aGUgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlByZWZlcmVuY2VzIC4uLjwvc3Ryb25nPiBkaWFsb2cKLWFuZCBzZWxlY3QgdGhlIDxzdHJvbmc+SmF2YTwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+SW5zdGFsbGVkIEpSRXM8L3N0cm9uZz4gcHJlZmVyZW5jZSBwYWdlLiAgRW5zdXJlIHRoYXQgYSBKUkUgaXMgaW5zdGFsbGVkIAotYW5kIHRoYXQgdGhlIHBhdGggdG8gdGhlIEpSRSBpcyBjb3JyZWN0LjwvcD4KLQotPGgzPjxhIE5BTUU9IlJ1biI+PC9hPlJ1bm5pbmcgdGhlIEV4YW1wbGU8L2gzPgotCi08cD5Ob3cgeW91IGNhbiBydW4gdGhlIFNXVCBzdGFuZGFsb25lIGV4YW1wbGVzLgotCi08b2w+Ci08bGk+T3BlbiB0aGUgSmF2YSBwZXJzcGVjdGl2ZS4KLTxsaT5JbiB0aGUgUGFja2FnZXMgdmlldywgc2VsZWN0IHRoZSBtYWluIGNsYXNzIHRoYXQgeW91IHdhbnQgdG8gcnVuLiAgCi0gICAgRm9yIGV4YW1wbGUsIHRoZSBtYWluIGNsYXNzIGZvciB0aGUgQWRkcmVzcyBCb29rIGV4YW1wbGUgaXMgCi0gICAgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rLkFkZHJlc3NCb29rPC9jb2RlPi4KLTxsaT5TZWxlY3QgPHN0cm9uZz5SdW48L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlJ1biBBcy4uLjwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+SmF2YSBBcHBsaWNhdGlvbjwvc3Ryb25nPiBmcm9tIHRoZSBtYWluIG1lbnUuCi08L29sPgotCi0KLTxoMz48YSBuYW1lPSJFeGFtcGxlc092ZXJ2aWV3Ij5FeGFtcGxlcyBPdmVydmlldzwvYT48L2gzPgotPHA+Ci1Db25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggaW5kaXZpZHVhbCBleGFtcGxlIGZvciB0aGUgbmFtZSBvZgotaXRzIG1haW4gY2xhc3MgYW5kIGFkZGl0aW9uYWwgZGV0YWlscy4KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXJlIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5zd3RleGFtcGxlcy5qYXI8L2NvZGU+OgotPC9wPgotPHVsPgotPGxpPjxhIGhyZWY9InN3dF9hZGRyZXNzYm9va19leC5odG1sIj5BZGRyZXNzIEJvb2s8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2Jyb3dzZXJfZXguaHRtbCI+QnJvd3NlciBFeGFtcGxlPC9hPgotPGxpPjxhIGhyZWY9InN3dF9jbGlwYm9hcmRfZXguaHRtbCI+Q2xpcGJvYXJkPC9hPgotPGxpPjxhIGhyZWY9InN3dF9jb250cm9sc19leC5odG1sIj5Db250cm9sczwvYT4KLTxsaT48YSBocmVmPSJzd3RfY3VzdG9tY29udHJvbHNfZXguaHRtbCI+Q3VzdG9tIENvbnRyb2xzPC9hPgotPGxpPjxhIGhyZWY9InN3dF9kbmRfZXguaHRtbCI+RHJhZyBhbmQgRHJvcCBFeGFtcGxlPC9hPgotPGxpPjxhIGhyZWY9InN3dF9maWxldmlld2VyX2V4Lmh0bWwiPkZpbGUgVmlld2VyPC9hPgotPGxpPjxhIGhyZWY9InN3dF9oZWxsb3dvcmxkX2V4Lmh0bWwiPkhlbGxvIFdvcmxkIFsxLTVdPC9hPgotPGxpPjxhIGhyZWY9InN3dF9ob3ZlcmhlbHBfZXguaHRtbCI+SG92ZXIgSGVscDwvYT4KLTxsaT48YSBocmVmPSJzd3RfaW1hZ2VhbmFseXplcl9leC5odG1sIj5JbWFnZSBBbmFseXplcjwvYT4KLTxsaT48YSBocmVmPSJzd3RfamF2YXZpZXdlcl9leC5odG1sIj5KYXZhIFN5bnRheCBWaWV3ZXI8L2E+Ci08bGk+PGEgaHJlZj0ic3d0X2xheW91dF9leC5odG1sIj5MYXlvdXRzPC9hPgotPGxpPjxhIGhyZWY9InN3dF9wYWludF9leC5odG1sIj5QYWludCBFeGFtcGxlPC9hPgotPGxpPjxhIGhyZWY9InN3dF90ZXh0ZWRpdG9yX2V4Lmh0bWwiPlRleHQgRWRpdG9yPC9hPgotPC91bD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjRjZjVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfcGFpbnRfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIFBhaW50IFRvb2w8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIFBhaW50IFRvb2w8L2gyPgotCi08cD4JCi1UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgU1dUIGdyYXBoaWNzIG9wZXJhdGlvbnMgaW4gdGhlIGZvcm0gb2YgYQotcnVkaW1lbnRhcnkgYml0bWFwIHBhaW50aW5nIHByb2dyYW0uICBUaGUgUGFpbnQgVG9vbCBpbXBsZW1lbnRhdGlvbiBhbHNvIAotZGVtb25zdHJhdGVzIGEgbWVjaGFuaXNtIGZvciBtYW5hZ2luZyB0aW1lZCBHVUkgb3BlcmF0aW9ucyBpbiB0aGUgYmFja2dyb3VuZCAKLXRoYXQgYXJlIHRyaWdnZXJlZCBieSB1c2VyIGlucHV0LgotPC9wPgotPHA+CQotU2VsZWN0IGEgdG9vbCB3aXRoIHdoaWNoIHRvIGRyYXcgaW4gdGhlIGRyYXdpbmcgYXJlYS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0b29scwotdG8gY2hvb3NlIGZyb20gb24gdGhlIHRvb2xiYXIuICBUbyBjaGFuZ2UgdGhlIGNvbG9yIHNlbGVjdGlvbiwgY2xpY2sgb24gYSBjb2xvciBpbiB0aGUKLXBhbGV0dGUgYmVsb3cgdGhlIGRyYXdpbmcgYXJlYTsgbGVmdC1jbGljayB0byBzZXQgdGhlIGZvcmVncm91bmQgY29sb3IsIHJpZ2h0LWNsaWNrIHRvIHNldCB0aGUKLWJhY2tncm91bmQgY29sb3IuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLQotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC5QYWludEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+UGFpbnQ8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfdGV4dGVkaXRvcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF90ZXh0ZWRpdG9yX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzY2U5YjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF90ZXh0ZWRpdG9yX2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBUZXh0IEVkaXRvciBFeGFtcGxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZSAtIFRleHQgRWRpdG9yPC9oMj4KLQotPHA+Ci1UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgYSBTdHlsZWRUZXh0IHdpZGdldCB0byBpbXBsZW1lbnQKLWEgdGV4dCBlZGl0b3Igd2l0aCBmb3JtYXR0aW5nIHN1cHBvcnQuCi1UaGUgZXhhbXBsZSBoYXMgYSB0eXBpY2FsIHRleHQgZWRpdG9yIGludGVyZmFjZS4KLVRoZSA8c3Ryb25nPkVkaXQ8L3N0cm9uZz4gbWVudSBjb250YWlucyA8c3Ryb25nPkN1dDwvc3Ryb25nPiwgPHN0cm9uZz5Db3B5PC9zdHJvbmc+LCA8c3Ryb25nPlBhc3RlPC9zdHJvbmc+IGFuZCA8c3Ryb25nPlNldCBGb250PC9zdHJvbmc+IGl0ZW1zLiAgVGhlIHRvb2xiYXIKLXByb3ZpZGVzIGEgYm9sZCB0ZXh0IHRvZ2dsZSwgdGhyZWUgY29sb3VyIHRvb2xzLCBhbmQgYSByZXNldCBidXR0b24sIGFsbCBvZiB3aGljaCBvcGVyYXRlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9InN3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy50ZXh0ZWRpdG9yLlRleHRFZGl0b3I8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSJzd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+VGV4dCBFZGl0b3I8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPlN0YW5kYWxvbmU8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhYjIwZWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUU3RhbmRhbG9uZUV4YW1wbGVTZXQubmFtZSA9IFNXVCBTdGFuZGFsb25lIEV4YW1wbGVzIFBsdWdpbgotCi1sYXVuY2hjYXRlZ29yeS5TV1RTdGFuZGFsb25lRXhhbXBsZXMubmFtZSA9IFN0YW5kYWxvbmUKLWxhdW5jaGNhdGVnb3J5LlNXVFN0YW5kYWxvbmVFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgdGhhdCBydW4gaW5kZXBlbmRhbnQgXAotCW9mIHRoZSBFY2xpcHNlIFBsYXRmb3JtLgotCi1sYXVuY2hpdGVtLkFkZHJlc3NCb29rLm5hbWUgPSBBZGRyZXNzIEJvb2sKLWxhdW5jaGl0ZW0uQWRkcmVzc0Jvb2suZGVzY3JpcHRpb24gPSBcCi0JVGhlIEFkZHJlc3NCb29rIGV4YW1wbGUgc2hvd3MgaG93IHRoZSBUYWJsZSBjb250cm9sIGNhbiBiZSB1c2VkIHRvIFwKLQlwcmVzZW50IGluZm9ybWF0aW9uIGluIGEgdGFidWxhciBmb3JtYXQuXG5cblwKLQlUaGUgYXBwbGljYXRpb24gY2FuIHNhdmUgYW5kIGxvYWQgZGF0YSBmcm9tIGEgZmlsZSwgc29ydCB0aGUgZW50cmllcywgYW5kIFwKLQlzZWFyY2ggZm9yIHN0cmluZ3Mgd2l0aGluIHRoZSBmaWVsZHMuCi0KLWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUubmFtZSA9IEJyb3dzZXIKLWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC5cblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgY29tcG9zaXRlIGNvbnRhaW5pbmcgYSBCcm93c2VyIHdpZGdldCB0byByZW5kZXIgSFRNTC4gXAotCUFkZGl0aW9uYWwgd2lkZ2V0cyBhbGxvdyB0aGUgdXNlciB0byBwZXJmb3JtIHR5cGljYWwgYnJvd3NlciBhY3Rpb25zIChmb3IgZXhhbXBsZSwgbmF2aWdhdGUgdG8gYSBwYXJ0aWN1bGFyIFVSTCwgZ28gYmFjaywgZm9yd2FyZCwgcmVmcmVzaCBhbmQgc3RvcCkuCi0KLWxhdW5jaGl0ZW0uQ2xpcGJvYXJkLm5hbWUgPSBDbGlwYm9hcmQKLWxhdW5jaGl0ZW0uQ2xpcGJvYXJkLmRlc2NyaXB0aW9uID0gXAotCVRoZSBDbGlwYm9hcmQgZXhhbXBsZSBzaG93cyB0aGUgdmFyaW91cyBTV1QgY2xpcGJvYXJkIHRyYW5zZmVyIHR5cGVzIGluIHVzZS4KLQotbGF1bmNoaXRlbS5Db250cm9sRXhhbXBsZS5uYW1lID0gU1dUIENvbnRyb2xzIEV4YW1wbGUKLWxhdW5jaGl0ZW0uQ29udHJvbEV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhlIENvbnRyb2xzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGNvbnRyb2xzLiBcblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciBcCi0JdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBjb250cm9sLiBcCi0JVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgdGhlIGNvbnRyb2wuCi0KLWxhdW5jaGl0ZW0uRE5ELm5hbWUgPSBEcmFnIGFuZCBEcm9wCi1sYXVuY2hpdGVtLkRORC5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNob3dzIHRoZSB2YXJpb3VzIFNXVCBkcmFnIGFuZCBkcm9wIHRyYW5zZmVyIHR5cGVzIGluIHVzZS4KLQkKLWxhdW5jaGl0ZW0uRmlsZVZpZXdlci5uYW1lID0gRmlsZSBWaWV3ZXIKLWxhdW5jaGl0ZW0uRmlsZVZpZXdlci5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgRmlsZSBWaWV3ZXIgZXhhbXBsZSBzaG93cyBob3cgYSBzaW1wbGUgYXBwbGljYXRpb24gY2FuIGJlIGltcGxlbWVudGVkIHVzaW5nIFNXVC5cblxuXAotCVRoaXMgYXBwbGljYXRpb24gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gbmF2aWdhdGUgZmlsZXMgYW5kIGZvbGRlcnMgYW5kIG1hbmlwdWxhdGUgdGhlbSB2aWEgRHJhZyBhbmQgRHJvcC4gIFwKLQlJdCBpbmNsdWRlcyB0aGUgdXNlIG9mIGFsdGVybmF0ZSB0aHJlYWRzIGZvciBsb25nIGFjdGlvbnMgYW5kIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBUcmVlLCBcCi0JVGFibGUsIFRvb2xiYXIgYW5kIFByb2dyYW0uCi0KLWxhdW5jaGl0ZW0uSG92ZXJIZWxwLm5hbWUgPSBIb3ZlciBIZWxwCi1sYXVuY2hpdGVtLkhvdmVySGVscC5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgSG92ZXIgSGVscCBleGFtcGxlIHNob3dzIGhvdyB0byBpbXBsZW1lbnQgY3VzdG9tIHRvb2x0aXBzIGFuZCBob3ZlciBoZWxwIHN1cHBvcnQgXAotCW9uIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBTV1QgY29udHJvbHMgaW5jbHVkaW5nIEJ1dHRvbnMsIFRhYmxlSXRlbXMsIFRvb2xJdGVtcyBhbmQgVHJlZUl0ZW1zLlxuXG5cCi0JVGhlIGV4YW1wbGUgaW1wbGVtZW50cyBpdHMgb3duIHRvb2x0aXAgYW5kIGhvdmVyIGhlbHAgc3VwcG9ydC4gIFwKLQlUbyBzZWUgdGhlIGN1c3RvbSB0b29sdGlwcyBpbiBhY3Rpb24sIGhvdmVyIG92ZXIgYW4gaXRlbSBvciBidXR0b24gaW4gdGhlIFVJLiAgXAotCUFuIGltYWdlIGFwcGVhcnMgaW4gdGhlIGxlZnQtaGFuZCBjb3JuZXIgb2YgdGhlIHRvb2x0aXAuXG5cblwKLQlUbyBzZWUgdGhlIGN1c3RvbSBob3ZlciBoZWxwIGluIGFjdGlvbiwgaG92ZXIgb3ZlciBhbiBpdGVtIG9yIGJ1dHRvbiBpbiB0aGUgVUkgdW50aWwgXAotCXRoZSB0b29sdGlwIGlzIGRpc3BsYXllZC4gIFdpdGhvdXQgbW92aW5nIHRoZSBtb3VzZSwgaGl0IEYxLiAgQSBuZXcgU2hlbGwgd2lsbCBwb3AgdXAgd2l0aCB0aGUgXAotCWV4dGVuZGVkIGhvdmVyIGhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBVSSBlbGVtZW50IGluIHF1ZXN0aW9uCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDEubmFtZSA9IEhlbGxvIFdvcmxkICgxKQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBvcGVuIGEgU2hlbGwgYW5kIHByb2Nlc3MgdGhlIGV2ZW50cy4KLQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMi5uYW1lID0gSGVsbG8gV29ybGQgKDIpCi1sYXVuY2hpdGVtLkhlbGxvV29ybGQyLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDEgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gZGlzcGxheSBhIExhYmVsIGluc2lkZSB0aGUgU2hlbGwuCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDMubmFtZSA9IEhlbGxvIFdvcmxkICgzKQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkMy5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgTGFiZWwgXAotCXdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMaXN0ZW5lciBtZWNoYW5pc20uCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDQubmFtZSA9IEhlbGxvIFdvcmxkICg0KQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkNC5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgTGFiZWwgXAotCXdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMYXlvdXQuCi0KLWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDUubmFtZSA9IEhlbGxvIFdvcmxkICg1KQotbGF1bmNoaXRlbS5IZWxsb1dvcmxkNS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRyYXcgZGlyZWN0bHkgb24gYW4gU1dUIENvbnRyb2wgdXNpbmcgYSBncmFwaGljIGNvbnRleHQuCi0KLWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5uYW1lID0gSW1hZ2UgQW5hbHl6ZXIKLWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgSW1hZ2VBbmFseXplciBvcGVucyBpbWFnZSBmaWxlcyBhbmQgZGlzcGxheXMgdGhlIHZpc3VhbCBjb250ZW50cyBvZiB0aGUgZmlsZSBhbG9uZyB3aXRoIGEgXAotCXN1bW1hcnkgb2YgdGhlIGRhdGEgaW4gdGhlIGltYWdlIGZpbGUuXG5cblwKLQlUaGUgdXNlciBjYW4gbWFrZSBhZGp1c3RtZW50cyB0byB2YXJpb3VzIGVsZW1lbnRzIG9mIHRoZSBpbWFnZSBzdWNoIGFzIHNjYWxpbmcgYW5kIEFscGhhIFwKLQlibGVuZGluZyBhbmQgY2FuIHNhdmUgdGhlc2UgY2hhbmdlcyB0byBhIGZpbGUuXG5cblwKLQlUaGUgSW1hZ2VBbmFseXplciB3aWxsIGxvYWQgYW5kIGRpc3BsYXkgaW1hZ2UgZmlsZXMgb2YgdHlwZSBHSUYsIEpQRUcsIEJNUCwgSUNPLCBQTkcsIGFuZCBUSUZGLiAgXAotCVRvIG9wZW4gYSBmaWxlLCB1c2UgdGhlIEZpbGUtPk9wZW4uLi4gbWVudSBpdGVtLCBhbmQgc2VsZWN0IHRoZSBpbWFnZSBmaWxlIGluIHRoZSBGaWxlRGlhbG9nLlxuXG5cCi0JSWYgdGhlIGZpbGUgaXMgYW4gaW50ZXJsYWNlZCBHSUYgb3IgUE5HIG9yIGEgcHJvZ3Jlc3NpdmUgSlBFRywgYW5kIEluY3JlbWVudGFsIERpc3BsYXkgaXMgc2VsZWN0ZWQsIFwKLQl0aGVuIHRoZSBJbWFnZUFuYWx5emVyIGRpc3BsYXlzIHRoZSBpbWFnZSBpbmNyZW1lbnRzIGFzIHRoZXkgYXJlIGJlaW5nIGxvYWRlZC5cblxuXAotCUlmIHRoZSBmaWxlIGNvbnRhaW5zIGFuIGFuaW1hdGVkIEdJRiwgdGhlbiB0aGUgTmV4dCwgUHJldmlvdXMsIGFuZCBBbmltYXRlIGJ1dHRvbnMgYmVjb21lIGVuYWJsZWQsIFwKLQlhbmQgdGhleSBjYW4gYmUgdXNlZCB0byBjeWNsZSB0aHJvdWdoIHRoZSBpbWFnZXMgaW4gdGhlIGZpbGUsIG9yIGFuaW1hdGUgdGhlbS4gSWYgYSBHSUYgZGVmaW5lcyBhIGJhY2tncm91bmQgY29sb3IsIFwKLQlhcyBtYW55IGFuaW1hdGVkIEdJRnMgZG8sIHNlbGVjdGluZyBCYWNrZ3JvdW5kIHdpbGwgdXNlIHRoZSBHSUYncyBiYWNrZ3JvdW5kIGNvbG9yLlxuXG5cCi0JSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3kgKHBvc3NpYmxlIHdpdGggR0lGLCBQTkcsIG9yIElDTyksIHRoZW4gc2VsZWN0aW5nIERpc3BsYXkgTWFzayB3aWxsIGRyYXcgdGhlIGltYWdlJ3MgdHJhbnNwYXJlbmN5IFwKLQltYXNrIHRvIHRoZSByaWdodCBvZiB0aGUgaW1hZ2UuIFlvdSBjYW4gY2hhbmdlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBJbWFnZUFuYWx5emVyIHRvIHNlZSB0aGUgdHJhbnNwYXJlbmN5IHdvcmsuIFwKLQlUbyB0dXJuIG9mZiB0aGUgdHJhbnNwYXJlbmN5LCBkZXNlbGVjdCBEaXNwbGF5IFRyYW5zcGFyZW5jeS5cblxuXAotCUFmdGVyIGFuIGltYWdlIGlzIGxvYWRlZCwgaXQgY2FuIGJlIHNjYWxlZCBvciBoYXZlIGFscGhhIHRyYW5zcGFyZW5jeSBhcHBsaWVkLCB1c2luZyB0aGUgU2NhbGUgYW5kIEFscGhhLUsgY29tYm9zLCBcCi0JYW5kIHRoZSBBbHBoYSBtZW51LiBGaWxlLT5SZW9wZW4gcmVzdG9yZXMgc2NhbGluZyBhbmQgQWxwaGEgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYW5kIHJlbG9hZHMgdGhlIGN1cnJlbnQgaW1hZ2UgZmlsZS5cblxuXAotCUZpbGUtPlNhdmUgQXMuLi4gY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aGUgY3VycmVudGx5IGxvYWRlZCBpbWFnZSB0byBhbm90aGVyIHR5cGUgb2YgaW1hZ2UgZmlsZS4gSWYgdGhlIGltYWdlIGhhcyB0cmFuc3BhcmVuY3ksIFwKLQlGaWxlLT5TYXZlIE1hc2sgQXMuLi4gc2F2ZXMgdGhlIGltYWdlJ3MgdHJhbnNwYXJlbmN5IG1hc2suXG5cblwKLQlXaGVuIFNXVCBsb2FkcyBhbiBpbWFnZSBmaWxlLCBhbiBpbnN0YW5jZSBvZiBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhIGlzIGNyZWF0ZWQuIChJbiB0aGUgY2FzZSBvZiBhbiBJQ08gZmlsZSBvciBcCi0JbXVsdGktaW1hZ2UgR0lGLCBhbiBhcnJheSBvZiBJbWFnZURhdGEgaW5zdGFuY2VzIGlzIGNyZWF0ZWQpLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyBhbGwgb2YgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSBJbWFnZURhdGEgXAotCWluc3RhbmNlKHMpIGZvciB0aGUgY3VycmVudGx5IGxvYWRlZCBpbWFnZSBmaWxlLCBpbmNsdWRpbmcgdGhlIHBpeGVsIGRhdGEuIEhvdmVyaW5nIG92ZXIgYSBwaXhlbCBpbiB0aGUgaW1hZ2UgZGlzcGxheSB3aWxsIHNob3cgdGhlIFJHQiBcCi0JY29sb3IgZGF0YSBmb3IgdGhhdCBwaXhlbC4gRm9yIGNlcnRhaW4gaW1hZ2VzIChwYXJ0aWN1bGFybHkgYW5pbWF0ZWQgR0lGcykgYWRkaXRpb25hbCBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyIFwKLQlpbnN0YW5jZSB1c2VkIHRvIGxvYWQgdGhlIGltYWdlLiBUaGUgSW1hZ2VBbmFseXplciBkaXNwbGF5cyB0aGlzIGRhdGEgYXMgd2VsbC4KLQotbGF1bmNoaXRlbS5KYXZhVmlld2VyLm5hbWUgPSBKYXZhIFN5bnRheCBWaWV3ZXIKLWxhdW5jaGl0ZW0uSmF2YVZpZXdlci5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbXBsZW1lbnQgYSB1c2VyLWRlZmluZWQgbGluZSBzdHlsZXIgZm9yIHRoZSBTdHlsZWRUZXh0IHdpZGdldC5cblxuXAotCVRoZSBleGFtcGxlIHByb3ZpZGVzIGEgdHlwaWNhbCBlZGl0b3IgaW50ZXJmYWNlLiAgXAotCVRvIHNlZSB0aGUgZWZmZWN0IG9mIHRoZSBsaW5lIHN0eWxlciwgb3BlbiBhICouamF2YSBmaWxlLiAgXAotCVdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGVkaXRvciBhcmVhLCBub3RpY2UgdGhhdCB0aGUga2V5d29yZHMgaGF2ZSBiZWVuIGhpZ2hsaWdodGVkLgotCi1sYXVuY2hpdGVtLkxheW91dEV4YW1wbGUubmFtZSA9IExheW91dCBFeGFtcGxlCi1sYXVuY2hpdGVtLkxheW91dEV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBsYXlvdXRzLiBcblxuXAotCUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgXAotCXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LiBcCi0JVGhlIHVzZXIgY2FuIGluc2VydCB3aWRnZXRzIGludG8gYSBsYXlvdXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBsYXlvdXQgZGF0YSBcCi0JdXNpbmcgYSBwcm9wZXJ0eSBzaGVldC4gIFdoZW4gdGhlIHVzZXIgaGFzIGEgc3VpdGFibGUgYXJyYW5nZW1lbnQsIGNvZGUgY2FuIGJlIFwKLQlnZW5lcmF0ZWQgYnkgY2xpY2tpbmcgb24gdGhlIENvZGUgYnV0dG9uLgotCi1sYXVuY2hpdGVtLkFkdmFuY2VkR3JhcGhpY3MubmFtZSA9IEFkdmFuY2VkIEdyYXBoaWNzCi1sYXVuY2hpdGVtLkFkdmFuY2VkR3JhcGhpY3MuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlICh1cGRhdGVkIGZvciAzLjMpIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBhcHBsaWNhdGlvbnMgdGhhdCBzaG93IHRoZSB1c2Ugb2YgYWR2YW5jZWQgZ3JhcGhpY3Mgb3BlcmF0aW9ucy4KLQotbGF1bmNoaXRlbS5UZXh0RWRpdG9yLm5hbWUgPSBUZXh0IEVkaXRvcgotbGF1bmNoaXRlbS5UZXh0RWRpdG9yLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgU3R5bGVkVGV4dCB3aWRnZXQgdG8gaW1wbGVtZW50IFwKLQlhIHRleHQgZWRpdG9yIHdpdGggZm9ybWF0dGluZyBzdXBwb3J0LlxuXG5cCi0JVGhlIGV4YW1wbGUgaGFzIGEgdHlwaWNhbCB0ZXh0IGVkaXRvciBpbnRlcmZhY2UuICBcCi0JVGhlIEVkaXQgbWVudSBjb250YWlucyBDdXQsIENvcHksIFBhc3RlIGFuZCBTZXQgRm9udCBpdGVtcyBhbmQgdGhlIHRvb2xiYXIgXAotCXByb3ZpZGVzIGEgYm9sZCB0ZXh0IHRvZ2dsZSwgdGhyZWUgY29sb3VyIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbiB0aGUgY3VycmVudCBcCi0Jc2VsZWN0aW9uLCBhbmQgYSByZXNldCB0byBkZWZhdWx0cyBidXR0b24gdGhhdCBhbHNvIG9wZXJhdGVzIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiYjliN2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gRmlsZSB3cml0dGVuIGJ5IFBERSAxLjAgLS0+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgbmFtZT0iJXBsdWdpbi5TV1RTdGFuZGFsb25lRXhhbXBsZVNldC5uYW1lIgotICAgdmVyc2lvbj0iMy40LjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciIgb3B0aW9uYWw9InRydWUiLz4KLTwvcmVxdWlyZXM+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTxydW50aW1lPgotICAgPGxpYnJhcnkgbmFtZT0ic3d0ZXhhbXBsZXMuamFyIj4KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgPC9saWJyYXJ5PgotPC9ydW50aW1lPgotCi08IS0tIEV4dGVuc2lvbnMgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgIDxjYXRlZ29yeQotICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFN0YW5kYWxvbmVFeGFtcGxlcy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RTdGFuZGFsb25lRXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSI+Ci0gICA8L2NhdGVnb3J5PgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkFkZHJlc3NCb29rLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQWRkcmVzc0Jvb2suZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2siPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkNsaXBib2FyZC5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkNsaXBib2FyZC5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jbGlwYm9hcmQuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkLkNsaXBib2FyZEV4YW1wbGUiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkRORC5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkRORC5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZG5kLkROREV4YW1wbGUiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkZpbGVWaWV3ZXIubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5GaWxlVmlld2VyLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmZpbGV2aWV3ZXIuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZmlsZXZpZXdlci5GaWxlVmlld2VyIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5Ib3ZlckhlbHAubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Ib3ZlckhlbHAuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaG92ZXJoZWxwLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhvdmVyaGVscC5Ib3ZlckhlbHAiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQxLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDEuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDEuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkMSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDIubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMi5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkMi5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGQyIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkMy5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQzLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQzLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQuSGVsbG9Xb3JsZDMiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkhlbGxvV29ybGQ0Lm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDQuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDQuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZC5IZWxsb1dvcmxkNCI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSGVsbG9Xb3JsZDUubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5IZWxsb1dvcmxkNS5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkNS5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGQ1Ij4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5JbWFnZUFuYWx5emVyLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uSW1hZ2VBbmFseXplci5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5pbWFnZWFuYWx5emVyLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmltYWdlYW5hbHl6ZXIuSW1hZ2VBbmFseXplciI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uSmF2YVZpZXdlci5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkphdmFWaWV3ZXIuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuamF2YXZpZXdlci5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyLkphdmFWaWV3ZXIiPgotICAgICAgPC9wcm9ncmFtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLlRleHRFZGl0b3IubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5UZXh0RWRpdG9yLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnRleHRlZGl0b3Iuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIgotICAgICAgICAgICAgbWFpbkNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMudGV4dGVkaXRvci5UZXh0RWRpdG9yIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5BZHZhbmNlZEdyYXBoaWNzLm5hbWUiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQWR2YW5jZWRHcmFwaGljcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoU3RhbmRhbG9uZUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5zdGFuZGFsb25lbGF1bmNoZXIiPgotICAgICAgPHByb2dyYW0KLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzRXhhbXBsZSIKLSAgICAgICAgICAgIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2FkZHJlc3Nib29rLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2FkZHJlc3Nib29rLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjUyZTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19hZGRyZXNzYm9vay5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTGFzdF9uYW1lID0gTGFzdCBOYW1lCi1GaXJzdF9uYW1lID0gRmlyc3QgTmFtZQotQnVzaW5lc3NfcGhvbmUgPSBCdXNpbmVzcyBQaG9uZQotSG9tZV9waG9uZSA9IEhvbWUgUGhvbmUKLUVtYWlsID0gRW1haWwKLUZheCA9IEZheAotQ2xvc2Vfc2F2ZSA9IFRoZSBhZGRyZXNzIGJvb2sgY29udGVudHMgaGF2ZSBjaGFuZ2VkLlxuRG8geW91IHdhbnQgdG8gc2F2ZSB0aGUgY2hhbmdlcz8KLU5ld190aXRsZSA9IFVudGl0bGVkCi1Db2x1bW4gPSBDb2x1bW46Ci1Cb29rX2V4dGVuc2lvbiA9IC5hZHIKLUJvb2tfZmlsdGVyX25hbWUgPSBBZGRyZXNzIEJvb2tzCi1BbGxfZmlsdGVyX25hbWUgPSBBbGwgRmlsZXMKLUZpbGUgPSBGaWxlIAotRG9lc19ub3RfZXhpc3QgPSBkb2VzIG5vdCBleGlzdC4KLUZpbGVfbm90X2ZvdW5kID0gRmlsZSBub3QgZm91bmQ6Ci1JT19lcnJvcl9yZWFkID0gSU8gZXJyb3IgcmVhZGluZyB0ZXh0IGZpbGU6Ci1JT19lcnJvcl93cml0ZSA9IElPIGVycm9yIHdyaXRpbmcgdGV4dCBmaWxlOgotSU9fZXJyb3JfY2xvc2UgPSBJTyBlcnJvciBjbG9zaW5nIHRleHQgZmlsZToKLVRpdGxlX2JhciA9IEFkZHJlc3MgQm9vayAtIAotU2F2ZV9hc190aXRsZSA9IFNhdmUgQXMKLVF1ZXJ5X292ZXJ3cml0ZSA9IGFscmVhZHkgZXhpc3RzLlxuRG8geW91IHdhbnQgdG8gcmVwbGFjZSBpdD8KLUZpbGVfbWVudV90aXRsZSA9ICZGaWxlCi1OZXdfY29udGFjdCA9ICZOZXcgQ29udGFjdC4uLlx0Q3RybCtOCi1FZGl0X2NvbnRhY3QgPSAmRWRpdCBDb250YWN0Li4uXHRDdHJsK0UKLU5ld19hZGRyZXNzX2Jvb2sgPSBOZXcgQWRkcmVzcyAmQm9va1x0Q3RybCtCCi1PcGVuX2FkZHJlc3NfYm9vayA9ICZPcGVuIEFkZHJlc3MgQm9vay4uLlx0Q3RybCtPCi1TYXZlX2FkZHJlc3NfYm9vayA9ICZTYXZlIEFkZHJlc3MgQm9va1x0Q3RybCtTCi1TYXZlX2Jvb2tfYXMgPSBTYXZlICZBZGRyZXNzIEJvb2sgQXMuLi5cdEN0cmwrQQotRXhpdCA9IEUmeGl0Ci1FZGl0X21lbnVfdGl0bGUgPSAmRWRpdAotRWRpdCA9ICZFZGl0Li4uXHRDdHJsK0UKLUNvcHkgPSAmQ29weVx0Q3RybCtDCi1QYXN0ZSA9ICZQYXN0ZVx0Q3RybCtWCi1EZWxldGUgPSBEZSZsZXRlXHREZWwKLVNvcnQgPSAmU29ydAotU2VhcmNoX21lbnVfdGl0bGUgPSAmU2VhcmNoCi1GaW5kID0gJkZpbmQuLi5cdEN0cmwrRgotRmluZF9uZXh0ID0gRmluZCAmTmV4dC4uLlx0RjMKLVBvcF91cF9uZXcgPSAmTmV3Li4uCi1Qb3BfdXBfZWRpdCA9ICZFZGl0Li4uCi1Qb3BfdXBfY29weSA9ICZDb3B5Ci1Qb3BfdXBfcGFzdGUgPSAmUGFzdGUKLVBvcF91cF9kZWxldGUgPSAmRGVsZXRlCi1Qb3BfdXBfZmluZCA9ICZGaW5kLi4uCi1IZWxwX21lbnVfdGl0bGUgPSAmSGVscAotQWJvdXQgPSAmQWJvdXQgQWRkcmVzcyBCb29rLi4uCi1BYm91dF8xID0gQWJvdXQgCi1BYm91dF8yID0gXG52ZXJzaW9uIDEuMAotT0sgPSBPSwotQ2FuY2VsID0gQ2FuY2VsCi1TZWFyY2hfZGlhbG9nX3RpdGxlID0gRmluZAotRGlhbG9nX2ZpbmRfd2hhdCA9IEZpJm5kIHdoYXQ6Ci1EaWFsb2dfbWF0Y2hfY2FzZSA9IE1hdGNoICZjYXNlCi1EaWFsb2dfbWF0Y2hfd29yZCA9IE1hdGNoICZ3aG9sZSB3b3JkCi1EaWFsb2dfZGlyZWN0aW9uID0gRGlyZWN0aW9uCi1EaWFsb2dfZGlyX3VwID0gJlVwCi1EaWFsb2dfZGlyX2Rvd24gPSAmRG93bgotRGlhbG9nX2ZpbmQgPSAmRmluZAotQ2Fubm90X2ZpbmQgPSBDYW5ub3QgZmluZCAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2Jyb3dzZXIucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYnJvd3Nlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc3OTkwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfYnJvd3Nlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi13aW5kb3cudGl0bGUgPSBTV1QgQnJvd3NlcgotCi1CYWNrCQkJCT0gQmFjawotQnJvd3Nlck5vdENyZWF0ZWQJPSBFcnJvciAtIFRoZSBCcm93c2VyIHdpZGdldCBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkLiBQbGVhc2UgY2hlY2sgdGhlIEJyb3dzZXIgd2lkZ2V0IGlzIHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLiBTdXBwb3J0ZWQgcGxhdGZvcm1zIGFuZCBzb2Z0d2FyZSByZXF1aXJlbWVudHMgZm9yIHRoZSBCcm93c2VyIHdpZGdldCBhcmUgbGlzdGVkIG9uIHRoZSBTV1QgRkFRIHdlYiBwYWdlLgotRm9yd2FyZAkJCQk9IEZvcndhcmQKLVN0b3AJCQkJPSBTdG9wCi1SZWZyZXNoCQkJCT0gUmVmcmVzaAotR28JCQkJCT0gR28KLVN0YXJ0dXAJCQkJPSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2NvbnRyb2wucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfY29udHJvbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzhmZWFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfY29udHJvbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotd2luZG93LnRpdGxlID0gU1dUIENvbnRyb2xzCi1jdXN0b20ud2luZG93LnRpdGxlID0gU1dUIEN1c3RvbSBDb250cm9scwotCi1UZXh0X0J1dHRvbnMJCT0gVGV4dCBCdXR0b25zCi1TaXplIAkJCQk9IFNpemUKLUFsaWdubWVudAkJCT0gQWxpZ25tZW50Ci1MZWZ0CQkJCT0gTGVmdAotUmlnaHQJCQkJPSBSaWdodAotVXAJCQkJCT0gVXAKLURvd24JCQkJPSBEb3duCi1DZW50ZXIJCQkJPSBDZW50ZXIKLU9uZQkJCQkJPSBPbmUKLVR3bwkJCQkJPSBUd28KLVRocmVlCQkJCT0gVGhyZWUKLUltYWdlX0J1dHRvbnMJCT0gSW1hZ2UgQnV0dG9ucwotSW1hZ2VfVGV4dF9CdXR0b25zCT0gSW1hZ2UgYW5kIFRleHQgQnV0dG9ucwotQ29udHJvbF9FeGFtcGxlCQk9IENvbnRyb2wgRXhhbXBsZQotUGFyYW1ldGVycwkJCT0gUGFyYW1ldGVycwotT3RoZXIJCQkJPSBPdGhlcgotRW5hYmxlZAkJCQk9IEVuYWJsZWQKLVZpc2libGUJCQkJPSBWaXNpYmxlCi1CYWNrZ3JvdW5kQ29sb3IJCT0gQmFja2dyb3VuZCBDb2xvcgotQmFja2dyb3VuZEltYWdlCQk9IEJhY2tncm91bmQgSW1hZ2UKLVBvcHVwTWVudQkJCT0gUG9wdXAgTWVudQotUHJlZmVycmVkIAkJCT0gUHJlZmVycmVkCi1TdHlsZXMJIAkJCT0gU3R5bGVzCi1NZW51X1N0eWxlcwkgCQk9IE1lbnUgU3R5bGVzCi1NZW51SXRlbV9TdHlsZXMJIAk9IE1lbnVJdGVtIFN0eWxlcwotQmFja2dyb3VuZF9Nb2RlCQk9IEJhY2tncm91bmQgTW9kZSBvbiBQYXJlbnQKLUxpc3RlbmVycwkJCT0gTGlzdGVuZXJzCi1TZWxlY3RfTGlzdGVuZXJzCT0gU2VsZWN0IExpc3RlbmVycwotTGlzdGVuCQkJCT0gTGlzdGVuCi1DbGVhcgkJCQk9IENsZWFyCi1TZXRfR2V0CQkJCT0gU2V0L0dldCBBUEkKLVBhcmFtZXRlcl9JbmZvCQk9IHswfSAgIGUuZy4gezF9IAotSW5mb19pbnQJCQk9IDQKLUluZm9faW50QQkJCT0gMCwxLDIKLUluZm9fbG9uZwkJCT0gNAotSW5mb19sb25nQQkJCT0gMCwxLDIKLUluZm9fY2hhcgkJCT0gYwotSW5mb19jaGFyQQkJCT0gYSxiLGMKLUluZm9fYm9vbGVhbgkJPSB0cnVlCi1JbmZvX2Jvb2xlYW5BCQk9IHRydWUsdHJ1ZSxmYWxzZQotSW5mb19TdHJpbmcJCQk9IGhlbGxvCi1JbmZvX1N0cmluZ0EJCT0gaGVsbG8sdGhlcmUKLUluZm9fUG9pbnQJCQk9IDAsMAotSW5mb19UYWJJdGVtCQk9IFRhYiAwCi1JbmZvX1RhYkl0ZW1BCQk9IFRhYiAwLFRhYiAyCi1JbmZvX1RhYmxlSXRlbQkJPSBJbmRleDoyCi1JbmZvX1RhYmxlSXRlbUEJCT0gSW5kZXg6MixJbmRleDo0Ci1JbmZvX1RyZWVJdGVtCQk9IE5vZGUgMQotSW5mb19UcmVlSXRlbUEJCT0gTm9kZSAxLE5vZGUgMwotU2VsZWN0X0FsbAkJCT0gU2VsZWN0IEFsbAotRGVzZWxlY3RfQWxsCQk9IERlc2VsZWN0IEFsbAotT0sJCQkJCT0gT0sKLUZpbGxEYW1hZ2UJCQk9IEZpbGwgRGFtYWdlZCBBcmVhIFdpdGggQ29sb3IKLVRpdGxlX1RleHQJCQk9IFRpdGxlIFRleHQKLVRleHRfTGFiZWxzCQkJPSBUZXh0IExhYmVscwotSW1hZ2VfTGFiZWxzCQk9IEltYWdlIExhYmVscwotQ3VzdG9tX0xhYmVscwkJPSBDdXN0b20gTGFiZWxzCi1DdXN0b21fQ29tYm8JCT0gQ3VzdG9tIENvbWJvCi1PbmVfVHdvX1RocmVlCQk9IE9uZSBUd28gVGhyZWUKLVRleHRfVG9vbEJhciAJCT0gVGV4dCBUb29sQmFyCi1JbWFnZV9Ub29sQmFyIAkJPSBJbWFnZSBUb29sQmFyCi1JbWFnZVRleHRfVG9vbEJhcgk9IEltYWdlIGFuZCBUZXh0IFRvb2xCYXIKLU1heGltdW0JCQkJPSBNYXhpbXVtCi1NaW5pbXVtCQkJCT0gTWluaW11bQotU2VsZWN0aW9uCQkJPSBTZWxlY3Rpb24KLUluY3JlbWVudAkJCT0gSW5jcmVtZW50Ci1QYWdlX0luY3JlbWVudAkJPSBQYWdlIEluY3JlbWVudAotVGh1bWIJCQkJPSBUaHVtYgotRGlnaXRzCQkJCT0gRGlnaXRzCi1UcmVlX1dpdGhfSW1hZ2VzCT0gVHJlZSBXaXRoIEltYWdlcwotRGlhbG9nX1R5cGUJCQk9IERpYWxvZyBUeXBlCi1DcmVhdGVfRGlhbG9nCQk9IENyZWF0ZSBEaWFsb2cKLUJ1dHRvbl9TdHlsZXMJCT0gQnV0dG9uIFN0eWxlcwotSWNvbl9TdHlsZXMJCQk9IEljb24gU3R5bGVzCi1Nb2RhbF9TdHlsZXMJCT0gTW9kYWwgU3R5bGVzCi1GaWxlX0RpYWxvZ19TdHlsZXMJPSBGaWxlIERpYWxvZyBTdHlsZXMKLUl0ZW1fU3R5bGVzCQkJPSBJdGVtIFN0eWxlcwotRGlhbG9nX1Jlc3VsdAkJPSBEaWFsb2cgUmVzdWx0Ci1Db2xvckRpYWxvZwkJCT0gQ29sb3JEaWFsb2cKLURpcmVjdG9yeURpYWxvZwkJPSBEaXJlY3RvcnlEaWFsb2cKLUZpbGVEaWFsb2cJCQk9IEZpbGVEaWFsb2cKLUZvbnREaWFsb2cJCQk9IEZvbnREaWFsb2cKLVByaW50RGlhbG9nCQkJPSBQcmludERpYWxvZwotTWVzc2FnZUJveAkJCT0gTWVzc2FnZUJveAotTXVsdGlfbGluZQkJCT0gQSBtdWx0aSBsaW5lIHRleHQgd2lkZ2V0LgotRXhhbXBsZV9zdHJpbmcJCT0gVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4KLUhlYWRlcl9WaXNpYmxlCQk9IEhlYWRlciBWaXNpYmxlCi1Tb3J0X0luZGljYXRvcgkJPSBTb3J0IEluZGljYXRvcgotSGVhZGVyX0ltYWdlcwkJPSBIZWFkZXIgSW1hZ2VzCi1TdWJfSW1hZ2VzCQkJPSBTdWIgSW1hZ2VzCi1MaW5lc19WaXNpYmxlCQk9IExpbmVzIFZpc2libGUKLU1vdmVhYmxlX0NvbHVtbnMJPSBNb3ZlYWJsZSBDb2x1bW5zCi1SZXNpemFibGVfQ29sdW1ucwk9IFJlc2l6YWJsZSBDb2x1bW5zCi1NdWx0aXBsZV9Db2x1bW5zCT0gTXVsdGlwbGUgQ29sdW1ucwotTG9ja2VkCQkJCT0gTG9ja2VkCi1Db21ib19jaGlsZAkJCT0gQ29tYm8gQ2hpbGQKLU5vZGVfMQkJCQk9IE5vZGUgMQotTm9kZV8yCQkJCT0gTm9kZSAyCi1Ob2RlXzMJCQkJPSBOb2RlIDMKLU5vZGVfNAkJCQk9IE5vZGUgNAotTm9kZV8xXzEJCQk9IE5vZGUgMS4xCi1Ob2RlXzJfMQkJCT0gTm9kZSAyLjEKLU5vZGVfM18xCQkJPSBOb2RlIDMuMQotTm9kZV8yXzIJCQk9IE5vZGUgMi4yCi1Ob2RlXzJfMl8xCQkJPSBOb2RlIDIuMi4xCi1QYXJlbnQJCQkJPSBQYXJlbnQKLU5vX1BhcmVudAkJCT0gTm8gUGFyZW50Ci1EZWNvcmF0aW9uX1N0eWxlcwk9IERlY29yYXRpb24gU3R5bGVzCi1DcmVhdGVfU2hlbGwJCT0gQ3JlYXRlIFNoZWxsCi1DbG9zZV9BbGxfU2hlbGxzCT0gQ2xvc2UgQWxsIFNoZWxscwotUHVzaAkJCQk9IFB1c2gKLVJhZGlvCQkJCT0gUmFkaW8KLUNoZWNrCQkJCT0gQ2hlY2sKLUNhc2NhZGUJCQkJPSBDYXNjYWRlCi1Ecm9wX0Rvd24JCQk9IERyb3AgRG93bgotSW1hZ2VzX2ZhaWxlZAkJPSBXYXJuaW5nOiBGYWlsZWQgdG8gbG9hZCBpbWFnZXMKLXJlYWRtZV90eHQJCQk9IHJlYWRtZS50eHQKLUluZGV4CQkJCT0gSW5kZXg6Ci1UaXRsZQkJCQk9IFRpdGxlOgotQ2xvc2UJCQkJPSBDbG9zZQotUmVzdWx0CQkJCT0gUmVzdWx0OiB7MH0KLUZpbHRlck5hbWVfMAkJPSBUZXh0IEZpbGVzCi1GaWx0ZXJOYW1lXzEJCT0gQmF0Y2ggRmlsZXMKLUZpbHRlck5hbWVfMgkJPSBEb2MgRmlsZXMKLUZpbHRlck5hbWVfMwkJPSBBbGwgRmlsZXMKLVRhYmxlVGl0bGVfMAkJPSBOYW1lCi1UYWJsZVRpdGxlXzEJCT0gVHlwZQotVGFibGVUaXRsZV8yCQk9IFNpemUKLVRhYmxlVGl0bGVfMwkJPSBNb2RpZmllZAotVGFibGVMaW5lMF8wCQk9IDxlbXB0eT4KLVRhYmxlTGluZTBfMQkJPSBjbGFzc2VzCi1UYWJsZUxpbmUwXzIJCT0gMAotVGFibGVMaW5lMF8zCQk9IHRvZGF5Ci1UYWJsZUxpbmUxXzAJCT0gPGVtcHR5PgotVGFibGVMaW5lMV8xCQk9IGRhdGFiYXNlcwotVGFibGVMaW5lMV8yCQk9IDI1NTYKLVRhYmxlTGluZTFfMwkJPSB0b21vcnJvdwotVGFibGVMaW5lMl8wCQk9IDxlbXB0eT4KLVRhYmxlTGluZTJfMQkJPSBpbWFnZXMKLVRhYmxlTGluZTJfMgkJPSA5MTU3MQotVGFibGVMaW5lMl8zCQk9IHllc3RlcmRheQotTGlzdERhdGEwXzAJCQk9IExpbmUgMQotTGlzdERhdGEwXzEJCQk9IExpbmUgMgotTGlzdERhdGEwXzIJCQk9IExpbmUgMwotTGlzdERhdGEwXzMJCQk9IExpbmUgNAotTGlzdERhdGEwXzQJCQk9IExpbmUgNQotTGlzdERhdGEwXzUJCQk9IExpbmUgNgotTGlzdERhdGEwXzYJCQk9IExpbmUgNwotTGlzdERhdGEwXzcJCQk9IExpbmUgOAotTGlzdERhdGEwXzgJCQk9IExvbmdlc3QgTGluZSBJbiBMaXN0Ci1MaXN0RGF0YTFfMAkJCT0gQXBwbGVzCi1MaXN0RGF0YTFfMQkJCT0gT3JhbmdlcwotTGlzdERhdGExXzIJCQk9IEJhbmFuYXMKLUxpc3REYXRhMV8zCQkJPSBHcmFwZWZydWl0Ci1MaXN0RGF0YTFfNAkJCT0gUGVhY2hlcwotTGlzdERhdGExXzUJCQk9IEtpd2kKLUxpc3REYXRhMV82CQkJPSBBcHJpY290cwotTGlzdERhdGExXzcJCQk9IFN0cmF3YmVycmllcwotTGlzdERhdGExXzgJCQk9IFRoZSBMb25nZXN0IFN0cmluZwotRHJvcERvd25EYXRhXzAJCT0gQXBwbGVzCi1Ecm9wRG93bkRhdGFfMQkJPSBPcmFuZ2VzCi1Ecm9wRG93bkRhdGFfMgkJPQotRHJvcERvd25EYXRhXzMJCT0gR3JhcGVmcnVpdAotRHJvcERvd25EYXRhXzQJCT0gUGVhY2hlcwotRHJvcERvd25EYXRhXzUJCT0gS2l3aQotRHJvcERvd25EYXRhXzYJCT0KLURyb3BEb3duRGF0YV83CQk9IFN0cmF3YmVycmllcwotRHJvcERvd25EYXRhXzgJCT0gVGhlIExvbmdlc3QgU3RyaW5nCi1Db2xvcnMgCQkJCT0gQ29sb3JzIGFuZCBGb250Ci1DaGFuZ2UJCQkJPSAmQ2hhbmdlLi4uCi1EZWZhdWx0cwkJCT0gJkRlZmF1bHRzCi1Gb3JlZ3JvdW5kX0NvbG9yCT0gRm9yZWdyb3VuZCBDb2xvcgotQmFja2dyb3VuZF9Db2xvcgk9IEJhY2tncm91bmQgQ29sb3IKLUZvbnQJCQkJPSBGb250Ci1JdGVtX0ZvcmVncm91bmRfQ29sb3IJPSBJdGVtIDAgRm9yZWdyb3VuZCBDb2xvcgotSXRlbV9CYWNrZ3JvdW5kX0NvbG9yCT0gSXRlbSAwIEJhY2tncm91bmQgQ29sb3IKLUl0ZW1fRm9udAkJCQk9IEl0ZW0gMCBGb250Ci1DZWxsX0ZvcmVncm91bmRfQ29sb3IJPSBJdGVtIDAgQ29sIDEgRm9yZWdyb3VuZCBDb2xvcgotQ2VsbF9CYWNrZ3JvdW5kX0NvbG9yCT0gSXRlbSAwIENvbCAxIEJhY2tncm91bmQgQ29sb3IKLUNlbGxfRm9udAkJCQk9IEl0ZW0gMCBDb2wgMSBGb250Ci1XcmFwX1RleHQJCQk9IEphY2sgYW5kIEppbGwgd2VudCB1cCB0aGUgaGlsbCB0byBmZXRjaCBhIHBhaWwgb2Ygd2F0ZXIsIFwKLQkJCQkJICBKYWNrIGZlbGwgZG93biBhbmQgYnJva2UgaGlzIGNyb3duIGFuZCBKaWxsIGNhbWUgdHVtYmxpbmcgYWZ0ZXIhCi1Gb3JlZ3JvdW5kX1N0eWxlCT0gRm9yZWdyb3VuZAotQmFja2dyb3VuZF9TdHlsZSAJPSBCYWNrZ3JvdW5kCi1TdHlsZWRUZXh0X1N0eWxlcwk9IFRleHQgU3R5bGVzCi1TdHlsZWRUZXh0X1N0eWxlX0luc3RydWN0aW9ucwk9IFNlbGVjdCB0ZXh0LCB0aGVuIHN0eWxlLgotQm9sZAkJCQk9IEJvbGQKLUl0YWxpYwkJCQk9IEl0YWxpYwotVW5kZXJsaW5lCQkJPSBVbmRlcmxpbmUKLVN0cmlrZW91dAkJCT0gU3RyaWtlb3V0Ci1GaWxsX1gJCQkJPSBIb3Jpem9udGFsIEZpbGwKLUZpbGxfWQkJCQk9IFZlcnRpY2FsIEZpbGwKLVBhY2tfQ29sdW1ucwkJPSBQYWNrIENvbHVtbnMKLVRhYkl0ZW0xXzAJCQk9IFRhYiAwCi1UYWJJdGVtMV8xCQkJPSBUYWIgMQotVGFiSXRlbTFfMgkJCT0gVGFiIDIKLVRhYkl0ZW1fY29udGVudAkJPSBUYWJJdGVtIENvbnRlbnQKLUNUYWJJdGVtMV8wCQkJPSBDVGFiSXRlbSAwCi1DVGFiSXRlbTFfMQkJCT0gQ1RhYkl0ZW0gMQotQ1RhYkl0ZW0xXzIJCQk9IENUYWJJdGVtIDIgaGFzIGEgbG9uZyBuYW1lCi1DSXRlbV9Db2xvcnMJCT0gQ1RhYkl0ZW0gQ29sb3JzCi1DVGFiSXRlbV9jb250ZW50CT0gQ1RhYkl0ZW0gQ29udGVudAotU2V0X1NpbXBsZV9UYWJzCQk9IFNpbXBsZSBUYWJzCi1TZXRfU2luZ2xlX1RhYnMJCT0gU2luZ2xlIFRhYgotU2V0X01pbl9WaXNpYmxlICAgICA9IE1pbmltaXplCi1TZXRfTWF4X1Zpc2libGUgICAgID0gTWF4aW1pemUKLVNldF9VbnNlbGVjdGVkX0Nsb3NlX1Zpc2libGUgPSBDbG9zZSBvbiBVbnNlbGVjdGVkIFRhYnMKLVNldF9VbnNlbGVjdGVkX0ltYWdlX1Zpc2libGUgPSBJbWFnZSBvbiBVbnNlbGVjdGVkIFRhYnMKLVNlbGVjdGlvbl9Gb3JlZ3JvdW5kX0NvbG9yID0gU2VsZWN0aW9uIEZvcmVncm91bmQgQ29sb3IKLVNlbGVjdGlvbl9CYWNrZ3JvdW5kX0NvbG9yID0gU2VsZWN0aW9uIEJhY2tncm91bmQgQ29sb3IKLVNldF9JbWFnZQkJCT0gU2V0IEltYWdlCi1UYWJsZVRyZWVfY29sdW1uCT0gQ29sdW1uCi1NZW51SXRlbV9DdXQJCT0gQ3UmdAlDdHJsK1gKLU1lbnVJdGVtX0NvcHkJCT0gJkNvcHkJQ3RybCtDCi1NZW51SXRlbV9QYXN0ZQkJPSAmUGFzdGUJQ3RybCtWCi1NZW51SXRlbV9TZWxlY3RBbGwJPSBTZWxlY3QgJkFsbAlDdHJsK0EKLU9yaWVudGF0aW9uIAkJPSBPcmllbnRhdGlvbgotRGVmYXVsdCAJCQk9IERlZmF1bHQgKEluaGVyaXQpCi1JbWFnZXMJCQkJPSBJbWFnZXMKLUFjY2VsZXJhdG9ycwkJPSBBY2NlbGVyYXRvcnMKLU1uZW1vbmljcwkJCT0gTW5lbW9uaWNzCi1TdWJNZW51CQkJCT0gU3ViLU1lbnUKLVN1YlN1Yk1lbnUJCQk9IFN1Yi1TdWItTWVudQotMVJhZGlvCQkJCT0gUmFkaW8xCi0yUmFkaW8JCQkJPSBSYWRpbzIKLTFSYWRpb1dpdGhNbmVtb25pYwk9IFJhZGlvJjEKLTJSYWRpb1dpdGhNbmVtb25pYwk9IFJhZGlvJjIKLVB1c2hXaXRoTW5lbW9uaWMJPSAmUHVzaAotUmFkaW9XaXRoTW5lbW9uaWMJPSAmUmFkaW8KLUNoZWNrV2l0aE1uZW1vbmljCT0gJkNoZWNrCi1DYXNjYWRlV2l0aE1uZW1vbmljCT0gQyZhc2NhZGUKLVBvcHVwTWVudUhlcmUJCT0gUG9wdXAgTWVudSBIZXJlCi1MaW5rVGV4dD1WaXNpdCB0aGUgPEEgSFJFRj1cInd3dy5lY2xpcHNlLm9yZ1wiPkVjbGlwc2Uub3JnPC9BPiBwcm9qZWN0IGFuZCB0aGUgPEEgSFJFRj1cInd3dy5lY2xpcHNlLm9yZ1xcc3d0Ij5TV1Q8L0E+IGhvbWVwYWdlLgotVG9vbHRpcAkJCQk9IFRvb2x0aXA6ICB7MH0KLUl0ZW0xX1RleHQJCQk9IFdoYXQgaXMgeW91ciBmYXZvcml0ZSBidXR0b24/Ci1JdGVtMl9UZXh0CQkJPSBXaGF0IGlzIHlvdXIgZmF2b3JpdGUgaWNvbj8KLVRvb2xUaXBfVGl0bGUJCT0gRm94ZXMgdnMuIERvZ3MKLU5vX0ljb24JCQkJPSBObyBJY29uCi1TaG93X0luX1RyYXkJCT0gU2hvdyBJbiBUcmF5Ci1Ccm93c2VyTm90Rm91bmQJCT0gQnJvd3NlciBub3QgZm91bmQ6ICB7MH0KLU1vemlsbGFOb3RGb3VuZAkJPSBDYW5ub3QgdXNlIFNXVC5NT1pJTExBIHN0eWxlOiAgezB9XG5TZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvZmFxLnBocCNob3d1c2Vtb3ppbGxhIGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19maWxldmlld2VyLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ZpbGV2aWV3ZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjZGRjZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ZpbGV2aWV3ZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRpdGxlID0gU1dUIEZpbGVWaWV3ZXIgLSB7MH0KLQotbWVudS5GaWxlLnRleHQgPSAmRmlsZQotbWVudS5GaWxlLkNsb3NlLnRleHQgPSAmQ2xvc2UKLW1lbnUuRmlsZS5TaW11bGF0ZU9ubHkudGV4dCA9IFNpbXVsYXRlIEZpbGUgT3BlcmF0aW9ucwotbWVudS5IZWxwLnRleHQgPSAmSGVscAotbWVudS5IZWxwLkFib3V0LnRleHQgPSAmQWJvdXQKLQotdG9vbC5DdXQudGlwdGV4dCA9IEN1dAotdG9vbC5Db3B5LnRpcHRleHQgPSBDb3B5Ci10b29sLkRlbGV0ZS50aXB0ZXh0ID0gRGVsZXRlCi10b29sLlBhcmVudC50aXB0ZXh0ID0gUGFyZW50Ci10b29sLlBhc3RlLnRpcHRleHQgPSBQYXN0ZQotdG9vbC5QcmludC50aXB0ZXh0ID0gUHJpbnQKLXRvb2wuUmVmcmVzaC50aXB0ZXh0ID0gUmVmcmVzaAotdG9vbC5SZW5hbWUudGlwdGV4dCA9IFJlbmFtZQotdG9vbC5TZWFyY2gudGlwdGV4dCA9IFNlYXJjaAotCi1kZXRhaWxzLkFsbEZvbGRlcnMudGV4dCA9IEFsbCBGb2xkZXJzCi1kZXRhaWxzLkNvbnRlbnRzT2YudGV4dCA9IENvbnRlbnRzIG9mICcnezB9JycKLWRldGFpbHMuRmlsZVNpemUudGV4dCA9IHswfSBieXRlcwotZGV0YWlscy5EaXJOdW1iZXJPZk9iamVjdHMudGV4dCA9IHswfSBvYmplY3QocykKLWRldGFpbHMuTnVtYmVyT2ZTZWxlY3RlZEZpbGVzLnRleHQgPSB7MH0gb2JqZWN0KHMpIHNlbGVjdGVkCi0KLXRhYmxlLk5hbWUudGl0bGUgPSBOYW1lCi10YWJsZS5TaXplLnRpdGxlID0gU2l6ZQotdGFibGUuVHlwZS50aXRsZSA9IFR5cGUKLXRhYmxlLk1vZGlmaWVkLnRpdGxlID0gTW9kaWZpZWQKLQotZmlsZXR5cGUuVW5rbm93biA9IHswfSBGaWxlCi1maWxldHlwZS5Ob25lID0gRmlsZQotZmlsZXR5cGUuRm9sZGVyID0gRm9sZGVyCi1maWxlc2l6ZS5LQiA9IHswfSBrYgotCi1kaWFsb2cuQWJvdXQudGl0bGUgPSBBYm91dCBTV1QgRmlsZVZpZXdlcgotZGlhbG9nLkFib3V0LmRlc2NyaXB0aW9uID0gU1dUIEZpbGVWaWV3ZXJcblxuVmVyc2lvbjogMC45XG5cblJ1bm5pbmcgb246IHswfQotCi1kaWFsb2cuTm90SW1wbGVtZW50ZWQudGl0bGUgPSBOb3QgSW1wbGVtZW50ZWQKLWRpYWxvZy5BY3Rpb25Ob3RJbXBsZW1lbnRlZC5kZXNjcmlwdGlvbiA9IFNvcnJ5ISAgVGhlIGFjdGlvbiB5b3Ugc2VsZWN0ZWQgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLgotCi1kaWFsb2cuRmFpbGVkQ29weS50aXRsZSA9IENvcHkgRmlsZXMgRXJyb3IKLWRpYWxvZy5GYWlsZWRDb3B5LmRlc2NyaXB0aW9uID0gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGNvcHkgInswfSIgdG8gInsxfSIuCi0KLWRpYWxvZy5GYWlsZWREZWxldGUudGl0bGUgPSBEZWxldGUgRmlsZXMgRXJyb3IKLWRpYWxvZy5GYWlsZWREZWxldGUuZGVzY3JpcHRpb24gPSBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZGVsZXRlICJ7MH0iLgotCi1wcm9ncmVzc0RpYWxvZy5jYW5jZWxCdXR0b24udGV4dCA9IENhbmNlbAotcHJvZ3Jlc3NEaWFsb2cuQ29weS50aXRsZSA9IENvcHkgRmlsZXMKLXByb2dyZXNzRGlhbG9nLkNvcHkuZGVzY3JpcHRpb24gPSBDb3B5aW5nIGZpbGVzLgotcHJvZ3Jlc3NEaWFsb2cuQ29weS5vcGVyYXRpb24gPSBDb3B5aW5nLi4uIHswfQotcHJvZ3Jlc3NEaWFsb2cuTW92ZS50aXRsZSA9IE1vdmUgRmlsZXMKLXByb2dyZXNzRGlhbG9nLk1vdmUuZGVzY3JpcHRpb24gPSBNb3ZpbmcgZmlsZXMuCi1wcm9ncmVzc0RpYWxvZy5EZWxldGUub3BlcmF0aW9uID0gRGVsZXRpbmcuLi4gezB9Ci0KLXNpbXVsYXRlLkNvcHlGcm9tVG8udGV4dCA9IFNpbXVsYXRlZCBjb3B5IGZyb20gInswfSIgdG8gInsxfSIuCi1zaW11bGF0ZS5EaXJlY3Rvcmllc0NyZWF0ZWQudGV4dCA9IFNpbXVsYXRlZCBkaXJlY3RvcmllcyBjcmVhdGVkIGZvciAiezB9Ii4KLXNpbXVsYXRlLkRlbGV0ZS50ZXh0ID0gU2ltdWxhdGVkIGRlbGV0ZSBvZiAiezB9Ii4KLQotZXJyb3IuRmFpbGVkTGF1bmNoLm1lc3NhZ2UgPSBDb3VsZCBub3QgbGF1bmNoICJ7MH0iCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2dyYXBoaWNzLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2dyYXBoaWNzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjViMzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19ncmFwaGljcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUdyYXBoaWNzRXhhbXBsZT1HcmFwaGljcyBFeGFtcGxlCi1TV1RHcmFwaGljcz1TV1QgR3JhcGhpY3MKLVdhcm5pbmc9V2FybmluZwotTGliTm90Rm91bmQ9QWR2YW5jZWQgZ3JhcGhpY3MgbGlicmFyeSBub3QgZm91bmQuIFNvbWUgZXhhbXBsZXMgd2lsbCBub3QgZGlzcGxheS4KLVNldHRpbmdzPVNldHRpbmdzCi1QbGF5PVBsYXkKLVBhdXNlPVBhdXNlCi1CYWNrZ3JvdW5kPUJhY2tncm91bmQKLURvdWJsZUJ1ZmZlcj1Eb3VibGUgQnVmZmVyCi1XaGl0ZT1XaGl0ZQotQmxhY2s9QmxhY2sKLVJlZD1SZWQKLUdyZWVuPUdyZWVuCi1CbHVlPUJsdWUKLUN5YW49Q3lhbgotWWVsbG93PVllbGxvdwkKLUN1c3RvbUNvbG9yPUN1c3RvbSBDb2xvcgotQ3VzdG9tUGF0dGVybj1DdXN0b20gUGF0dGVybgotUGF0dGVybjE9UGluayBMb3NhbmdlCi1QYXR0ZXJuMj1QdXJwbGUgQ2hlY2tlcnMKLVBhdHRlcm4zPUJsdWUgUGVudGFnb24KLUFuaW1hdGlvbj1BbmltYXRpb24KLVN0YXJQb2x5Z29uPVN0YXIgUG9seWdvbgotTGluZT1MaW5lCi1CbGFja0hvbGU9QmxhY2sgSG9sZQotRmlsbFJ1bGU9RmlsbCBSdWxlOgotUG9seWdvbnM9UG9seWdvbnMKLUludHJvZHVjdGlvbj1JbnRyb2R1Y3Rpb24KLVNXVD1TV1QKLUJvdW5jZT1Cb3VuY2UKLUZvbnQ9Rm9udAotTWlzYz1NaXNjCi1Db3VudGRvd249Q291bnRkb3duCi1MaW5lV2lkdGg9TGluZSBXaWR0aAotQW50aWFsaWFzaW5nPUFudGlhbGlhc2luZwotTGluZUNhcD1MaW5lIENhcAotU3BpcmFsPVNwaXJhbAotUGV0YWxzPVBldGFscwotR3JhZGllbnQ9R3JhZGllbnQKLUdyYWRJbWFnZT1HcmFkaWVudCBJbWFnZQotU3dhcENvbG9ycz1Td2FwIENvbG9ycwotQ3VydmVzPUN1cnZlcwotQ3ViaWM9Q3ViaWMKLVF1YWRyYXRpYz1RdWFkcmF0aWMKLUxpbmVzPUxpbmVzCi1GbGF0PUZsYXQKLVNxdWFyZT1TcXVhcmUKLVJvdW5kPVJvdW5kCi1MaW5lU3R5bGVzPUxpbmUgU3R5bGVzCi1HcmFkaWVudERsZ01zZz1QbGVhc2Ugc2VsZWN0IHR3byBjb2xvcnM6Ci1HcmFkaWVudERsZ0J1dHRvbjE9Q29sb3IgMQotR3JhZGllbnREbGdCdXR0b24yPUNvbG9yIDIKLUdyYWRpZW50VGFiSXRlbTE9Q29sb3IgMQotR3JhZGllbnRUYWJJdGVtMj1Db2xvciAyCi1BbHBoYT1BbHBoYQotQ3VzdG9tRm9udD1DdXN0b20gRm9udAotUmVndWxhcj1SZWd1bGFyCi1JdGFsaWM9SXRhbGljCi1Cb2xkPUJvbGQKLUJvbGRJdGFsaWM9Qm9sZCBJdGFsaWMKLUZvbnRGYWNlPUZhY2UKLUZvbnRTdHlsZT1TdHlsZQotRm9udFNpemU9U2l6ZQotQ29sb3I9Q29sb3IKLUNsaXBwaW5nPUNsaXBwaW5nCi1QYXRoQ2xpcHBpbmc9UGF0aCBDbGlwcGluZwotQ2lyY2xlcz1DaXJjbGVzCi1SZWN0YW5nbGU9UmVjdGFuZ2xlCi1PdmFsPU92YWwKLVdvcmQ9V29yZAotU3Rhcj1TdGFyCi1UcmlhbmdsZXM9VHJpYW5nbGVzCi1EZWZhdWx0PURlZmF1bHQKLVJlZ2lvbkNsaXBwaW5nPVJlZ2lvbiBDbGlwcGluZwotUmVnaW9uMT1SZWdpb24gMQotUmVnaW9uMj1SZWdpb24gMgotQWRkPUFkZAotU3ViPVN1YnRyYWN0Ci1JbnRlcj1JbnRlcnNlY3QKLUludGVycG9sYXRpb249SW50ZXJwb2xhdGlvbgotSW1hZ2U9SW1hZ2UKLU9yaWdpbmFsSW1nPU9yaWdpbmFsIEltYWdlCi1Ib3VzZT1Ib3VzZQotUXVlc3Rpb249UXVlc3Rpb24KLVRhc2s9VGFzawotQ3ViZT1DdWJlCi1PdmFscz1PdmFscwotTm9uZT1Ob25lCi1Mb3c9TG93Ci1EZWZhdWx0PURlZmF1bHQKLUhpZ2g9SGlnaAotVHJhbnNmb3JtPVRyYW5zZm9ybQotQ2FyZHM9Q2FyZHMKLVNvbGlkPVNvbGlkCi1EYXNoPURhc2gKLURvdD1Eb3QKLURhc2hEb3Q9RGFzaCBEb3QKLURhc2hEb3REb3Q9RGFzaCBEb3QgRG90Ci1MaW5lSm9pbj1MaW5lIEpvaW4KLWJldmVsPUJFVkVMCi1taXRlcj1NSVRFUgotcm91bmQ9Uk9VTkQKLUJhbGw9QmFsbAotQ3VzdG9tQWxwaGE9Q3VzdG9tIEFscGhhCi1NYXplPU1hemUKLXJnYj1SR0IKLUdyYXBoaWNzPUdyYXBoaWNzCi1GbGlwPUZsaXAKLVNjYWxlPVNjYWxlCi1Sb3RhdGU9Um90YXRlCi14c2NhbGU9WC1TY2FsZQoteXNjYWxlPVktU2NhbGUKLUludmVydD1JbnZlcnQKLVBhdGg9UGF0aAotUGF0aE9wZXI9UGF0aCBPcGVyYXRpb25zCi1EcmF3UGF0aD1EcmF3IFBhdGgKLUZpbGxQYXRoPUZpbGwgUGF0aAotQ2xvc2VQYXRoPUNsb3NlIFBhdGgKLUZpbGxDb2xvcj1GaWxsIENvbG9yCi1UZXh0PVRleHQKLVNoYXBlcz1TaGFwZXMKLU5leHQ9TmV4dAotQmFjaz1CYWNrCi1BbmltUGF0aENsaXBwaW5nPUFuaW1hdGVkIFBhdGggQ2xpcHBpbmcKLSMjIyMjIC0tLS0tLS0tLS0tLS0tLS0tLSBUYWIgRGVzY3JpcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLSAjIyMjIwotQWxwaGFEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYWxwaGEgYmxlbmRpbmcuIEl0IGRyYXdzIHZhcmlvdXMgc2hhcGVzIGFuZCBpbWFnZXMgYXMgYWxwaGEgdmFsdWVzIGNoYW5nZS4KLUJhbGxEZXNjcmlwdGlvbj1UaGlzIHRhYiB1c2VzIGFscGhhIGJsZW5kaW5nIHRvIHNpbXVsYXRlIFwiZ2hvc3RpbmdcIiBvZiBhIGJhbGwgaW4gbW92ZW1lbnQuCi1CbGFja0hvbGVEZXNjcmlwdGlvbj1UaGlzIGlzIGEgbWlzY2VsbGFuZW91cyBkZW1vbnN0cmF0aW9uIHRoYXQgbWFrZXMgdXNlIG9mIHRoZSBmaWxsT3ZhbCgpIG9wZXJhdGlvbiB0byBzaW11bGF0ZSBhIGJsYWNrIGhvbGUuCi1DYXJkc0Rlc2NyaXB0aW9uPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB2YXJpb3VzIHRyYW5zZm9ybWF0aW9ucywgc3VjaCBhcyBzY2FsaW5nLCByb3RhdGlvbiwgYW5kIHRyYW5zbGF0aW9uLgotQ291bnRkb3duRGVzY3JpcHRpb249VGhpcyBtaXNjZWxsYW5lb3VzIHRhYiBwcmVzZW50cyBhIGNvdW50IGRvd24gZnJvbSA1IHRvIDEsIHRoZW4gZGlzcGxheXMgU1dULgotQ3VydmVzU1dURGVzY3JpcHRpb249VGhpcyB0YWIgcHJlc2VudHMgY3ViaWMgYW5kIHF1YWRyYXRpYyBjdXJ2ZXMgdGhhdCBjYW4gYmUgZHJhd24uICBBcyBhIGRlbW9uc3RyYXRpb24sIGN1YmljIGFuZCBxdWFkcmF0aWMgY3VydmVzIGFyZSB1c2VkIHRvIHNwZWxsIG91dCBcIlNXVFwiLiAgVGhlIHVzZXIgbWF5IHJlcG9zaXRpb24gdGhlIGN1YmljIGFuZCBxdWFkcmF0aWMgaGFuZGxlcy4KLUN1cnZlc0Rlc2NyaXB0aW9uPVRoaXMgdGFiIHByZXNlbnRzIGN1YmljIGFuZCBxdWFkcmF0aWMgY3VydmVzIHRoYXQgY2FuIGJlIGRyYXduLiAgVGhlIHVzZXIgbWF5IHJlcG9zaXRpb24gdGhlIGN1YmljIGFuZCBxdWFkcmF0aWMgaGFuZGxlcwotQ3VzdG9tQWxwaGFEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBhbHBoYSBibGVuZGluZy4gIEl0IGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSBhIGN1c3RvbSBhbHBoYSB2YWx1ZS4KLUN1c3RvbUZvbnREZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdmFyaW91cyB0ZXh0IGZvbnRzLiAgSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgZm9udCBwYXJhbWV0ZXJzIHN1Y2ggYXMgZmFjZSwgc3R5bGUgYW5kIHNpemUuCi1Gb250Qm91bmNlRGVzY3JpcHRpb249VGhpcyB0YWIgaXMgYW4gYW5pbWF0ZWQgZ3JhcGhpYy4gSXQgcHJlc2VudHMgdGhlIHdvcmQgU1dUIGluIGRpZmZlcmVudCBmb250cyBhcyBpdCBib3VuY2VzIGFyb3VuZCB0aGUgc2NyZWVuLgotR3JhZGllbnRJbWFnZURlc2NyaXB0aW9uPVRoaXMgdGFiIGlzIGFuIGFuaW1hdGVkIGdyYXBoaWMuIEl0IHByZXNlbnRzIHRoZSB3b3JkIFNXVCBpbiBkaWZmZXJlbnQgZm9udHMgYXMgaXQgYm91bmNlcyBhcm91bmQgdGhlIHNjcmVlbi4KLUFudGlhbGlhc2luZ0dyYXBoaWNzRGVzYz1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYW50aWFsaWFzaW5nIGZvciBncmFwaGljcy4gQW50aWFsaWFzaW5nIGlzIHVzZWQgZm9yIHNtb290aGluZyBqYWdnZWQgZWRnZXMgaW4gZ3JhcGhpY3MuIFRoaXMgdGFiIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIGVmZmVjdHMgb2YgZGlmZmVyZW50IGFudGlhbGlhc2luZyB2YWx1ZXMuCi1GbGlwRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyBhbiBpbWFnZSBjYW4gYmUgZmxpcHBlZCBpbiB2YXJpb3VzIGZhc2hpb25zLgotU2NhbGVEZXNjcmlwdGlvbj1UaGlzIHRhYiBkZW1vbnN0cmF0ZXMgaG93IGFuIGltYWdlIGNhbiBiZSBzY2FsZWQuIFJlc2l6ZSB0aGUgc2hlbGwsIGFuZCB0aGUgaW1hZ2Ugd2lsbCBzY2FsZSB3aXRoIGl0LgotVHJhbnNmb3JtSW1nRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIHRyYW5zZm9ybWF0aW9ucywgc3VjaCBhcyBzY2FsaW5nLCByb3RhdGlvbiwgYW5kIGludmVydC4gIEl0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IHZhbHVlcyBmb3Igc2NhbGluZyBhbmQgcm90YXRpb24uCi1JbWFnZUludGVycG9sYXRpb25EZXNjPVRoaXMgdGFiIHNob3dzIHRoZSBlZmZlY3RzIG9mIGFwcGx5aW5nIHZhcmlvdXMgaW50ZXJwb2xhdGlvbiBhbGdvcml0aG1zIHRvIGltYWdlcyB0aGF0IGhhdmUgYmVlbiBzdHJldGNoZWQgb3Igc2hydW5rLgotSW50cm9kdWN0aW9uRGVzY3JpcHRpb249VGhpcyBpcyB0aGUgaW50cm9kdWN0aW9uIHRhYi4gIFRoaXMgZGVtb25zdHJhdGlvbiBtYWtlcyB1c2Ugb2YgYSBwYXRoIGNsaXBwaW5nLgotTGluZUNhcERlc2NyaXB0aW9uPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB2YXJpb3VzIGxpbmUgY2FwcyBhcHBsaWNhYmxlIHRvIGEgbGluZS4KLUxpbmVKb2luRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIHZhcmlvdXMgbGluZSBqb2lucy4gSXQgYWxsb3dzIGEgdXNlciB0byBjaG9vc2UgZnJvbSBiZXZlbCwgbWl0ZXIgYW5kIHJvdW5kLgotTGluZVN0eWxlc0Rlc2NyaXB0aW9uPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyBsaW5lIHN0eWxlcyBhcHBsaWNhYmxlIHRvIGEgbGluZS4gIEl0IHNob3dzIHRoZSB1c2Ugb2YgdGhlIHNldExpbmVTdHlsZSgpIG1ldGhvZC4KLUxpbmVEZXNjcmlwdGlvbj1UaGlzIHRhYiBkcmF3cyB0d28gbGluZXMuCi1NYXplRGVzY3JpcHRpb249VGhpcyBpcyBhIG1pc2NlbGxhbmVvdXMgZGVtb25zdHJhdGlvbi4gIFRocmVlIG9iamVjdHMgbW92ZSB0aHJvdWdoIHRoZSBtYXplLCBlYWNoIGZvbGxvd2luZyBhIGRpZmZlcmVudCBwYXRoLiAgT25seSBvbmUgb2YgdGhlIHRocmVlIGZvbGxvd3MgdGhlIGNvcnJlY3QgcGF0aC4KLUFuaW1QYXRoQ2xpcHBpbmdEZXNjPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHBhdGggY2xpcHBpbmcuICBBIGNsaXBwaW5nIGlzIHRoZSBhcmVhIG9udG8gd2hpY2ggYSBkcmF3aW5nIGlzIG1hZGUgdmlzaWJsZS4gIFRoZSBkZWZhdWx0IGNsaXBwaW5nIGlzIHRoZSBlbnRpcmUgY2FudmFzIChhbGwgdGhlIHNwYWNlIGluIHRoZSByaWdodCBwYW5lbCkuICBIb3dldmVyLCBvbmUgY2FuIHNldCB0aGUgY2xpcHBpbmcgdG8gYmUgc29tZXRoaW5nIGRpZmZlcmVudC4gIEluIHRoaXMgdGFiLCB0aGUgY2xpcHBpbmcgaXMgdGhlIHNldCBvZiB0cmlhbmdsZXMsIHJlY3RhbmdsZXMgYW5kIHRoZSBjaXJjbGUuICBXaGVuIHRoZSBibHVlIHJlY3RhbmdsZSBpcyBkcmF3biwgb25seSB0aGUgcG9ydGlvbnMgb2YgdGhlIGJsdWUgcmVjdGFuZ2xlIGFwcGVhcmluZyBpbiB0aGUgY2xpcHBpbmcgYXJlIHZpc2libGUuCi1QYXRoQ2xpcHBpbmdEZXNjPVRoaXMgdGFiIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHBhdGggY2xpcHBpbmcuICBBIGNsaXBwaW5nIGlzIHRoZSBhcmVhIG9udG8gd2hpY2ggYSBkcmF3aW5nIGlzIG1hZGUgdmlzaWJsZS4gIFRoZSBkZWZhdWx0IGNsaXBwaW5nIGlzIHRoZSBlbnRpcmUgY2FudmFzIChhbGwgdGhlIHNwYWNlIGluIHRoZSByaWdodCBwYW5lbCkuICBIb3dldmVyLCBvbmUgY2FuIHNldCB0aGUgY2xpcHBpbmcgdG8gYmUgc29tZXRoaW5nIGRpZmZlcmVudC4KLVBhdGhPcGVyRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgcGF0aHMuIEl0IGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gZmlsbGluZywgZHJhd2luZyBhbmQgY2xvc2luZyBwYXRocy4KLXJnYkRlc2NyaXB0aW9uPU1pc2NlbGxhbmVvdXMgdGFiIHRoYXQgZGVtb25zdHJhdGVzIGVtZXJnaW5nIGNvbG9ycyBmcm9tIGxheWVyaW5nIG90aGVyIGNvbG9ycy4KLVJlZ2lvbkNsaXBwaW5nRGVzY3JpcHRpb249VGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyB0byBhcHBseSBhIHJlZ2lvbiBjbGlwcGluZyBhbmQgdGhlIGVmZmVjdHMgb2YgYXBwbHlpbmcgb25lLiAgSXQgYWxzbyBkZW1vbnN0cmF0ZXMgdGhlIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCBiZXR3ZWVuIHR3byByZWdpb25zLgotU2hhcGVzRGVzY3JpcHRpb249VGhpcyB0YWIgZHJhd3MgM0Qgc2hhcGVzIChpbiAyRCkgdXNpbmcgdmFyaW91cyBsaW5lIHN0eWxlcy4KLVNwaXJhbERlc2NyaXB0aW9uPU1pc2NlbGxhbmVvdXMgdGFiIHRoYXQgcHJlc2VudHMgYSBzcGlyYWwgY29uc2lzdGluZyBvZiB0aGUgbnVtYmVyIG9mIHBldGFscyBzcGVjaWZpZWQuCi1TdGFyUG9seWdvbkRlc2NyaXB0aW9uPVRoaXMgdGFiIGRyYXdzIGEgcG9seWdvbiBhbmQgc2hvd3MgdGhlIGVmZmVjdHMgb2Ygc2V0dGluZyBkaWZmZXJlbnQgZmlsbCBydWxlczogU1dULkZJTExfV0lORElORyBvciBTV1QuRklMTF9FVkVOX09ERAotQW50aWFsaWFzaW5nVGV4dERlc2M9VGhpcyB0YWIgZGVtb25zdHJhdGVzIGFudGlhbGlhc2luZyBmb3IgdGV4dC4gQW50aWFsaWFzaW5nIGlzIHVzZWQgZm9yIHNtb290aGluZyBqYWdnZWQgZWRnZXMgaW4gZ3JhcGhpY3MuIFRoaXMgdGFiIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlIGVmZmVjdHMgb2YgZGlmZmVyZW50IGFudGlhbGlhc2luZyB2YWx1ZXMuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2hlbGxvd29ybGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaGVsbG93b3JsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQwYTE4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaGVsbG93b3JsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSGVsbG9fd29ybGQgPSBIZWxsbyBXb3JsZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaG92ZXJoZWxwLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2hvdmVyaGVscC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWNhNjNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaG92ZXJoZWxwLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMgPSBVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMgOiB7MH0KLQotVG9vbEl0ZW0udGV4dCA9IFRvb2xJdGVtIHswfQotVG9vbEl0ZW0udG9vbHRpcCA9IFRvb2x0aXAgZm9yIHswfS4gVHJ5IEYxIG9uIG1lLgotVG9vbEl0ZW0uaGVscCA9IEhlbHAgdGV4dCBmb3IgezB9LgotCi1UYWJsZUl0ZW0udGV4dCA9IFRhYmxlSXRlbSB7MH0KLVRhYmxlSXRlbS50b29sdGlwID0gVG9vbHRpcCBmb3IgezB9LiBUcnkgRjEgb24gbWUuCi1UYWJsZUl0ZW0uaGVscCA9IEhlbHAgdGV4dCBmb3IgezB9LgotCi1UcmVlSXRlbS50ZXh0ID0gVHJlZUl0ZW0gezB9Ci1UcmVlSXRlbS50b29sdGlwID0gVG9vbHRpcCBmb3IgezB9LiBUcnkgRjEgb24gbWUuCi1UcmVlSXRlbS5oZWxwID0gSGVscCB0ZXh0IGZvciB7MH0uCi0KLUhlbGxvLnRleHQgPSBIZWxsbwotSGVsbG8udG9vbHRpcCA9IEdyZWV0aW5ncyEKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaW1hZ2VzLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2ltYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjg5ODljLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfaW1hZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSW1hZ2VfYW5hbHl6ZXIgCQkJCT0gSW1hZ2UgQW5hbHl6ZXIKLU5vbmUgCQkJCQkJPSBOb25lCi1XaGl0ZSAJCQkJCQk9IFdoaXRlCi1CbGFjayAJCQkJCQk9IEJsYWNrCi1SZWQgCQkJCQkJPSBSZWQKLUdyZWVuIAkJCQkJCT0gR3JlZW4KLUJsdWUgCQkJCQkJPSBCbHVlCi1YX3NjYWxlIAkJCQkJPSBYIFNjYWxlCi1ZX3NjYWxlIAkJCQkJPSBZIFNjYWxlCi1BbHBoYV9LIAkJCQkJPSBBbHBoYS1LCi1EaXNwbGF5IAkJCQkJPSBEaXNwbGF5Ci1JbmNyZW1lbnRhbCAJCQkJPSBJbmNyZW1lbnRhbAotVHJhbnNwYXJlbnQgCQkJCT0gVHJhbnNwYXJlbnQKLVRyYW5zcGFyZW50X2xjIAkJCQk9IHRyYW5zcGFyZW50Ci1NYXNrIAkJCQkJCT0gTWFzawotQmFja2dyb3VuZCAJCQkJCT0gQmFja2dyb3VuZAotQW5pbWF0aW9uIAkJCQkJPSBBbmltYXRpb24KLVByZXZpb3VzIAkJCQkJPSA8ICZQcmV2aW91cwotTmV4dCAJCQkJCQk9ICZOZXh0ID4KLUFuaW1hdGUgCQkJCQk9ICZBbmltYXRlCi1UeXBlX2luaXRpYWwgCQkJCT0gVHlwZToKLVR5cGVfc3RyaW5nIAkJCQk9IFR5cGU6IHswfQotVHlwZV9pbmRleCAJCQkJCT0gVHlwZTogezB9IFt7MSxudW1iZXIsaW50ZWdlcn0gb2YgezIsbnVtYmVyLGludGVnZXJ9XQotU2l6ZV9pbml0aWFsIAkJCQk9IFNpemU6Ci1TaXplX3ZhbHVlIAkJCQkJPSBTaXplOiB7MCxudW1iZXIsaW50ZWdlcn0geCB7MSxudW1iZXIsaW50ZWdlcn0KLURlcHRoX2luaXRpYWwgCQkJCT0gRGVwdGg6Ci1EZXB0aF92YWx1ZSAJCQkJPSBEZXB0aDogezB9Ci1UcmFuc3BhcmVudF9waXhlbF9pbml0aWFsIAk9IFRyYW5zcGFyZW50IHBpeGVsOgotVHJhbnNwYXJlbnRfcGl4ZWxfdmFsdWUJCT0gVHJhbnNwYXJlbnQgcGl4ZWw6IHswfQotVGltZV90b19sb2FkX2luaXRpYWwgCQk9IFRpbWUgdG8gbG9hZDoKLVRpbWVfdG9fbG9hZF92YWx1ZQkJCT0gVGltZSB0byBsb2FkOiB7MH0gbXMKLUFuaW1hdGlvbl9zaXplX2luaXRpYWwgCQk9IEFuaW1hdGlvbiBzaXplOgotQW5pbWF0aW9uX3NpemVfdmFsdWUgCQk9IEFuaW1hdGlvbiBzaXplOiB7MCxudW1iZXIsaW50ZWdlcn0geCB7MSxudW1iZXIsaW50ZWdlcn0KLUJhY2tncm91bmRfcGl4ZWxfaW5pdGlhbCAJPSBCYWNrZ3JvdW5kIHBpeGVsOgotQmFja2dyb3VuZF9waXhlbF92YWx1ZSAJCT0gQmFja2dyb3VuZCBwaXhlbDogezB9Ci1JbWFnZV9sb2NhdGlvbl9pbml0aWFsIAkJPSBJbWFnZSBsb2NhdGlvbjoKLUltYWdlX2xvY2F0aW9uX3ZhbHVlIAkJPSBJbWFnZSBsb2NhdGlvbjogKHswLG51bWJlcixpbnRlZ2VyfSwgezEsbnVtYmVyLGludGVnZXJ9KQotRGlzcG9zYWxfaW5pdGlhbCAJCQk9IERpc3Bvc2FsOgotRGlzcG9zYWxfdmFsdWUgCQkJCT0gRGlzcG9zYWw6IHswLG51bWJlcixpbnRlZ2VyfSAoezF9KQotRGVsYXlfaW5pdGlhbCAJCQkJPSBEZWxheToKLURlbGF5X3ZhbHVlIAkJCQk9IERlbGF5OiB7MCxudW1iZXIsaW50ZWdlcn0gbXMgKHVzaW5nIHsxLG51bWJlcixpbnRlZ2VyfSBtcykKLURlbGF5X3VzZWQgCQkJCQk9IERlbGF5OiB7MCxudW1iZXIsaW50ZWdlcn0gbXMKLVJlcGVhdHNfaW5pdGlhbCAJCQk9IFJlcGVhdHM6Ci1SZXBlYXRzX3ZhbHVlIAkJCQk9IFJlcGVhdHM6IHswLG51bWJlcixpbnRlZ2VyfQotUmVwZWF0c19mb3JldmVyIAkJCT0gUmVwZWF0czogezAsbnVtYmVyLGludGVnZXJ9IChmb3JldmVyKQotUGFsZXR0ZV9pbml0aWFsIAkJCT0gUGFsZXR0ZToKLVBhbGV0dGVfZGlyZWN0IAkJCQk9IFBhbGV0dGU6IERpcmVjdAotUGFsZXR0ZV92YWx1ZSAJCQkJPSBQYWxldHRlIHNpemU6IHswLG51bWJlcixpbnRlZ2VyfQotTWF4X2xlbmd0aF9zdHJpbmcgCQkJPSBUcmFuc3BhcmVudCBwaXhlbDogLTEgKG5vbmUpCi1QaXhlbF9kYXRhX2luaXRpYWwgCQkJPSBQaXhlbCBkYXRhOgotUGl4ZWxfZGF0YV92YWx1ZSAJCQk9IFBpeGVsIGRhdGE6ICBCeXRlcyBwZXIgbGluZTogezAsbnVtYmVyLGludGVnZXJ9ICBcCi0JCQkJCQkJICBTY2FubGluZSBwYWQ6IHsxLG51bWJlcixpbnRlZ2VyfSB7Mn0gIHszfQotRGVwdGhfaW5mbyAJCQkJCT0gRGVwdGg6IHswLG51bWJlcixpbnRlZ2VyfSAtLSB7MX0KLU9uZV9ieXRlIAkJCQkJPSAxIGJ5dGUgcGVyIHBpeGVsCi1NdWx0aV9ieXRlcyAJCQkJPSB7MCxudW1iZXIsaW50ZWdlcn0gYnl0ZXMgcGVyIHBpeGVsCi1NdWx0aV9waXhlbHMgCQkJCT0gezAsbnVtYmVyLGludGVnZXJ9IHBpeGVscyBwZXIgYnl0ZSB7MX0KLVNjcm9sbF9mb3JfYWxwaGEJCQk9IChTY3JvbGwgZG93biB0byBzZWUgYWxwaGEgZGF0YSkKLUZpbGUgCQkJCQkJPSAmRmlsZQotT3BlbkZpbGUgCQkJCQk9ICZPcGVuIEZpbGUuLi5cdEN0cmwrTwotT3BlblVSTAkJCQkJCT0gT3BlbiAmVVJMLi4uXHRDdHJsK1UKLVJlb3BlbiAJCQkJCQk9ICZSZW9wZW4KLUxvYWRGaWxlIAkJCQkJPSAmTG9hZCBGaWxlLi4uXHRDdHJsK0wKLVNhdmUgCQkJCQkJPSAmU2F2ZVx0Q3RybCtTCi1TYXZlX2FzIAkJCQkJPSBTYXZlICZBcy4uLgotU2F2ZV9tYXNrX2FzIAkJCQk9IFNhdmUgJk1hc2sgQXMuLi4KLVByaW50IAkJCQkJCT0gJlByaW50XHRDdHJsK1AKLUV4aXQgCQkJCQkJPSBFJnhpdAotQWxwaGEgCQkJCQkJPSBBbHBoYQotT3BlblVSTERpYWxvZwkJCQk9IE9wZW4gVVJMCi1FbnRlclVSTAkJCQkJPSBFbnRlciB0aGUgVVJMIGZvciBhbiBpbWFnZSAoYm1wLCBnaWYsIGljbywgamZpZiwganBlZywganBnLCBwbmcsIHRpZiwgdGlmZik6Ci1BbGxfaW1hZ2VzIAkJCQkJPSBBbGwgSW1hZ2UgRmlsZXMKLUxvYWRpbmdfbGMgCQkJCQk9IGxvYWRpbmcKLVNhdmluZ19sYyAJCQkJCT0gc2F2aW5nCi1Vbmtub3duX2V4dGVuc2lvbiAJCQk9IFVua25vd24gZmlsZSBleHRlbnNpb246IHswfVxuUGxlYXNlIHVzZSBibXAsIGdpZiwgaWNvLCBqZmlmLCBqcGVnLCBqcGcsIHBuZywgdGlmLCBvciB0aWZmLgotT3ZlcndyaXRlIAkJCQkJPSBPdmVyd3JpdGUgezB9PwotU2F2ZV9hbGwJCQkJCT0gU2F2ZSBhbGwgezB9IGltYWdlcyBpbnRvIGEgbXVsdGktaW1hZ2UgZmlsZT8KLUFuYWx5emVyX29uIAkJCQk9IEltYWdlIEFuYWx5emVyIG9uOiB7MH0KLVJlbG9hZGluZ19sYyAJCQkJPSByZWxvYWRpbmcKLUNvbG9yX2F0IAkJCQkJPSBJbWFnZSBjb2xvciBhdCAoezAsbnVtYmVyLGludGVnZXJ9LCB7MSxudW1iZXIsaW50ZWdlcn0pIFwKLQkJCQkJCQkgIC0gcGl4ZWwgezIsbnVtYmVyLGludGVnZXJ9IFsweHszfV0gLSBpcyB7NH0gWzB4ezV9XSB7Nn0KLVJHQgkJCQkJCQk9IFJHQiAneyd7MH0sIHsxfSwgezJ9J30nCi1SR0JBCQkJCQkJPSBSR0JBICd7J3swfSwgezF9LCB7Mn0sIHszfSd9JwotQ29sb3JfYXRfdHJhbnNwYXJlbnQJCT0gKHRyYW5zcGFyZW50KQotQ3JlYXRpbmdfaW1hZ2UgCQkJCT0gQ3JlYXRpbmcgaW1hZ2UgIyB7MCxudW1iZXIsaW50ZWdlcn0gZnJvbSAKLU9LCQkJCQkJCT0gT0sKLUNhbmNlbAkJCQkJCT0gQ2FuY2VsCi1TdG9wIAkJCQkJCT0gJlN0b3AKLUNyZWF0aW5nX2Zyb20gCQkJCT0gQ3JlYXRpbmcgaW1hZ2UgcmVhZCBmcm9tCi1CeXRlc19wZXJfbGluZSAJCQkJPSBCeXRlcyBwZXIgbGluZToKLVNjYW5saW5lX3BhZCAJCQkJPSBTY2FubGluZSBwYWQ6Ci1QcmludGluZ19lcnJvcgkJCQk9IFByaW50aW5nIGVycm9yOiAKLUVycm9yIAkJCQkJCT0gRXJyb3IgezB9IGZpbGVcbnsxfVxuXG4KLVVuc3VwcG9ydGVkX2xjIAkJCQk9IHVuc3VwcG9ydGVkCi1Ob25lX2xjIAkJCQkJPSBub25lCi1CYWNrZ3JvdW5kX2xjIAkJCQk9IGJhY2tncm91bmQKLVByZXZpb3VzX2xjIAkJCQk9IHByZXZpb3VzCi1VbnNwZWNpZmllZF9sYyAJCQkJPSB1bnNwZWNpZmllZAotVW5rbm93bl9hYyAJCQkJCT0gVU5LTk9XTgotRm9yZXZlcl9sYyAJCQkJCT0gZm9yZXZlcgotU2F2ZV9hc190eXBlCQkJCT0gU2F2ZSBBcyBCTVAgVHlwZS4uLgotU2F2ZV9hc190eXBlX2xhYmVsCQkJPSBTZWxlY3QgdGhlIHR5cGUgb2YgQk1QIHRvIHNhdmUgYXM6Ci1TYXZlX2FzX3R5cGVfbm9fY29tcHJlc3MJPSBObyBDb21wcmVzc2lvbgotU2F2ZV9hc190eXBlX3JsZV9jb21wcmVzcwk9IFJMRSBDb21wcmVzc2lvbgotU2F2ZV9hc190eXBlX29zMgkJCT0gT1MvMiBCTVAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfamF2YXZpZXdlci5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19qYXZhdmlld2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YWZjNzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19qYXZhdmlld2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1PcGVuX21lbnVpdGVtPSZPcGVuLi4uXHRDdHJsK08KLUV4aXRfbWVudWl0ZW09RSZ4aXQKLUZpbGVfbWVudWl0ZW09JkZpbGUKLVdpbmRvd190aXRsZT1TV1QgSmF2YSBWaWV3ZXIKLUVycl9maWxlX25vX2V4aXN0PUZpbGUgezB9IGRvZXMgbm90IGV4aXN0LgotRXJyX2ZpbGVfaW89SU8gZXJyb3IgcmVhZGluZyBmaWxlOlxuezB9Ci1FcnJfZmlsZV9ub3RfZm91bmQ9RmlsZSBub3QgZm91bmQ6XG57MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2xheW91dC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19sYXlvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxYjMyZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX2xheW91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotd2luZG93LnRpdGxlID0gU1dUIExheW91dHMKLQotQWRkCQkJCQk9ICZBZGQKLURlbGV0ZQkgCQkJPSAmRGVsZXRlCi1DbGVhcgkJCQk9ICZDbGVhcgotQ2hpbGRyZW4JCQk9IENoaWxkcmVuCi1UeXBlCQkJCT0gVHlwZQotVG9wX0NvbnRyb2wJCQk9IFRvcCBDb250cm9sCi1MYXlvdXQJCQkJPSBMYXlvdXQKLVByZWZlcnJlZF9TaXplCQk9IFByZWZlcnJlZCBTaXplCi1HZW5lcmF0ZV9Db2RlCQk9ICZHZW5lcmF0ZSBDb2RlCi1HZW5lcmF0ZWRfQ29kZQkJPSBHZW5lcmF0ZWQgQ29kZQotUGFyYW1ldGVycwkJCT0gUGFyYW1ldGVycwotUHJvcGVydGllcwkJCT0gUHJvcGVydGllcwotTWFyZ2lucwkJCQk9IE1hcmdpbnMKLU1hcmdpbnNfU3BhY2luZwkJPSBNYXJnaW5zIGFuZCBTcGFjaW5nCi1Db2x1bW5zCQkJCT0gQ29sdW1ucwotQXR0YWNoX0VkaXQJCQk9IEVkaXQKLUxlZnRfQXR0YWNobWVudAkJPSBFZGl0IExlZnQgQXR0YWNobWVudAotUmlnaHRfQXR0YWNobWVudAk9IEVkaXQgUmlnaHQgQXR0YWNobWVudAotVG9wX0F0dGFjaG1lbnQJCT0gRWRpdCBUb3AgQXR0YWNobWVudAotQm90dG9tX0F0dGFjaG1lbnQJPSBFZGl0IEJvdHRvbSBBdHRhY2htZW50Ci1Qb3NpdGlvbgkJCT0gUG9zaXRpb24KLUNvbnRyb2wJCQkJPSBDb250cm9sCi1PZmZzZXQJCQkJPSBPZmZzZXQgWysvLV0KLUl0ZW0JCQkJPSBJdGVtIHswfQotQ29tYm9fSW5kZXgJCQk9IENvbWJvIHswfQotR3JvdXBfSW5kZXgJCQk9IEdyb3VwIHswfQotTGFiZWxfSW5kZXgJCQk9IExhYmVsIHswfQotQnV0dG9uX0luZGV4CQk9IEJ1dHRvbiB7MH0KLVN0eWxlZFRleHRfSW5kZXgJPSBTdHlsZWRUZXh0IHswfQotVGV4dF9JbmRleAkJCT0gVGV4dCB7MH0KLU9LCQkJCQk9IE9LCi1DYW5jZWwJCQkJPSBDYW5jZWwKLUVkaXQJCQkJPSAmRWRpdAotU2VsZWN0X0FsbAkJCT0gU2VsZWN0ICZBbGxcdEN0cmwrQQotQ29weQkJCQk9ICZDb3B5XHRDdHJsK0MKLUV4aXQJCQkJPSBFJnhpdAotTmFtZV9UaXRsZQkJCT0gRW50ZXIgTmFtZXMKLU5hbWVfTGFiZWwJCQk9IEVudGVyIG5hbWVzIGZvciB5b3VyIGNvbnRyb2xzCi1JbnZhbGlkX05hbWUgCQk9IEludmFsaWQgTmFtZSAtIFBsZWFzZSBlbnRlciB2YWxpZCB2YXJpYWJsZSBuYW1lcyBmb3IgeW91ciBjb250cm9scwotRGVmYXVsdAkJCQk9IERlZmF1bHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3BhaW50LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3BhaW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZWNlYzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc19wYWludC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotd2luZG93LnRpdGxlID0gUGFpbnQKLQotbWVudS5Ub29scy5sYWJlbCA9IFRvb2xzCi1tZW51Lk9wdGlvbnMubGFiZWwgPSBPcHRpb25zCi0KLXRvb2wuUGVuY2lsLmxhYmVsID0gUGVuY2lsCi10b29sLlBlbmNpbC50b29sdGlwID0gUGVuY2lsIHRvb2wKLXRvb2wuUGVuY2lsLmltYWdlID0gdG9vbF9wZW5jaWwuZ2lmCi10b29sLlBlbmNpbC5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIFBlbmNpbCB0b29sLgotCi10b29sLkFpcmJydXNoLmxhYmVsID0gQWlyYnJ1c2gKLXRvb2wuQWlyYnJ1c2gudG9vbHRpcCA9IEFpcmJydXNoIHRvb2wKLXRvb2wuQWlyYnJ1c2guaW1hZ2UgPSB0b29sX2FpcmJydXNoLmdpZgotdG9vbC5BaXJicnVzaC5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIEFpcmJydXNoIHRvb2wuCi0KLXRvb2wuTGluZS5sYWJlbCA9IExpbmUKLXRvb2wuTGluZS50b29sdGlwID0gTGluZSB0b29sCi10b29sLkxpbmUuaW1hZ2UgPSB0b29sX2xpbmUuZ2lmCi10b29sLkxpbmUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBMaW5lIHRvb2wuCi0KLXRvb2wuUG9seUxpbmUubGFiZWwgPSBQb2x5Z29uCi10b29sLlBvbHlMaW5lLnRvb2x0aXAgPSBQb2x5Z29uIHRvb2wKLXRvb2wuUG9seUxpbmUuaW1hZ2UgPSB0b29sX3BvbHlsaW5lLmdpZgotdG9vbC5Qb2x5TGluZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIFBvbHlMaW5lIHRvb2wuCi0KLXRvb2wuUmVjdGFuZ2xlLmxhYmVsID0gUmVjdGFuZ2xlCi10b29sLlJlY3RhbmdsZS50b29sdGlwID0gUmVjdGFuZ2xlIHRvb2wKLXRvb2wuUmVjdGFuZ2xlLmltYWdlID0gdG9vbF9yZWN0YW5nbGUuZ2lmCi10b29sLlJlY3RhbmdsZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgdGhlIFJlY3RhbmdsZSB0b29sLgotCi10b29sLkVsbGlwc2UubGFiZWwgPSBFbGxpcHNlCi10b29sLkVsbGlwc2UudG9vbHRpcCA9IEVsbGlwc2UgdG9vbAotdG9vbC5FbGxpcHNlLmltYWdlID0gdG9vbF9lbGxpcHNlLmdpZgotdG9vbC5FbGxpcHNlLmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgRWxsaXBzZSB0b29sLgotCi10b29sLlJvdW5kZWRSZWN0YW5nbGUubGFiZWwgPSBSb3VuZGVkIFJlY3RhbmdsZQotdG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLnRvb2x0aXAgPSBSb3VuZGVkIFJlY3RhbmdsZSB0b29sCi10b29sLlJvdW5kZWRSZWN0YW5nbGUuaW1hZ2UgPSB0b29sX3JvdW5kZWRyZWN0YW5nbGUuZ2lmCi10b29sLlJvdW5kZWRSZWN0YW5nbGUuZGVzY3JpcHRpb24gPSBTZWxlY3RzIHRoZSBSb3VuZGVkIFJlY3RhbmdsZSB0b29sLgotCi10b29sLlRleHQubGFiZWwgPSBUZXh0Ci10b29sLlRleHQudG9vbHRpcCA9IFRleHQgdG9vbAotdG9vbC5UZXh0LmltYWdlID0gdG9vbF90ZXh0LmdpZgotdG9vbC5UZXh0LmRlc2NyaXB0aW9uID0gU2VsZWN0cyB0aGUgVGV4dCB0b29sLgotdG9vbC5UZXh0LnNldHRpbmdzLmRlZmF1bHR0ZXh0ID0gSGVsbG8hCi10b29sLlRleHQuZGlhbG9nLnRpdGxlID0gVGV4dCBUb29sIFNldHRpbmdzCi10b29sLlRleHQuZGlhbG9nLm1lc3NhZ2UgPSBQbGVhc2UgZW50ZXIgdGhlIG5ldyB0ZXh0IHN0cmluZyB0byBiZSBwYWludGVkLgotCi10b29sLk51bGwubGFiZWwgPSA8bm9uZT4KLQotZmlsbC5Ob25lLmxhYmVsID0gTm8gRmlsbAotZmlsbC5Ob25lLnRvb2x0aXAgPSBObyBmaWxsIG1vZGUKLWZpbGwuTm9uZS5pbWFnZSA9IGZpbGxfbm9uZS5naWYKLWZpbGwuTm9uZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgTm8gRmlsbCBtb2RlLgotCi1maWxsLk91dGxpbmUubGFiZWwgPSBPdXRsaW5lIEZpbGwKLWZpbGwuT3V0bGluZS50b29sdGlwID0gT3V0bGluZSBmaWxsIG1vZGUKLWZpbGwuT3V0bGluZS5pbWFnZSA9IGZpbGxfb3V0bGluZS5naWYKLWZpbGwuT3V0bGluZS5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgT3V0bGluZSBGaWxsIG1vZGUuCi0KLWZpbGwuU29saWQubGFiZWwgPSBTb2xpZCBGaWxsCi1maWxsLlNvbGlkLnRvb2x0aXAgPSBTb2xpZCBmaWxsIG1vZGUKLWZpbGwuU29saWQuaW1hZ2UgPSBmaWxsX3NvbGlkLmdpZgotZmlsbC5Tb2xpZC5kZXNjcmlwdGlvbiA9IFNlbGVjdHMgU29saWQgRmlsbCBtb2RlLgotCi1saW5lc3R5bGUuU29saWQubGFiZWwgPSBTb2xpZCBMaW5lCi1saW5lc3R5bGUuU29saWQudG9vbHRpcCA9IFNvbGlkIGxpbmUgc3R5bGUKLWxpbmVzdHlsZS5Tb2xpZC5pbWFnZSA9IGxpbmVzdHlsZV9zb2xpZC5naWYKLWxpbmVzdHlsZS5Tb2xpZC5kZXNjcmlwdGlvbiA9IFNlbGVjdCBTb2xpZCBMaW5lIHN0eWxlLgotCi1saW5lc3R5bGUuRG90LmxhYmVsID0gRG90dGVkIExpbmUKLWxpbmVzdHlsZS5Eb3QudG9vbHRpcCA9IERvdHRlZCBsaW5lIHN0eWxlCi1saW5lc3R5bGUuRG90LmltYWdlID0gbGluZXN0eWxlX2RvdC5naWYKLWxpbmVzdHlsZS5Eb3QuZGVzY3JpcHRpb24gPSBTZWxlY3QgRG90dGVkIExpbmUgc3R5bGUuCi0KLWxpbmVzdHlsZS5EYXNoLmxhYmVsID0gRGFzaGVkIExpbmUKLWxpbmVzdHlsZS5EYXNoLnRvb2x0aXAgPSBEYXNoZWQgbGluZSBzdHlsZQotbGluZXN0eWxlLkRhc2guaW1hZ2UgPSBsaW5lc3R5bGVfZGFzaC5naWYKLWxpbmVzdHlsZS5EYXNoLmRlc2NyaXB0aW9uID0gU2VsZWN0IERhc2hlZCBMaW5lIHN0eWxlLgotCi1saW5lc3R5bGUuRGFzaERvdC5sYWJlbCA9IERhc2gtRG90IExpbmUKLWxpbmVzdHlsZS5EYXNoRG90LnRvb2x0aXAgPSBEYXNoLURvdCBsaW5lIHN0eWxlCi1saW5lc3R5bGUuRGFzaERvdC5pbWFnZSA9IGxpbmVzdHlsZV9kYXNoZG90LmdpZgotbGluZXN0eWxlLkRhc2hEb3QuZGVzY3JpcHRpb24gPSBTZWxlY3QgRGFzaC1Eb3QgTGluZSBzdHlsZS4KLQotb3B0aW9ucy5Gb250LmxhYmVsID0gVGV4dCBUb29sIEZvbnQKLW9wdGlvbnMuRm9udC50b29sdGlwID0gU2VsZWN0IFRleHQgVG9vbCBmb250Ci1vcHRpb25zLkZvbnQuaW1hZ2UgPSBvcHRpb25zX2ZvbnQuZ2lmCi1vcHRpb25zLkZvbnQuZGVzY3JpcHRpb24gPSBTZWxlY3RzIFRleHQgVG9vbCBmb250Lgotb3B0aW9ucy5Gb250LmRpYWxvZy50aXRsZSA9IFRleHQgVG9vbCBGb250Ci0KLXNldHRpbmdzLkFpcmJydXNoUmFkaXVzLnRleHQgPSBBaXJicnVzaCBSYWRpdXMKLXNldHRpbmdzLkFpcmJydXNoSW50ZW5zaXR5LnRleHQgPSBBaXJicnVzaCBJbnRlbnNpdHkKLQotc2Vzc2lvbi5OdWxsLm1lc3NhZ2UgPSBTZWxlY3QgYSB0b29sLi4uCi1zZXNzaW9uLkNvbnRpbnVvdXNQYWludC5tZXNzYWdlID0gQ2xpY2sgYW5kIGRyYWcgdG8gZHJhdy4uLgotc2Vzc2lvbi5EcmFnSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlID0gQ2xpY2sgYW5kIGRyYWcgdG8gcHJldmlldywgcmVsZWFzZSB0byBkcmF3LCByaWdodC1jbGljayB0byBjYW5jZWwuLi4KLXNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmFuY2hvck1vZGUgPSBDbGljayB0byBzZXQgYW5jaG9yLi4uCi1zZXNzaW9uLlNlZ21lbnRlZEludGVyYWN0aXZlUGFpbnQubWVzc2FnZS5pbnRlcmFjdGl2ZU1vZGUgPSBDbGljayB0byBkcmF3LCBkb3VibGUtY2xpY2sgdG8gY2xvc2UgZmlndXJlLCByaWdodC1jbGljayB0byBjYW5jZWwuLi4KLXNlc3Npb24uVGV4dC5tZXNzYWdlID0gQ2xpY2sgdG8gZHJhdyB0ZXh0LCByaWdodC1jbGljayB0byBlZGl0IHRleHQuLi4KLQotc3RhdHVzLkNvb3JkLmZvcm1hdCA9ICh7MH0sIHsxfSkKLXN0YXR1cy5Db29yZFJhbmdlLmZvcm1hdCA9ICh7MH0sIHsxfSkgLSAoezJ9LCB7M30pCi1zdGF0dXMuQmFyLmZvcm1hdCA9IHswfSA6IHsxfSAgIHsyfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9leGFtcGxlc190ZXh0ZWRpdG9yLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3RleHRlZGl0b3IucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1NWZlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX3RleHRlZGl0b3IucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUV4aXRfbWVudWl0ZW09RSZ4aXQKLUN1dF9tZW51aXRlbT1DdSZ0XHRDdHJsK1gKLUNvcHlfbWVudWl0ZW09JkNvcHlcdEN0cmwrQwotUGFzdGVfbWVudWl0ZW09JlBhc3RlXHRDdHJsK1YKLVdpbmRvd190aXRsZT1TV1QgVGV4dCBFZGl0b3IKLUZvbnRfbWVudWl0ZW09U2V0ICZGb250Li4uCi1FZGl0X21lbnVpdGVtPSZFZGl0Ci1GaWxlX21lbnVpdGVtPSZGaWxlCi1Cb2xkPUJvbGQKLUl0YWxpYz1JdGFsaWMKLVVuZGVybGluZT1VbmRlcmxpbmUKLVN0cmlrZW91dD1TdHJpa2VvdXQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjc5MzdlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBlcnNpc3QgcHJvamVjdCBzZXR0aW5ncyBmb3IgbGF0ZXIgaW1wb3J0IAotbmF0dXJlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU7IG9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUKLWJ1aWxkZXJzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI7IG9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyCi12YXIuRUNMSVBTRV9QTFVHSU5TID0gPDxFQ0xJUFNFX1BMVUdJTlM+Pgotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9BZGRyZXNzQm9vay5qYXZhJUFkZHJlc3NCb29rID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbnRyb2xFeGFtcGxlLmphdmElQ29udHJvbEV4YW1wbGUgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9GaWxlVmlld2VyLmphdmElRmlsZVZpZXdlciA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQxLmphdmElSGVsbG9Xb3JsZDEgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMi5qYXZhJUhlbGxvV29ybGQyID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDMuamF2YSVIZWxsb1dvcmxkMyA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ0LmphdmElSGVsbG9Xb3JsZDQgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNS5qYXZhJUhlbGxvV29ybGQ1ID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9Ib3ZlckhlbHAuamF2YSVIb3ZlckhlbHAgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKLXZtYXJncy5vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaW1hZ2VhbmFseXplci9JbWFnZUFuYWx5emVyLmphdmElSW1hZ2VBbmFseXplciA9ICItRGphdmEubGlicmFyeS5wYXRoPTw8U1dUX0xJQlJBUllfUEFUSD4+Igotdm1hcmdzLm9yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9qYXZhdmlld2VyL0phdmFWaWV3ZXIuamF2YSVKYXZhVmlld2VyID0gIi1EamF2YS5saWJyYXJ5LnBhdGg9PDxTV1RfTElCUkFSWV9QQVRIPj4iCi12bWFyZ3Mub3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvVGV4dEVkaXRvci5qYXZhJVRleHRFZGl0b3IgPSAiLURqYXZhLmxpYnJhcnkucGF0aD08PFNXVF9MSUJSQVJZX1BBVEg+PiIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9BZGRyZXNzQm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMTZjZGZlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5hZGRyZXNzYm9vazsKLQotCi0vKiBJbXBvcnRzICovCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEFkZHJlc3NCb29rRXhhbXBsZSBpcyBhbiBleGFtcGxlIHRoYXQgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IAotICogbGlicmFyaWVzIHRvIGltcGxlbWVudCBhIHNpbXBsZSBhZGRyZXNzIGJvb2suICBUaGlzIGFwcGxpY2F0aW9uIGhhcyAKLSAqIHNhdmUsIGxvYWQsIHNvcnRpbmcsIGFuZCBzZWFyY2hpbmcgZnVuY3Rpb25zIGNvbW1vbgotICogdG8gYmFzaWMgYWRkcmVzcyBib29rcy4KLSAqLwotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0FkZHJlc3NCb29rID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19hZGRyZXNzYm9vayIpOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFNlYXJjaERpYWxvZyBzZWFyY2hEaWFsb2c7Ci0JCi0JcHJpdmF0ZSBGaWxlIGZpbGU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzTW9kaWZpZWQ7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb3B5QnVmZmVyOwotCi0JcHJpdmF0ZSBpbnQgbGFzdFNvcnRDb2x1bW49IC0xOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVIgPSAiXHQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNvbHVtbk5hbWVzID0ge3Jlc0FkZHJlc3NCb29rLmdldFN0cmluZygiTGFzdF9uYW1lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaXJzdF9uYW1lIiksCi0JCQkJCQkJCQkJCQkgcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJCdXNpbmVzc19waG9uZSIpLAotCQkJCQkJCQkJCQkJIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSG9tZV9waG9uZSIpLAotCQkJCQkJCQkJCQkJIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRW1haWwiKSwKLQkJCQkJCQkJCQkJCSByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZheCIpfTsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUFkZHJlc3NCb29rIGFwcGxpY2F0aW9uID0gbmV3IEFkZHJlc3NCb29rKCk7Ci0JU2hlbGwgc2hlbGwgPSBhcHBsaWNhdGlvbi5vcGVuKGRpc3BsYXkpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci1wdWJsaWMgU2hlbGwgb3BlbihEaXNwbGF5IGRpc3BsYXkpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0Jc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsKLQkJCWUuZG9pdCA9IGNsb3NlQWRkcmVzc0Jvb2soKTsKLQkJfQotCX0pOwotCQotCWNyZWF0ZU1lbnVCYXIoKTsKLQotCXNlYXJjaERpYWxvZyA9IG5ldyBTZWFyY2hEaWFsb2coc2hlbGwpOwotCXNlYXJjaERpYWxvZy5zZXRTZWFyY2hBcmVhTmFtZXMoY29sdW1uTmFtZXMpOwotCXNlYXJjaERpYWxvZy5zZXRTZWFyY2hBcmVhTGFiZWwocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDb2x1bW4iKSk7Ci0Jc2VhcmNoRGlhbG9nLmFkZEZpbmRMaXN0ZW5lcihuZXcgRmluZExpc3RlbmVyICgpIHsKLQkJcHVibGljIGJvb2xlYW4gZmluZCgpIHsKLQkJCXJldHVybiBmaW5kRW50cnkoKTsKLQkJfQotCX0pOwotCQkJCQkKLQl0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CQotCXRhYmxlLnNldE1lbnUoY3JlYXRlUG9wVXBNZW51KCkpOwkKLQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID4gMCkgZWRpdEVudHJ5KGl0ZW1zWzBdKTsKLQkJfQotCX0pOwotCWZvcihpbnQgaSA9IDA7IGkgPCBjb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoY29sdW1uTmFtZXNbaV0pOwotCQljb2x1bW4uc2V0V2lkdGgoMTUwKTsKLQkJZmluYWwgaW50IGNvbHVtbkluZGV4ID0gaTsKLQkJY29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc29ydChjb2x1bW5JbmRleCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCW5ld0FkZHJlc3NCb29rKCk7Ci0KLQlzaGVsbC5zZXRTaXplKHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotCi1wcml2YXRlIGJvb2xlYW4gY2xvc2VBZGRyZXNzQm9vaygpIHsKLQlpZihpc01vZGlmaWVkKSB7Ci0JCS8vYXNrIHVzZXIgaWYgdGhleSB3YW50IHRvIHNhdmUgY3VycmVudCBhZGRyZXNzIGJvb2sKLQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyB8IFNXVC5ZRVMgfCBTV1QuTk8gfCBTV1QuQ0FOQ0VMKTsKLQkJYm94LnNldFRleHQoc2hlbGwuZ2V0VGV4dCgpKTsKLQkJYm94LnNldE1lc3NhZ2UocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJDbG9zZV9zYXZlIikpOwotCQotCQlpbnQgY2hvaWNlID0gYm94Lm9wZW4oKTsKLQkJaWYoY2hvaWNlID09IFNXVC5DQU5DRUwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmKGNob2ljZSA9PSBTV1QuWUVTKSB7Ci0JCQlpZiAoIXNhdmUoKSkgcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQkKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKyspIHsKLQkJaXRlbXNbaV0uZGlzcG9zZSgpOwotCX0KLQkKLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qKgotICogQ3JlYXRlcyB0aGUgbWVudSBhdCB0aGUgdG9wIG9mIHRoZSBzaGVsbCB3aGVyZSBtb3N0Ci0gKiBvZiB0aGUgcHJvZ3JhbXMgZnVuY3Rpb25hbGl0eSBpcyBhY2Nlc3NlZC4KLSAqCi0gKiBAcmV0dXJuCQlUaGUgPGNvZGU+TWVudTwvY29kZT4gd2lkZ2V0IHRoYXQgd2FzIGNyZWF0ZWQKLSAqLwotcHJpdmF0ZSBNZW51IGNyZWF0ZU1lbnVCYXIoKSB7Ci0JTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCi0JLy9jcmVhdGUgZWFjaCBoZWFkZXIgYW5kIHN1Yk1lbnUgZm9yIHRoZSBtZW51QmFyCi0JY3JlYXRlRmlsZU1lbnUobWVudUJhcik7Ci0JY3JlYXRlRWRpdE1lbnUobWVudUJhcik7Ci0JY3JlYXRlU2VhcmNoTWVudShtZW51QmFyKTsKLQljcmVhdGVIZWxwTWVudShtZW51QmFyKTsKLQkKLQlyZXR1cm4gbWVudUJhcjsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyBhbiBlbmNvZGVkIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYSBTdHJpbmcgYXJyYXkgcmVwcmVzZW50aW5nIGEgdGFibGUgZW50cnkuCi0gKi8KLXByaXZhdGUgU3RyaW5nW10gZGVjb2RlTGluZShTdHJpbmcgbGluZSkgewotCWlmKGxpbmUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCi0JU3RyaW5nW10gcGFyc2VkTGluZSA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JZm9yKGludCBpID0gMDsgaSA8IHBhcnNlZExpbmUubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCWludCBpbmRleCA9IGxpbmUuaW5kZXhPZihERUxJTUlURVIpOwotCQlpZiAoaW5kZXggPiAtMSkgewotCQkJcGFyc2VkTGluZVtpXSA9IGxpbmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCWxpbmUgPSBsaW5lLnN1YnN0cmluZyhpbmRleCArIERFTElNSVRFUi5sZW5ndGgoKSwgbGluZS5sZW5ndGgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlpZiAobGluZS5pbmRleE9mKERFTElNSVRFUikgIT0gLTEpIHJldHVybiBudWxsOwotCQotCXBhcnNlZExpbmVbcGFyc2VkTGluZS5sZW5ndGggLSAxXSA9IGxpbmU7Ci0KLQlyZXR1cm4gcGFyc2VkTGluZTsKLX0KLXByaXZhdGUgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIG1zZykgewotCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQlib3guc2V0TWVzc2FnZShtc2cpOwotCWJveC5vcGVuKCk7Ci19Ci1wcml2YXRlIHZvaWQgZWRpdEVudHJ5KFRhYmxlSXRlbSBpdGVtKSB7Ci0JRGF0YUVudHJ5RGlhbG9nIGRpYWxvZyA9IG5ldyBEYXRhRW50cnlEaWFsb2coc2hlbGwpOwotCWRpYWxvZy5zZXRMYWJlbHMoY29sdW1uTmFtZXMpOwotCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJdmFsdWVzW2ldID0gaXRlbS5nZXRUZXh0KGkpOwotCX0KLQlkaWFsb2cuc2V0VmFsdWVzKHZhbHVlcyk7Ci0JdmFsdWVzID0gZGlhbG9nLm9wZW4oKTsKLQlpZiAodmFsdWVzICE9IG51bGwpIHsKLQkJaXRlbS5zZXRUZXh0KHZhbHVlcyk7Ci0JCWlzTW9kaWZpZWQgPSB0cnVlOwotCX0KLX0KLXByaXZhdGUgU3RyaW5nIGVuY29kZUxpbmUoU3RyaW5nW10gdGFibGVJdGVtcykgewotCVN0cmluZyBsaW5lID0gIiI7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUl0ZW1zLmxlbmd0aCAtIDE7IGkrKykgewotCQlsaW5lICs9IHRhYmxlSXRlbXNbaV0gKyBERUxJTUlURVI7Ci0JfQotCWxpbmUgKz0gdGFibGVJdGVtc1t0YWJsZUl0ZW1zLmxlbmd0aCAtIDFdICsgIlxuIjsKLQkKLQlyZXR1cm4gbGluZTsKLX0KLXByaXZhdGUgYm9vbGVhbiBmaW5kRW50cnkoKSB7Ci0JQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKHNoZWxsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKTsKLQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCi0JYm9vbGVhbiBtYXRjaENhc2UgPSBzZWFyY2hEaWFsb2cuZ2V0TWF0Y2hDYXNlKCk7Ci0JYm9vbGVhbiBtYXRjaFdvcmQgPSBzZWFyY2hEaWFsb2cuZ2V0TWF0Y2hXb3JkKCk7Ci0JU3RyaW5nIHNlYXJjaFN0cmluZyA9IHNlYXJjaERpYWxvZy5nZXRTZWFyY2hTdHJpbmcoKTsKLQlpbnQgY29sdW1uID0gc2VhcmNoRGlhbG9nLmdldFNlbGVjdGVkU2VhcmNoQXJlYSgpOwotCQotCXNlYXJjaFN0cmluZyA9IG1hdGNoQ2FzZSA/IHNlYXJjaFN0cmluZyA6IHNlYXJjaFN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQotCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQlpZiAoc2VhcmNoRGlhbG9nLmdldFNlYXJjaERvd24oKSkgewotCQlmb3IoaW50IGkgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpICsgMTsgaSA8IHRhYmxlLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLQkJCWlmIChmb3VuZCA9IGZpbmRNYXRjaChzZWFyY2hTdHJpbmcsIHRhYmxlLmdldEl0ZW0oaSksIGNvbHVtbiwgbWF0Y2hXb3JkLCBtYXRjaENhc2UpKXsKLQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IoaW50IGkgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCWlmIChmb3VuZCA9IGZpbmRNYXRjaChzZWFyY2hTdHJpbmcsIHRhYmxlLmdldEl0ZW0oaSksIGNvbHVtbiwgbWF0Y2hXb3JkLCBtYXRjaENhc2UpKXsKLQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24oaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0Jc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQkKLQlyZXR1cm4gZm91bmQ7Ci19Ci1wcml2YXRlIGJvb2xlYW4gZmluZE1hdGNoKFN0cmluZyBzZWFyY2hTdHJpbmcsIFRhYmxlSXRlbSBpdGVtLCBpbnQgY29sdW1uLCBib29sZWFuIG1hdGNoV29yZCwgYm9vbGVhbiBtYXRjaENhc2UpIHsKLQkKLQlTdHJpbmcgdGFibGVUZXh0ID0gbWF0Y2hDYXNlID8gaXRlbS5nZXRUZXh0KGNvbHVtbikgOiBpdGVtLmdldFRleHQoY29sdW1uKS50b0xvd2VyQ2FzZSgpOwotCWlmIChtYXRjaFdvcmQpIHsKLQkJaWYgKHRhYmxlVGV4dCAhPSBudWxsICYmIHRhYmxlVGV4dC5lcXVhbHMoc2VhcmNoU3RyaW5nKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JfSBlbHNlIHsKLQkJaWYodGFibGVUZXh0IT0gbnVsbCAmJiB0YWJsZVRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmcpICE9IC0xKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1wcml2YXRlIHZvaWQgbmV3QWRkcmVzc0Jvb2soKSB7CQotCXNoZWxsLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJUaXRsZV9iYXIiKSArIHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiTmV3X3RpdGxlIikpOwotCWZpbGUgPSBudWxsOwotCWlzTW9kaWZpZWQgPSBmYWxzZTsKLX0KLXByaXZhdGUgdm9pZCBuZXdFbnRyeSgpIHsKLQlEYXRhRW50cnlEaWFsb2cgZGlhbG9nID0gbmV3IERhdGFFbnRyeURpYWxvZyhzaGVsbCk7Ci0JZGlhbG9nLnNldExhYmVscyhjb2x1bW5OYW1lcyk7Ci0JU3RyaW5nW10gZGF0YSA9IGRpYWxvZy5vcGVuKCk7Ci0JaWYgKGRhdGEgIT0gbnVsbCkgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KGRhdGEpOwotCQlpc01vZGlmaWVkID0gdHJ1ZTsKLQl9Ci19Ci0KLXByaXZhdGUgdm9pZCBvcGVuQWRkcmVzc0Jvb2soKSB7CQotCUZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0KLQlmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiKi5hZHI7IiwgIiouKiJ9KTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7cmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJCb29rX2ZpbHRlcl9uYW1lIikgKyAiICgqLmFkcikiLCAKLQkJCQkJCQkJCQkJcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJBbGxfZmlsdGVyX25hbWUiKSArICIgKCouKikifSk7Ci0JU3RyaW5nIG5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQotCWlmKG5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5hbWUpOwotCWlmICghZmlsZS5leGlzdHMoKSkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlIikrZmlsZS5nZXROYW1lKCkrIiAiK3Jlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRG9lc19ub3RfZXhpc3QiKSk7IAotCQlyZXR1cm47Ci0JfQotCQotCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihzaGVsbC5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQotCUZpbGVSZWFkZXIgZmlsZVJlYWRlciA9IG51bGw7Ci0JQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXIgPSBudWxsOwotCVN0cmluZ1tdIGRhdGEgPSBuZXcgU3RyaW5nWzBdOwotCXRyeSB7Ci0JCWZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJYnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZmlsZVJlYWRlcik7Ci0JCVN0cmluZyBuZXh0TGluZSA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXdoaWxlIChuZXh0TGluZSAhPSBudWxsKXsKLQkJCVN0cmluZ1tdIG5ld0RhdGEgPSBuZXcgU3RyaW5nW2RhdGEubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLQkJCW5ld0RhdGFbZGF0YS5sZW5ndGhdID0gbmV4dExpbmU7Ci0JCQlkYXRhID0gbmV3RGF0YTsKLQkJCW5leHRMaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJfQotCX0gY2F0Y2goRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJZGlzcGxheUVycm9yKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmlsZV9ub3RfZm91bmQiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybjsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlICkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJJT19lcnJvcl9yZWFkIikgKyAiXG4iICsgZmlsZS5nZXROYW1lKCkpOwotCQlyZXR1cm47Ci0JfSBmaW5hbGx5IHsJCi0JCQotCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQotCQlpZihmaWxlUmVhZGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZVJlYWRlci5jbG9zZSgpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZGlzcGxheUVycm9yKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSU9fZXJyb3JfY2xvc2UiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCVN0cmluZ1tdW10gdGFibGVJbmZvID0gbmV3IFN0cmluZ1tkYXRhLmxlbmd0aF1bdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JaW50IHdyaXRlSW5kZXggPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQlTdHJpbmdbXSBsaW5lID0gZGVjb2RlTGluZShkYXRhW2ldKTsKLQkJaWYgKGxpbmUgIT0gbnVsbCkgdGFibGVJbmZvW3dyaXRlSW5kZXgrK10gPSBsaW5lOwotCX0KLQlpZiAod3JpdGVJbmRleCAhPSBkYXRhLmxlbmd0aCkgewotCQlTdHJpbmdbXVtdIHJlc3VsdCA9IG5ldyBTdHJpbmdbd3JpdGVJbmRleF1bdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGFibGVJbmZvLCAwLCByZXN1bHQsIDAsIHdyaXRlSW5kZXgpOwotCQl0YWJsZUluZm8gPSByZXN1bHQ7Ci0JfQotCUFycmF5cy5zb3J0KHRhYmxlSW5mbywgbmV3IFJvd0NvbXBhcmF0b3IoMCkpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUluZm8ubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCh0YWJsZUluZm9baV0pOwotCX0KLQlzaGVsbC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiVGl0bGVfYmFyIikrZmlsZURpYWxvZy5nZXRGaWxlTmFtZSgpKTsKLQlpc01vZGlmaWVkID0gZmFsc2U7Ci0JdGhpcy5maWxlID0gZmlsZTsKLX0KLXByaXZhdGUgYm9vbGVhbiBzYXZlKCkgewotCWlmKGZpbGUgPT0gbnVsbCkgcmV0dXJuIHNhdmVBcygpOwotCQotCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihzaGVsbC5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQotCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQlTdHJpbmdbXSBsaW5lcyA9IG5ldyBTdHJpbmdbaXRlbXMubGVuZ3RoXTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nW10gaXRlbVRleHQgPSBuZXcgU3RyaW5nW3RhYmxlLmdldENvbHVtbkNvdW50KCldOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGl0ZW1UZXh0Lmxlbmd0aDsgaisrKSB7Ci0JCQlpdGVtVGV4dFtqXSA9IGl0ZW1zW2ldLmdldFRleHQoaik7Ci0JCX0KLQkJbGluZXNbaV0gPSBlbmNvZGVMaW5lKGl0ZW1UZXh0KTsKLQl9Ci0JCQotCUZpbGVXcml0ZXIgZmlsZVdyaXRlciA9IG51bGw7Ci0JdHJ5IHsgCi0JCWZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpLCBmYWxzZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbGVXcml0ZXIud3JpdGUobGluZXNbaV0pOwotCQl9Ci0JfSBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQlkaXNwbGF5RXJyb3IocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlX25vdF9mb3VuZCIpICsgIlxuIiArIGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gY2F0Y2goSU9FeGNlcHRpb24gZSApIHsKLQkJZGlzcGxheUVycm9yKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiSU9fZXJyb3Jfd3JpdGUiKSArICJcbiIgKyBmaWxlLmdldE5hbWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9IGZpbmFsbHkgewotCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQkKLQkJaWYoZmlsZVdyaXRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZpbGVXcml0ZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCWRpc3BsYXlFcnJvcihyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIklPX2Vycm9yX2Nsb3NlIikgKyAiXG4iICsgZmlsZS5nZXROYW1lKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCXNoZWxsLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJUaXRsZV9iYXIiKStmaWxlLmdldE5hbWUoKSk7Ci0JaXNNb2RpZmllZCA9IGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotcHJpdmF0ZSBib29sZWFuIHNhdmVBcygpIHsKLQkJCi0JRmlsZURpYWxvZyBzYXZlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5TQVZFKTsKLQlzYXZlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiKi5hZHI7IiwgICIqLioifSk7Ci0Jc2F2ZURpYWxvZy5zZXRGaWx0ZXJOYW1lcyhuZXcgU3RyaW5nW10geyJBZGRyZXNzIEJvb2tzICgqLmFkcikiLCAiQWxsIEZpbGVzICJ9KTsKLQkKLQlzYXZlRGlhbG9nLm9wZW4oKTsKLQlTdHJpbmcgbmFtZSA9IHNhdmVEaWFsb2cuZ2V0RmlsZU5hbWUoKTsKLQkJCi0JaWYobmFtZS5lcXVhbHMoIiIpKSByZXR1cm4gZmFsc2U7Ci0KLQlpZihuYW1lLmluZGV4T2YoIi5hZHIiKSAhPSBuYW1lLmxlbmd0aCgpIC0gNCkgewotCQluYW1lICs9ICIuYWRyIjsKLQl9Ci0KLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzYXZlRGlhbG9nLmdldEZpbHRlclBhdGgoKSwgbmFtZSk7Ci0JaWYoZmlsZS5leGlzdHMoKSkgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULllFUyB8IFNXVC5OTyk7Ci0JCWJveC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU2F2ZV9hc190aXRsZSIpKTsKLQkJYm94LnNldE1lc3NhZ2UocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJGaWxlIikgKyBmaWxlLmdldE5hbWUoKSsiICIrcmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJRdWVyeV9vdmVyd3JpdGUiKSk7Ci0JCWlmKGJveC5vcGVuKCkgIT0gU1dULllFUykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCXRoaXMuZmlsZSA9IGZpbGU7Ci0JcmV0dXJuIHNhdmUoKTsJCi19Ci1wcml2YXRlIHZvaWQgc29ydChpbnQgY29sdW1uKSB7Ci0JaWYodGFibGUuZ2V0SXRlbUNvdW50KCkgPD0gMSkgcmV0dXJuOwotCi0JVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCVN0cmluZ1tdW10gZGF0YSA9IG5ldyBTdHJpbmdbaXRlbXMubGVuZ3RoXVt0YWJsZS5nZXRDb2x1bW5Db3VudCgpXTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IHRhYmxlLmdldENvbHVtbkNvdW50KCk7IGorKykgewotCQkJZGF0YVtpXVtqXSA9IGl0ZW1zW2ldLmdldFRleHQoaik7Ci0JCX0KLQl9Ci0JCi0JQXJyYXlzLnNvcnQoZGF0YSwgbmV3IFJvd0NvbXBhcmF0b3IoY29sdW1uKSk7Ci0JCi0JaWYgKGxhc3RTb3J0Q29sdW1uICE9IGNvbHVtbikgewotCQl0YWJsZS5zZXRTb3J0Q29sdW1uKHRhYmxlLmdldENvbHVtbihjb2x1bW4pKTsKLQkJdGFibGUuc2V0U29ydERpcmVjdGlvbihTV1QuRE9XTik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJaXRlbXNbaV0uc2V0VGV4dChkYXRhW2ldKTsKLQkJfQotCQlsYXN0U29ydENvbHVtbiA9IGNvbHVtbjsKLQl9IGVsc2UgewotCQkvLyByZXZlcnNlIG9yZGVyIGlmIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZWxlY3RlZCBhZ2FpbgotCQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7Ci0JCWludCBqID0gZGF0YS5sZW5ndGggLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJaXRlbXNbaV0uc2V0VGV4dChkYXRhW2otLV0pOwotCQl9Ci0JCWxhc3RTb3J0Q29sdW1uID0gLTE7Ci0JfQotCQotfQotLyoqCi0gKiBDcmVhdGVzIGFsbCB0aGUgaXRlbXMgbG9jYXRlZCBpbiB0aGUgRmlsZSBzdWJtZW51IGFuZAotICogYXNzb2NpYXRlIGFsbCB0aGUgbWVudSBpdGVtcyB3aXRoIHRoZWlyIGFwcHJvcHJpYXRlCi0gKiBmdW5jdGlvbnMuCi0gKgotICogQHBhcmFtCW1lbnVCYXIgTWVudQotICoJCQkJdGhlIDxjb2RlPk1lbnU8L2NvZGU+IHRoYXQgZmlsZSBjb250YWluCi0gKgkJCQl0aGUgRmlsZSBzdWJtZW51LgotICovCi1wcml2YXRlIHZvaWQgY3JlYXRlRmlsZU1lbnUoTWVudSBtZW51QmFyKSB7Ci0JLy9GaWxlIG1lbnUuCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmlsZV9tZW51X3RpdGxlIikpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLnNldE1lbnUobWVudSk7Ci0JLyoqIAotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBoYW5kbGUgZW5hYmxpbmcgYW5kIGRpc2FibGluZyAKLQkgKiBzb21lIGl0ZW1zIGluIHRoZSBFZGl0IHN1Ym1lbnUuCi0JICovCi0JbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCU1lbnUgbWVudSA9IChNZW51KWUud2lkZ2V0OwotCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG1lbnUuZ2V0SXRlbXMoKTsKLQkJCWl0ZW1zWzFdLnNldEVuYWJsZWQodGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSAhPSAwKTsgLy8gZWRpdCBjb250YWN0Ci0JCQlpdGVtc1s1XS5zZXRFbmFibGVkKChmaWxlICE9IG51bGwpICYmIGlzTW9kaWZpZWQpOyAvLyBzYXZlCi0JCQlpdGVtc1s2XS5zZXRFbmFibGVkKHRhYmxlLmdldEl0ZW1Db3VudCgpICE9IDApOyAvLyBzYXZlIGFzCi0JCX0KLQl9KTsKLQotCi0JLy9GaWxlIC0+IE5ldyBDb250YWN0Ci0JTWVudUl0ZW0gc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiTmV3X2NvbnRhY3QiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdOJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbmV3RW50cnkoKTsKLQkJfQotCX0pOwotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkVkaXRfY29udGFjdCIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0UnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQllZGl0RW50cnkoaXRlbXNbMF0pOwotCQl9Ci0JfSk7Ci0KLQkKLQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCi0JLy9GaWxlIC0+IE5ldyBBZGRyZXNzIEJvb2sKLQlzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJOZXdfYWRkcmVzc19ib29rIikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQicpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChjbG9zZUFkZHJlc3NCb29rKCkpIHsKLQkJCQluZXdBZGRyZXNzQm9vaygpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQkvL0ZpbGUgLT4gT3BlbgotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIk9wZW5fYWRkcmVzc19ib29rIikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnTycpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChjbG9zZUFkZHJlc3NCb29rKCkpIHsKLQkJCQlvcGVuQWRkcmVzc0Jvb2soKTsKLQkJCX0KLQkJfQotCX0pOwotCi0JLy9GaWxlIC0+IFNhdmUuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU2F2ZV9hZGRyZXNzX2Jvb2siKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdTJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2F2ZSgpOwotCQl9Ci0JfSk7Ci0JCi0JLy9GaWxlIC0+IFNhdmUgQXMuCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiU2F2ZV9ib29rX2FzIikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQScpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXNhdmVBcygpOwotCQl9Ci0JfSk7Ci0KLQkJCi0JbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQotCS8vRmlsZSAtPiBFeGl0LgotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkV4aXQiKSk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBFZGl0IHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0JbWVudUJhciBNZW51Ci0gKgkJCQl0aGUgPGNvZGU+TWVudTwvY29kZT4gdGhhdCBmaWxlIGNvbnRhaW4KLSAqCQkJCXRoZSBFZGl0IHN1Ym1lbnUuCi0gKgotICogQHNlZQkjY3JlYXRlU29ydE1lbnUoKQotICovCi1wcml2YXRlIE1lbnVJdGVtIGNyZWF0ZUVkaXRNZW51KE1lbnUgbWVudUJhcikgewotCS8vRWRpdCBtZW51LgotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkVkaXRfbWVudV90aXRsZSIpKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JaXRlbS5zZXRNZW51KG1lbnUpOwotCQotCS8qKiAKLQkgKiBBZGQgYSBsaXN0ZW5lciB0byBoYW5kbGUgZW5hYmxpbmcgYW5kIGRpc2FibGluZyAKLQkgKiBzb21lIGl0ZW1zIGluIHRoZSBFZGl0IHN1Ym1lbnUuCi0JICovCi0JbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCU1lbnUgbWVudSA9IChNZW51KWUud2lkZ2V0OwotCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG1lbnUuZ2V0SXRlbXMoKTsKLQkJCWludCBjb3VudCA9IHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0JCQlpdGVtc1swXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBlZGl0Ci0JCQlpdGVtc1sxXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBjb3B5Ci0JCQlpdGVtc1syXS5zZXRFbmFibGVkKGNvcHlCdWZmZXIgIT0gbnVsbCk7IC8vIHBhc3RlCi0JCQlpdGVtc1szXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBkZWxldGUKLQkJCWl0ZW1zWzVdLnNldEVuYWJsZWQodGFibGUuZ2V0SXRlbUNvdW50KCkgIT0gMCk7IC8vIHNvcnQKLQkJfQotCX0pOwotCQotCS8vRWRpdCAtPiBFZGl0Ci0JTWVudUl0ZW0gc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRWRpdCIpKTsKLQlzdWJJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0UnKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQllZGl0RW50cnkoaXRlbXNbMF0pOwotCQl9Ci0JfSk7Ci0KLQkvL0VkaXQgLT4gQ29weQotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkNvcHkiKSk7Ci0Jc3ViSXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdDJyk7Ci0Jc3ViSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJY29weUJ1ZmZlciA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvcHlCdWZmZXIubGVuZ3RoOyBpKyspIHsKLQkJCQljb3B5QnVmZmVyW2ldID0gaXRlbXNbMF0uZ2V0VGV4dChpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vRWRpdCAtPiBQYXN0ZQotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBhc3RlIikpOwotCXN1Ykl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnVicpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmIChjb3B5QnVmZmVyID09IG51bGwpIHJldHVybjsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KGNvcHlCdWZmZXIpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JCX0KLQl9KTsKLQkKLQkvL0VkaXQgLT4gRGVsZXRlCi0Jc3ViSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0Jc3ViSXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGVsZXRlIikpOwotCXN1Ykl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWl0ZW1zWzBdLmRpc3Bvc2UoKTsKLQkJCWlzTW9kaWZpZWQgPSB0cnVlOwkJfQotCX0pOwotCQotCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkKLQkvL0VkaXQgLT4gU29ydChDYXNjYWRlKQotCXN1Ykl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNBU0NBREUpOwotCXN1Ykl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlNvcnQiKSk7Ci0JTWVudSBzdWJtZW51ID0gY3JlYXRlU29ydE1lbnUoKTsKLQlzdWJJdGVtLnNldE1lbnUoc3VibWVudSk7Ci0JCi0JcmV0dXJuIGl0ZW07Ci0JCi19Ci0KLS8qKgotICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIFNvcnQgY2FzY2FkaW5nIHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcmV0dXJuCU1lbnUKLSAqCQkJVGhlIGNhc2NhZGluZyBtZW51IHdpdGggYWxsIHRoZSBzb3J0IG1lbnUgaXRlbXMgb24gaXQuCi0gKi8KLXByaXZhdGUgTWVudSBjcmVhdGVTb3J0TWVudSgpIHsKLQlNZW51IHN1Ym1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JTWVudUl0ZW0gc3ViaXRlbTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgY29sdW1uTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJc3ViaXRlbSA9IG5ldyBNZW51SXRlbSAoc3VibWVudSwgU1dULk5PTkUpOwotCQlzdWJpdGVtLnNldFRleHQoY29sdW1uTmFtZXMgW2ldKTsKLQkJZmluYWwgaW50IGNvbHVtbiA9IGk7Ci0JCXN1Yml0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc29ydChjb2x1bW4pOwotCQkJfQotCQl9KTsKLQotCX0KLQkKLQlyZXR1cm4gc3VibWVudTsKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGFsbCB0aGUgaXRlbXMgbG9jYXRlZCBpbiB0aGUgU2VhcmNoIHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0JbWVudUJhcglNZW51Ci0gKgkJCQl0aGUgPGNvZGU+TWVudTwvY29kZT4gdGhhdCBmaWxlIGNvbnRhaW4KLSAqCQkJCXRoZSBTZWFyY2ggc3VibWVudS4KLSAqLwotcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlYXJjaE1lbnUoTWVudSBtZW51QmFyKSB7Ci0JLy9TZWFyY2ggbWVudS4KLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJTZWFyY2hfbWVudV90aXRsZSIpKTsKLQlNZW51IHNlYXJjaE1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JaXRlbS5zZXRNZW51KHNlYXJjaE1lbnUpOwotCi0JLy9TZWFyY2ggLT4gRmluZC4uLgotCWl0ZW0gPSBuZXcgTWVudUl0ZW0oc2VhcmNoTWVudSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkZpbmQiKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdGJyk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2VhcmNoRGlhbG9nLnNldE1hdGNoQ2FzZShmYWxzZSk7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0TWF0Y2hXb3JkKGZhbHNlKTsKLQkJCXNlYXJjaERpYWxvZy5zZXRTZWFyY2hEb3duKHRydWUpOwotCQkJc2VhcmNoRGlhbG9nLnNldFNlYXJjaFN0cmluZygiIik7Ci0JCQlzZWFyY2hEaWFsb2cuc2V0U2VsZWN0ZWRTZWFyY2hBcmVhKDApOwotCQkJc2VhcmNoRGlhbG9nLm9wZW4oKTsKLQkJfQotCX0pOwotCi0JLy9TZWFyY2ggLT4gRmluZCBOZXh0Ci0JaXRlbSA9IG5ldyBNZW51SXRlbShzZWFyY2hNZW51LCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRmluZF9uZXh0IikpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkYzKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzZWFyY2hEaWFsb2cub3BlbigpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qKiAKLSAqIENyZWF0ZXMgYWxsIGl0ZW1zIGxvY2F0ZWQgaW4gdGhlIHBvcHVwIG1lbnUgYW5kIGFzc29jaWF0ZXMKLSAqIGFsbCB0aGUgbWVudSBpdGVtcyB3aXRoIHRoZWlyIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcmV0dXJuCU1lbnUKLSAqCQkJVGhlIGNyZWF0ZWQgcG9wdXAgbWVudS4KLSAqLwotcHJpdmF0ZSBNZW51IGNyZWF0ZVBvcFVwTWVudSgpIHsKLQlNZW51IHBvcFVwTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQKTsKLQotCS8qKiAKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gaGFuZGxlIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgCi0JICogc29tZSBpdGVtcyBpbiB0aGUgRWRpdCBzdWJtZW51LgotCSAqLwotCXBvcFVwTWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCU1lbnUgbWVudSA9IChNZW51KWUud2lkZ2V0OwotCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG1lbnUuZ2V0SXRlbXMoKTsKLQkJCWludCBjb3VudCA9IHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0JCQlpdGVtc1syXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBlZGl0Ci0JCQlpdGVtc1szXS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBjb3B5Ci0JCQlpdGVtc1s0XS5zZXRFbmFibGVkKGNvcHlCdWZmZXIgIT0gbnVsbCk7IC8vIHBhc3RlCi0JCQlpdGVtc1s1XS5zZXRFbmFibGVkKGNvdW50ICE9IDApOyAvLyBkZWxldGUKLQkJCWl0ZW1zWzddLnNldEVuYWJsZWQodGFibGUuZ2V0SXRlbUNvdW50KCkgIT0gMCk7IC8vIGZpbmQKLQkJfQotCX0pOwotCi0JLy9OZXcKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9uZXciKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbmV3RW50cnkoKTsKLQkJfQotCX0pOwotCQotCW5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5TRVBBUkFUT1IpOwkKLQkKLQkvL0VkaXQKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9lZGl0IikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHJldHVybjsKLQkJCWVkaXRFbnRyeShpdGVtc1swXSk7Ci0JCX0KLQl9KTsKLQotCS8vQ29weQotCWl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiUG9wX3VwX2NvcHkiKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJY29weUJ1ZmZlciA9IG5ldyBTdHJpbmdbdGFibGUuZ2V0Q29sdW1uQ291bnQoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvcHlCdWZmZXIubGVuZ3RoOyBpKyspIHsKLQkJCQljb3B5QnVmZmVyW2ldID0gaXRlbXNbMF0uZ2V0VGV4dChpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCS8vUGFzdGUKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9wYXN0ZSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpZiAoY29weUJ1ZmZlciA9PSBudWxsKSByZXR1cm47Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dChjb3B5QnVmZmVyKTsKLQkJCWlzTW9kaWZpZWQgPSB0cnVlOwotCQl9Ci0JfSk7Ci0JCi0JLy9EZWxldGUKLQlpdGVtID0gbmV3IE1lbnVJdGVtKHBvcFVwTWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlBvcF91cF9kZWxldGUiKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJaXRlbXNbMF0uZGlzcG9zZSgpOwotCQkJaXNNb2RpZmllZCA9IHRydWU7Ci0JCX0KLQl9KTsKLQkKLQluZXcgTWVudUl0ZW0ocG9wVXBNZW51LCBTV1QuU0VQQVJBVE9SKTsJCi0JCi0JLy9GaW5kLi4uCi0JaXRlbSA9IG5ldyBNZW51SXRlbShwb3BVcE1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJQb3BfdXBfZmluZCIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzZWFyY2hEaWFsb2cub3BlbigpOwotCQl9Ci0JfSk7Ci0KLQlyZXR1cm4gcG9wVXBNZW51OwotfQotCi0vKioKLSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBsb2NhdGVkIGluIHRoZSBIZWxwIHN1Ym1lbnUgYW5kCi0gKiBhc3NvY2lhdGUgYWxsIHRoZSBtZW51IGl0ZW1zIHdpdGggdGhlaXIgYXBwcm9wcmlhdGUKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0JbWVudUJhcglNZW51Ci0gKgkJCQl0aGUgPGNvZGU+TWVudTwvY29kZT4gdGhhdCBmaWxlIGNvbnRhaW4KLSAqCQkJCXRoZSBIZWxwIHN1Ym1lbnUuCi0gKi8KLXByaXZhdGUgdm9pZCBjcmVhdGVIZWxwTWVudShNZW51IG1lbnVCYXIpIHsKLQkKLQkvL0hlbHAgTWVudQotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCWl0ZW0uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkhlbHBfbWVudV90aXRsZSIpKTsJCi0JTWVudSBtZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWl0ZW0uc2V0TWVudShtZW51KTsKLQkKLQkvL0hlbHAgLT4gQWJvdXQgVGV4dCBFZGl0b3IKLQlNZW51SXRlbSBzdWJJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQlzdWJJdGVtLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJBYm91dCIpKTsKLQlzdWJJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlib3guc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFib3V0XzEiKSArIHNoZWxsLmdldFRleHQoKSk7Ci0JCQlib3guc2V0TWVzc2FnZShzaGVsbC5nZXRUZXh0KCkgKyByZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkFib3V0XzIiKSk7Ci0JCQlib3gub3BlbigpOwkJCi0JCX0KLQl9KTsKLX0KLQotLyoqCi0gKiBUbyBjb21wYXJlIGVudHJpZXMgKHJvd3MpIGJ5IHRoZSBnaXZlbiBjb2x1bW4KLSAqLwotcHJpdmF0ZSBjbGFzcyBSb3dDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JcHJpdmF0ZSBpbnQgY29sdW1uOwotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBSb3dDb21wYXJhdG9yIGdpdmVuIHRoZSBjb2x1bW4gaW5kZXgKLQkgKiBAcGFyYW0gY29sIFRoZSBpbmRleCAoc3RhcnRpbmcgYXQgemVybykgb2YgdGhlIGNvbHVtbgotCSAqLwotCXB1YmxpYyBSb3dDb21wYXJhdG9yKGludCBjb2wpIHsKLQkJY29sdW1uID0gY29sOwotCX0KLQkKLQkvKioKLQkgKiBDb21wYXJlcyB0d28gcm93cyAodHlwZSBTdHJpbmdbXSkgdXNpbmcgdGhlIHNwZWNpZmllZAotCSAqIGNvbHVtbiBlbnRyeS4KLQkgKiBAcGFyYW0gb2JqMSBGaXJzdCByb3cgdG8gY29tcGFyZQotCSAqIEBwYXJhbSBvYmoyIFNlY29uZCByb3cgdG8gY29tcGFyZQotCSAqIEByZXR1cm4gbmVnYXRpdmUgaWYgb2JqMSBsZXNzIHRoYW4gb2JqMiwgcG9zaXRpdmUgaWYKLQkgKiAJCQlvYmoxIGdyZWF0ZXIgdGhhbiBvYmoyLCBhbmQgemVybyBpZiBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0JCVN0cmluZ1tdIHJvdzEgPSAoU3RyaW5nW10pb2JqMTsKLQkJU3RyaW5nW10gcm93MiA9IChTdHJpbmdbXSlvYmoyOwotCQkKLQkJcmV0dXJuIHJvdzFbY29sdW1uXS5jb21wYXJlVG8ocm93Mltjb2x1bW5dKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9EYXRhRW50cnlEaWFsb2cuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0RhdGFFbnRyeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTUxNDMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0RhdGFFbnRyeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2s7Ci0KLQotLyogSW1wb3J0cyAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogRGF0YUVudHJ5RGlhbG9nIGNsYXNzIHVzZXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0PC9jb2RlPiAKLSAqIGxpYnJhcmllcyB0byBpbXBsZW1lbnQgYSBkaWFsb2cgdGhhdCBhY2NlcHRzIGJhc2ljIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRoYXQKLSAqIGlzIGFkZGVkIHRvIGEgPGNvZGU+VGFibGU8L2NvZGU+IHdpZGdldCBvciBlZGl0cyBhIDxjb2RlPlRhYmxlSXRlbTwvY29kZT4gZW50cnkgCi0gKiB0byByZXByZXNlbnQgdGhlIGVudGVyZWQgZGF0YS4KLSAqLwotcHVibGljIGNsYXNzIERhdGFFbnRyeURpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNBZGRyZXNzQm9vayA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfYWRkcmVzc2Jvb2siKTsKLQkKLQlTaGVsbCBzaGVsbDsKLQlTdHJpbmdbXSB2YWx1ZXM7Ci0JU3RyaW5nW10gbGFiZWxzOwotCQotcHVibGljIERhdGFFbnRyeURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5QUklNQVJZX01PREFMKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CQkKLX0KLQotcHJpdmF0ZSB2b2lkIGFkZFRleHRMaXN0ZW5lcihmaW5hbCBUZXh0IHRleHQpIHsKLQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLQkJCUludGVnZXIgaW5kZXggPSAoSW50ZWdlcikodGV4dC5nZXREYXRhKCJpbmRleCIpKTsKLQkJCXZhbHVlc1tpbmRleC5pbnRWYWx1ZSgpXSA9IHRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JfSk7Ci19Ci1wcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbEJ1dHRvbnMoKSB7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlCdXR0b24gb2tCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCW9rQnV0dG9uLnNldFRleHQocmVzQWRkcmVzc0Jvb2suZ2V0U3RyaW5nKCJPSyIpKTsKLQlva0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotCQotCUJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQ2FuY2VsIikpOwotCWNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdmFsdWVzID0gbnVsbDsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKG9rQnV0dG9uKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRXaWRnZXRzKCkgewotCWlmIChsYWJlbHMgPT0gbnVsbCkgcmV0dXJuOwotCQotCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0JaWYgKHZhbHVlcyA9PSBudWxsKQotCQl2YWx1ZXMgPSBuZXcgU3RyaW5nW2xhYmVscy5sZW5ndGhdOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlJJR0hUKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbHNbaV0pOwkKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQl0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlpZiAodmFsdWVzW2ldICE9IG51bGwpIHsKLQkJCXRleHQuc2V0VGV4dCh2YWx1ZXNbaV0pOwotCQl9Ci0JCXRleHQuc2V0RGF0YSgiaW5kZXgiLCBuZXcgSW50ZWdlcihpKSk7Ci0JCWFkZFRleHRMaXN0ZW5lcih0ZXh0KTsJCi0JfQotfQotCi1wdWJsaWMgU3RyaW5nW10gZ2V0TGFiZWxzKCkgewotCXJldHVybiBsYWJlbHM7Ci19Ci1wdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCXJldHVybiBzaGVsbC5nZXRUZXh0KCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXRzIGluIHRoZSBkaWFsb2cgaW4gYSAKLSAqIDxjb2RlPlN0cmluZzwvY29kZT4gYXJyYXkuCi0gKgotICogQHJldHVybglTdHJpbmdbXQkKLSAqCQkJVGhlIGNvbnRlbnRzIG9mIHRoZSB0ZXh0IHdpZGdldHMgb2YgdGhlIGRpYWxvZy4KLSAqCQkJTWF5IHJldHVybiBudWxsIGlmIGFsbCB0ZXh0IHdpZGdldHMgYXJlIGVtcHR5LgotICovIAotcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLQlyZXR1cm4gdmFsdWVzOwotfQotLyoqIAotICogT3BlbnMgdGhlIGRpYWxvZyBpbiB0aGUgZ2l2ZW4gc3RhdGUuICBTZXRzIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCBjb250ZW50cyAKLSAqIGFuZCBkaWFsb2cgYmVoYXZpb3VyIGFjY29yZGluZ2x5LgotICoKLSAqIEBwYXJhbSAJZGlhbG9nU3RhdGUJaW50Ci0gKgkJCQkJVGhlIHN0YXRlIHRoZSBkaWFsb2cgc2hvdWxkIGJlIG9wZW5lZCBpbi4KLSAqLwotcHVibGljIFN0cmluZ1tdIG9wZW4oKSB7Ci0JY3JlYXRlVGV4dFdpZGdldHMoKTsKLQljcmVhdGVDb250cm9sQnV0dG9ucygpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0JRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JCi0JcmV0dXJuIGdldFZhbHVlcygpOwotfQotcHVibGljIHZvaWQgc2V0TGFiZWxzKFN0cmluZ1tdIGxhYmVscykgewotCXRoaXMubGFiZWxzID0gbGFiZWxzOwotfQotcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0Jc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIHZhbHVlcyBvZiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0cyBvZiB0aGUgZGlhbG9nIHRvCi0gKiB0aGUgdmFsdWVzIHN1cHBsaWVkIGluIHRoZSBwYXJhbWV0ZXIgYXJyYXkuCi0gKgotICogQHBhcmFtCWl0ZW1JbmZvCVN0cmluZ1tdCi0gKiAJCQkJCQlUaGUgdmFsdWVzIHRvIHdoaWNoIHRoZSBkaWFsb2cgY29udGVudHMgd2lsbCBiZSBzZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHNldFZhbHVlcyhTdHJpbmdbXSBpdGVtSW5mbykgewotCWlmIChsYWJlbHMgPT0gbnVsbCkgcmV0dXJuOwotCQotCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJdmFsdWVzID0gbmV3IFN0cmluZ1tsYWJlbHMubGVuZ3RoXTsKLQotCWludCBudW1JdGVtcyA9IE1hdGgubWluKHZhbHVlcy5sZW5ndGgsIGl0ZW1JbmZvLmxlbmd0aCk7Ci0JZm9yKGludCBpID0gMDsgaSA8IG51bUl0ZW1zOyBpKyspIHsKLQkJdmFsdWVzW2ldID0gaXRlbUluZm9baV07Ci0JfQkKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL0ZpbmRMaXN0ZW5lci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRmluZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3MzI1MDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYWRkcmVzc2Jvb2svRmluZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmFkZHJlc3Nib29rOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRmluZExpc3RlbmVyIHsKLQotcHVibGljIGJvb2xlYW4gZmluZCgpOwotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9hZGRyZXNzYm9vay9TZWFyY2hEaWFsb2cuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL1NlYXJjaERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNGI2NmUyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2FkZHJlc3Nib29rL1NlYXJjaERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYWRkcmVzc2Jvb2s7Ci0KLQotLyogSW1wb3J0cyAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogU2VhcmNoRGlhbG9nIGlzIGEgc2ltcGxlIGNsYXNzIHRoYXQgdXNlcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3Q8L2NvZGU+IAotICogbGlicmFyaWVzIHRvIGltcGxlbWVudCBhIGJhc2ljIHNlYXJjaCBkaWFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hEaWFsb2cgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzQWRkcmVzc0Jvb2sgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2FkZHJlc3Nib29rIik7Ci0KLQlTaGVsbCBzaGVsbDsKLQlUZXh0IHNlYXJjaFRleHQ7Ci0JQ29tYm8gc2VhcmNoQXJlYTsKLQlMYWJlbCBzZWFyY2hBcmVhTGFiZWw7Ci0JQnV0dG9uIG1hdGNoQ2FzZTsKLQlCdXR0b24gbWF0Y2hXb3JkOwotCUJ1dHRvbiBmaW5kQnV0dG9uOwotCUJ1dHRvbiBkb3duOwotCUZpbmRMaXN0ZW5lciBmaW5kSGFuZGxlcjsKLQotLyoqCi0gKiBDbGFzcyBjb25zdHJ1Y3RvciB0aGF0IHNldHMgdGhlIHBhcmVudCBzaGVsbCBhbmQgdGhlIHRhYmxlIHdpZGdldCB0aGF0Ci0gKiB0aGUgZGlhbG9nIHdpbGwgc2VhcmNoLgotICoKLSAqIEBwYXJhbSBwYXJlbnQJU2hlbGwgCi0gKgkJCVRoZSBzaGVsbCB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhlIGRpYWxvZy4KLSAqLwotcHVibGljIFNlYXJjaERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5DTE9TRSB8IFNXVC5CT1JERVIgfCBTV1QuVElUTEUpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0Jc2hlbGwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIlNlYXJjaF9kaWFsb2dfdGl0bGUiKSk7Ci0Jc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCl7Ci0JCXB1YmxpYyB2b2lkIHNoZWxsQ2xvc2VkKFNoZWxsRXZlbnQgZSkgewotCQkJLy8gZG9uJ3QgZGlzcG9zZSBvZiB0aGUgc2hlbGwsIGp1c3QgaGlkZSBpdCBmb3IgbGF0ZXIgdXNlCi0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfSk7Ci0JCQotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTEVGVCk7Ci0JbGFiZWwuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkRpYWxvZ19maW5kX3doYXQiKSk7CQotCXNlYXJjaFRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0Jc2VhcmNoVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlzZWFyY2hUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlib29sZWFuIGVuYWJsZUZpbmQgPSAoc2VhcmNoVGV4dC5nZXRDaGFyQ291bnQoKSAhPSAwKTsKLQkJCWZpbmRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVGaW5kKTsKLQkJfQotCX0pOwotCi0Jc2VhcmNoQXJlYUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTEVGVCk7Ci0Jc2VhcmNoQXJlYSA9IG5ldyBDb21ibyhzaGVsbCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotCXNlYXJjaEFyZWEuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCi0JbWF0Y2hDYXNlID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQltYXRjaENhc2Uuc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkRpYWxvZ19tYXRjaF9jYXNlIikpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCW1hdGNoQ2FzZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkKLQltYXRjaFdvcmQgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCW1hdGNoV29yZC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX21hdGNoX3dvcmQiKSk7Ci0JZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JbWF0Y2hXb3JkLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQotCUdyb3VwIGRpcmVjdGlvbiA9IG5ldyBHcm91cChzaGVsbCwgU1dULk5PTkUpOwotCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWRpcmVjdGlvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQlkaXJlY3Rpb24uc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7CQotCWRpcmVjdGlvbi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2RpcmVjdGlvbiIpKTsKLQkKLQlCdXR0b24gdXAgPSBuZXcgQnV0dG9uKGRpcmVjdGlvbiwgU1dULlJBRElPKTsKLQl1cC5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2Rpcl91cCIpKTsKLQl1cC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkKLQlkb3duID0gbmV3IEJ1dHRvbihkaXJlY3Rpb24sIFNXVC5SQURJTyk7Ci0JZG93bi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiRGlhbG9nX2Rpcl9kb3duIikpOwotCWRvd24uc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQotCWZpbmRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWZpbmRCdXR0b24uc2V0VGV4dChyZXNBZGRyZXNzQm9vay5nZXRTdHJpbmcoIkRpYWxvZ19maW5kIikpOwotCWZpbmRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQlmaW5kQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCWZpbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmICghZmluZEhhbmRsZXIuZmluZCgpKXsKLQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9JTkZPUk1BVElPTiB8IFNXVC5PSyB8IFNXVC5QUklNQVJZX01PREFMKTsKLQkJCQlib3guc2V0VGV4dChzaGVsbC5nZXRUZXh0KCkpOwotCQkJCWJveC5zZXRNZXNzYWdlKHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQ2Fubm90X2ZpbmQiKSArICJcIiIgKyBzZWFyY2hUZXh0LmdldFRleHQoKSArICJcIiIpOwotCQkJCWJveC5vcGVuKCk7CQotCQkJfQkJCi0JCX0KLQl9KTsKLQkJCQotCUJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KHJlc0FkZHJlc3NCb29rLmdldFN0cmluZygiQ2FuY2VsIikpOwotCWNhbmNlbEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCWNhbmNlbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci19Ci1wdWJsaWMgU3RyaW5nIGdldFNlYXJjaEFyZWFMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQlyZXR1cm4gc2VhcmNoQXJlYUxhYmVsLmdldFRleHQoKTsKLX0KLQotcHVibGljIFN0cmluZ1tdIGdldHNlYXJjaEFyZWFOYW1lcygpIHsKLQlyZXR1cm4gc2VhcmNoQXJlYS5nZXRJdGVtcygpOwotfQotcHVibGljIGJvb2xlYW4gZ2V0TWF0Y2hDYXNlKCkgewotCXJldHVybiBtYXRjaENhc2UuZ2V0U2VsZWN0aW9uKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBnZXRNYXRjaFdvcmQoKSB7Ci0JcmV0dXJuIG1hdGNoV29yZC5nZXRTZWxlY3Rpb24oKTsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoU3RyaW5nKCkgewotCXJldHVybiBzZWFyY2hUZXh0LmdldFRleHQoKTsKLX0KLXB1YmxpYyBib29sZWFuIGdldFNlYXJjaERvd24oKXsKLQlyZXR1cm4gZG93bi5nZXRTZWxlY3Rpb24oKTsKLX0KLXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRTZWFyY2hBcmVhKCkgewotCXJldHVybiBzZWFyY2hBcmVhLmdldFNlbGVjdGlvbkluZGV4KCk7Ci19Ci1wdWJsaWMgdm9pZCBvcGVuKCkgewotCWlmIChzaGVsbC5pc1Zpc2libGUoKSkgewotCQlzaGVsbC5zZXRGb2N1cygpOwotCX0gZWxzZSB7Ci0JCXNoZWxsLm9wZW4oKTsKLQl9Ci0Jc2VhcmNoVGV4dC5zZXRGb2N1cygpOwotfQotcHVibGljIHZvaWQgc2V0U2VhcmNoQXJlYU5hbWVzKFN0cmluZ1tdIG5hbWVzKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQlzZWFyY2hBcmVhLmFkZChuYW1lc1tpXSk7Ci0JfQotCXNlYXJjaEFyZWEuc2VsZWN0KDApOwotfQotcHVibGljIHZvaWQgc2V0U2VhcmNoQXJlYUxhYmVsKFN0cmluZyBsYWJlbCkgewotCXNlYXJjaEFyZWFMYWJlbC5zZXRUZXh0KGxhYmVsKTsKLX0KLXB1YmxpYyB2b2lkIHNldE1hdGNoQ2FzZShib29sZWFuIG1hdGNoKSB7Ci0JbWF0Y2hDYXNlLnNldFNlbGVjdGlvbihtYXRjaCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRNYXRjaFdvcmQoYm9vbGVhbiBtYXRjaCkgewotCW1hdGNoV29yZC5zZXRTZWxlY3Rpb24obWF0Y2gpOwotfQotcHVibGljIHZvaWQgc2V0U2VhcmNoRG93bihib29sZWFuIHNlYXJjaERvd24pewotCWRvd24uc2V0U2VsZWN0aW9uKHNlYXJjaERvd24pOwotfQotcHVibGljIHZvaWQgc2V0U2VhcmNoU3RyaW5nKFN0cmluZyBzZWFyY2hTdHJpbmcpIHsKLQlzZWFyY2hUZXh0LnNldFRleHQoc2VhcmNoU3RyaW5nKTsKLX0KLQotcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRTZWFyY2hBcmVhKGludCBpbmRleCkgewotCXNlYXJjaEFyZWEuc2VsZWN0KGluZGV4KTsKLX0KLXB1YmxpYyB2b2lkIGFkZEZpbmRMaXN0ZW5lcihGaW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl0aGlzLmZpbmRIYW5kbGVyID0gbGlzdGVuZXI7CQotfQotcHVibGljIHZvaWQgcmVtb3ZlRmluZExpc3RlbmVyKEZpbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCXRoaXMuZmluZEhhbmRsZXIgPSBudWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlckV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL0Jyb3dzZXJFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNGU1ODcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlckV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXJFeGFtcGxlIHsKLQlzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2Jyb3dzZXIiKTsKLQlpbnQgaW5kZXg7Ci0JYm9vbGVhbiBidXN5OwotCUltYWdlIGltYWdlc1tdOwotCUltYWdlIGljb24gPSBudWxsOwotCWJvb2xlYW4gdGl0bGUgPSBmYWxzZTsKLQlDb21wb3NpdGUgcGFyZW50OwotCVRleHQgbG9jYXRpb25CYXI7Ci0JQnJvd3NlciBicm93c2VyOwotCVRvb2xCYXIgdG9vbGJhcjsKLQlDYW52YXMgY2FudmFzOwotCVRvb2xJdGVtIGl0ZW1CYWNrLCBpdGVtRm9yd2FyZDsKLQlMYWJlbCBzdGF0dXM7Ci0JUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXI7Ci0JU1dURXJyb3IgZXJyb3IgPSBudWxsOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIGltYWdlTG9jYXRpb25zID0gewotCQkJImVjbGlwc2UwMS5ibXAiLCAiZWNsaXBzZTAyLmJtcCIsICJlY2xpcHNlMDMuYm1wIiwgImVjbGlwc2UwNC5ibXAiLCAiZWNsaXBzZTA1LmJtcCIsCi0JCQkiZWNsaXBzZTA2LmJtcCIsICJlY2xpcHNlMDcuYm1wIiwgImVjbGlwc2UwOC5ibXAiLCAiZWNsaXBzZTA5LmJtcCIsICJlY2xpcHNlMTAuYm1wIiwKLQkJCSJlY2xpcHNlMTEuYm1wIiwgImVjbGlwc2UxMi5ibXAiLH07Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBpY29uTG9jYXRpb24gPSAiZG9jdW1lbnQuZ2lmIjsKLQkJCi0JcHVibGljIEJyb3dzZXJFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gdG9wKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCWVycm9yID0gZTsKLQkJCS8qIEJyb3dzZXIgd2lkZ2V0IGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgKi8KLQkJCXBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5DRU5URVIgfCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCcm93c2VyTm90Q3JlYXRlZCIpKTsKLQkJCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW5pdFJlc291cmNlcygpOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQlicm93c2VyLnNldERhdGEoIm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyQXBwbGljYXRpb24iLCB0aGlzKTsKLQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCQlpZiAoaWNvbiAhPSBudWxsKSBzaGVsbC5zZXRJbWFnZShpY29uKTsKLQkJCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQkJQnJvd3NlckV4YW1wbGUgYXBwID0gbmV3IEJyb3dzZXJFeGFtcGxlKHNoZWxsLCBmYWxzZSk7Ci0JCQkJYXBwLnNldFNoZWxsRGVjb3JhdGlvbihpY29uLCB0cnVlKTsKLQkJCQlldmVudC5icm93c2VyID0gYXBwLmdldEJyb3dzZXIoKTsKLQkJCX0KLQkJfSk7Ci0JCWlmICh0b3ApIHsKLQkJCWJyb3dzZXIuc2V0VXJsKGdldFJlc291cmNlU3RyaW5nKCJTdGFydHVwIikpOwotCQkJc2hvdyhmYWxzZSwgbnVsbCwgbnVsbCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZSkgewotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGUpIHsKLQkJCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZS53aWRnZXQ7Ci0JCQkJCUJyb3dzZXJFeGFtcGxlIGFwcCA9IChCcm93c2VyRXhhbXBsZSlicm93c2VyLmdldERhdGEoIm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyZXhhbXBsZS5Ccm93c2VyQXBwbGljYXRpb24iKTsKLQkJCQkJYXBwLnNob3codHJ1ZSwgZS5sb2NhdGlvbiwgZS5zaXplLCBlLmFkZHJlc3NCYXIsIGUubWVudUJhciwgZS5zdGF0dXNCYXIsIGUudG9vbEJhcik7Ci0JCQkJfQotCQkJfSk7Ci0JCQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhcgotCSAqIGluc3RhbmNlIG9mIHRoZSBCcm93c2VyQXBwbGljYXRpb24uCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0JCi0JcHVibGljIFNXVEVycm9yIGdldEVycm9yKCkgeyByZXR1cm4gZXJyb3I7IH0KLQkKLQlwdWJsaWMgQnJvd3NlciBnZXRCcm93c2VyKCkgeyByZXR1cm4gYnJvd3NlcjsgfQotCQotCXB1YmxpYyB2b2lkIHNldFNoZWxsRGVjb3JhdGlvbihJbWFnZSBpY29uLCBib29sZWFuIHRpdGxlKSB7Ci0JCXRoaXMuaWNvbiA9IGljb247Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0JCi0Jdm9pZCBzaG93KGJvb2xlYW4gb3duZWQsIFBvaW50IGxvY2F0aW9uLCBQb2ludCBzaXplLCBib29sZWFuIGFkZHJlc3NCYXIsIGJvb2xlYW4gbWVudUJhciwgYm9vbGVhbiBzdGF0dXNCYXIsIGJvb2xlYW4gdG9vbEJhcikgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJaWYgKG93bmVkKSB7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgc2hlbGwuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQkJaWYgKHNpemUgIT0gbnVsbCkgc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSkpOwotCQl9Ci0JCUZvcm1EYXRhIGRhdGEgPSBudWxsOwotCQlpZiAodG9vbEJhcikgewotCQkJdG9vbGJhciA9IG5ldyBUb29sQmFyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQl0b29sYmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlpdGVtQmFjayA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtQmFjay5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCYWNrIikpOwotCQkJaXRlbUZvcndhcmQgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQkJaXRlbUZvcndhcmQuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiRm9yd2FyZCIpKTsKLQkJCWZpbmFsIFRvb2xJdGVtIGl0ZW1TdG9wID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1TdG9wLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlN0b3AiKSk7Ci0JCQlmaW5hbCBUb29sSXRlbSBpdGVtUmVmcmVzaCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCQlpdGVtUmVmcmVzaC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJSZWZyZXNoIikpOwotCQkJZmluYWwgVG9vbEl0ZW0gaXRlbUdvID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW1Hby5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJHbyIpKTsKLQkJCQotCQkJaXRlbUJhY2suc2V0RW5hYmxlZChicm93c2VyLmlzQmFja0VuYWJsZWQoKSk7Ci0JCQlpdGVtRm9yd2FyZC5zZXRFbmFibGVkKGJyb3dzZXIuaXNGb3J3YXJkRW5hYmxlZCgpKTsKLQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCVRvb2xJdGVtIGl0ZW0gPSAoVG9vbEl0ZW0pZXZlbnQud2lkZ2V0OwotCQkJCQlpZiAoaXRlbSA9PSBpdGVtQmFjaykgYnJvd3Nlci5iYWNrKCk7IAotCQkJCQllbHNlIGlmIChpdGVtID09IGl0ZW1Gb3J3YXJkKSBicm93c2VyLmZvcndhcmQoKTsKLQkJCQkJZWxzZSBpZiAoaXRlbSA9PSBpdGVtU3RvcCkgYnJvd3Nlci5zdG9wKCk7Ci0JCQkJCWVsc2UgaWYgKGl0ZW0gPT0gaXRlbVJlZnJlc2gpIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCQllbHNlIGlmIChpdGVtID09IGl0ZW1HbykgYnJvd3Nlci5zZXRVcmwobG9jYXRpb25CYXIuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9OwotCQkJaXRlbUJhY2suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQkJaXRlbUZvcndhcmQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQkJaXRlbVN0b3AuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQkJaXRlbVJlZnJlc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQkJaXRlbUdvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQotCQkJY2FudmFzID0gbmV3IENhbnZhcyhwYXJlbnQsIFNXVC5OT19CQUNLR1JPVU5EKTsKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWRhdGEud2lkdGggPSAyNDsKLQkJCWRhdGEuaGVpZ2h0ID0gMjQ7Ci0JCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCQljYW52YXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJZmluYWwgUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZXNbMF0uZ2V0Qm91bmRzKCk7Ci0JCQljYW52YXMuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlQb2ludCBwdCA9ICgoQ2FudmFzKWUud2lkZ2V0KS5nZXRTaXplKCk7Ci0JCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlc1tpbmRleF0sIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAwLCAwLCBwdC54LCBwdC55KTsJCQkKLQkJCQl9Ci0JCQl9KTsKLQkJCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlicm93c2VyLnNldFVybChnZXRSZXNvdXJjZVN0cmluZygiU3RhcnR1cCIpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChjYW52YXMuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCWlmIChidXN5KSB7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJaWYgKGluZGV4ID09IGltYWdlcy5sZW5ndGgpIGluZGV4ID0gMDsKLQkJCQkJCWNhbnZhcy5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCQlkaXNwbGF5LnRpbWVyRXhlYygxNTAsIHRoaXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChhZGRyZXNzQmFyKSB7Ci0JCQlsb2NhdGlvbkJhciA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlpZiAodG9vbGJhciAhPSBudWxsKSB7Ci0JCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbGJhciwgMCwgU1dULlRPUCk7Ci0JCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRvb2xiYXIsIDUsIFNXVC5SSUdIVCk7Ci0JCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChjYW52YXMsIC01LCBTV1QuREVGQVVMVCk7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7CQkJCi0JCQl9Ci0JCQlsb2NhdGlvbkJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbG9jYXRpb25CYXIuYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCWJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uQmFyLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKHN0YXR1c0JhcikgewotCQkJc3RhdHVzID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQkKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJvZ3Jlc3NCYXIsIDAsIFNXVC5ERUZBVUxUKTsKLQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQkJc3RhdHVzLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCXByb2dyZXNzQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQkJc3RhdHVzLnNldFRleHQoZXZlbnQudGV4dCk7CQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLQkJQ29udHJvbCBhYm92ZUJyb3dzZXIgPSB0b29sQmFyID8gKENvbnRyb2wpY2FudmFzIDogKGFkZHJlc3NCYXIgPyAoQ29udHJvbClsb2NhdGlvbkJhciA6IG51bGwpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBhYm92ZUJyb3dzZXIgIT0gbnVsbCA/IG5ldyBGb3JtQXR0YWNobWVudChhYm92ZUJyb3dzZXIsIDUsIFNXVC5ERUZBVUxUKSA6IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IHN0YXR1cyAhPSBudWxsID8gbmV3IEZvcm1BdHRhY2htZW50KHN0YXR1cywgLTUsIFNXVC5ERUZBVUxUKSA6IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlicm93c2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJaWYgKHN0YXR1c0JhciB8fCB0b29sQmFyKSB7Ci0JCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC50b3RhbCA9PSAwKSByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlpbnQgcmF0aW8gPSBldmVudC5jdXJyZW50ICogMTAwIC8gZXZlbnQudG90YWw7Ci0JCQkJCWlmIChwcm9ncmVzc0JhciAhPSBudWxsKSBwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24ocmF0aW8pOwotCQkJCQlidXN5ID0gZXZlbnQuY3VycmVudCAhPSBldmVudC50b3RhbDsKLQkJCQkJaWYgKCFidXN5KSB7Ci0JCQkJCQlpbmRleCA9IDA7Ci0JCQkJCQlpZiAoY2FudmFzICE9IG51bGwpIGNhbnZhcy5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCQlpZiAocHJvZ3Jlc3NCYXIgIT0gbnVsbCkgcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKDApOwotCQkJCQlidXN5ID0gZmFsc2U7Ci0JCQkJCWluZGV4ID0gMDsKLQkJCQkJaWYgKGNhbnZhcyAhPSBudWxsKSB7Ci0JCQkJCQlpdGVtQmFjay5zZXRFbmFibGVkKGJyb3dzZXIuaXNCYWNrRW5hYmxlZCgpKTsKLQkJCQkJCWl0ZW1Gb3J3YXJkLnNldEVuYWJsZWQoYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCkpOwotCQkJCQkJY2FudmFzLnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGFkZHJlc3NCYXIgfHwgc3RhdHVzQmFyIHx8IHRvb2xCYXIpIHsKLQkJCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJYnVzeSA9IHRydWU7Ci0JCQkJCWlmIChldmVudC50b3AgJiYgbG9jYXRpb25CYXIgIT0gbnVsbCkgbG9jYXRpb25CYXIuc2V0VGV4dChldmVudC5sb2NhdGlvbik7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAodGl0bGUpIHsKLQkJCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2hlbGwuc2V0VGV4dChldmVudC50aXRsZSsiIC0gIitnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCWlmIChvd25lZCkgc2hlbGwub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEdyYWJzIGlucHV0IGZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgZm9jdXMoKSB7Ci0JCWlmIChsb2NhdGlvbkJhciAhPSBudWxsKSBsb2NhdGlvbkJhci5zZXRGb2N1cygpOwotCQllbHNlIGlmIChicm93c2VyICE9IG51bGwpIGJyb3dzZXIuc2V0Rm9jdXMoKTsKLQkJZWxzZSBwYXJlbnQuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlcwotCSAqLwotCXZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpbWFnZXMgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQl2b2lkIGluaXRSZXNvdXJjZXMoKSB7Ci0JCWZpbmFsIENsYXNzIGNsYXp6ID0gdGhpcy5nZXRDbGFzcygpOwotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW1hZ2VzID09IG51bGwpIHsKLQkJCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoc291cmNlU3RyZWFtKTsKLQkJCQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCQkJCWltYWdlc1tpXSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2VTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSAoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJfQotCQl9Ci0JCVN0cmluZyBlcnJvciA9IChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSA/IGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSA6ICJVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMiOwotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGVycm9yKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBCcm93c2VyRXhhbXBsZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGljb25Mb2NhdGlvbik7Ci0JCUltYWdlIGljb24gPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJc2hlbGwuc2V0SW1hZ2UoaWNvbik7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlCcm93c2VyRXhhbXBsZSBhcHAgPSBuZXcgQnJvd3NlckV4YW1wbGUoc2hlbGwsIHRydWUpOwotCQlhcHAuc2V0U2hlbGxEZWNvcmF0aW9uKGljb24sIHRydWUpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWljb24uZGlzcG9zZSgpOwotCQlhcHAuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9kb2N1bWVudC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9kb2N1bWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWUyMjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZG9jdW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAxLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTE2ZTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAxLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMi5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDIuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGIwNGVmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwMi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDMuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTAzLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjN2IxMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDMuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA0LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDA2NTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQ1YTk5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDYuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA2LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhODg4YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDYuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA3LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwNy5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTIyMjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA3LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDguYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWFjMjlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UwOC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDkuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTA5LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxZjgzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMDkuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEwLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTc5YjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEwLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTEuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGMyNGE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXJleGFtcGxlL2VjbGlwc2UxMS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTIuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvZWNsaXBzZTEyLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhZTcxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9lY2xpcHNlMTIuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmRFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDk3YzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNsaXBib2FyZDsKLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIENsaXBib2FyZEV4YW1wbGUgewotCi0JQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQlTaGVsbCBzaGVsbDsKLQlUZXh0IHRleHQ7Ci0JQ29tYm8gY29tYm87Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCUxhYmVsIHN0YXR1czsKLQlzdGF0aWMgZmluYWwgaW50IFNJWkUgPSA2MDsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQluZXcgQ2xpcGJvYXJkRXhhbXBsZSgpLm9wZW4oZGlzcGxheSk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci1wdWJsaWMgdm9pZCBvcGVuKERpc3BsYXkgZGlzcGxheSkgewotCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlNXVCBDbGlwYm9hcmQiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2MsIFNXVC5OT05FKTsKLQlzYy5zZXRDb250ZW50KHBhcmVudCk7Ci0JcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCi0JR3JvdXAgY29weUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWNvcHlHcm91cC5zZXRUZXh0KCJDb3B5IEZyb206Iik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWNvcHlHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWNvcHlHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkKLQlHcm91cCBwYXN0ZUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCXBhc3RlR3JvdXAuc2V0VGV4dCgiUGFzdGUgVG86Iik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCXBhc3RlR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlwYXN0ZUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQotCUdyb3VwIGNvbnRyb2xHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQljb250cm9sR3JvdXAuc2V0VGV4dCgiQ29udHJvbCBBUEk6Iik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkKLQlHcm91cCB0eXBlc0dyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCXR5cGVzR3JvdXAuc2V0VGV4dCgiQXZhaWxhYmxlIFR5cGVzIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCXR5cGVzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl0eXBlc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCXN0YXR1cyA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5CT1JERVIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQlkYXRhLmhlaWdodEhpbnQgPSA2MDsKLQlzdGF0dXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQljcmVhdGVUZXh0VHJhbnNmZXIoY29weUdyb3VwLCBwYXN0ZUdyb3VwKTsKLQljcmVhdGVSVEZUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZUhUTUxUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZUZpbGVUcmFuc2Zlcihjb3B5R3JvdXAsIHBhc3RlR3JvdXApOwotCWNyZWF0ZUltYWdlVHJhbnNmZXIoY29weUdyb3VwLCBwYXN0ZUdyb3VwKTsKLQljcmVhdGVNeVRyYW5zZmVyKGNvcHlHcm91cCwgcGFzdGVHcm91cCk7Ci0JY3JlYXRlQ29udHJvbFRyYW5zZmVyKGNvbnRyb2xHcm91cCk7Ci0JY3JlYXRlQXZhaWxhYmxlVHlwZXModHlwZXNHcm91cCk7Ci0JCi0Jc2Muc2V0TWluU2l6ZShwYXJlbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0Jc2Muc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQlzYy5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkKLQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlSZWN0YW5nbGUgbW9uaXRvckFyZWEgPSBzaGVsbC5nZXRNb25pdG9yKCkuZ2V0Q2xpZW50QXJlYSgpOwotCXNoZWxsLnNldFNpemUoTWF0aC5taW4oc2l6ZS54LCBtb25pdG9yQXJlYS53aWR0aCAtIDIwKSwgTWF0aC5taW4oc2l6ZS55LCBtb25pdG9yQXJlYS5oZWlnaHQgLSAyMCkpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLX0KLXZvaWQgY3JlYXRlVGV4dFRyYW5zZmVyKENvbXBvc2l0ZSBjb3B5UGFyZW50LCBDb21wb3NpdGUgcGFzdGVQYXJlbnQpIHsKLQkKLQkvLyBUZXh0VHJhbnNmZXIKLQlMYWJlbCBsID0gbmV3IExhYmVsKGNvcHlQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlRleHRUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFRleHQgY29weVRleHQgPSBuZXcgVGV4dChjb3B5UGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQljb3B5VGV4dC5zZXRUZXh0KCJzb21lXG5wbGFpblxudGV4dCIpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JY29weVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gY29weVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10ge2RhdGF9LCBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gY29weSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JbCA9IG5ldyBMYWJlbChwYXN0ZVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiVGV4dFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgVGV4dCBwYXN0ZVRleHQgPSBuZXcgVGV4dChwYXN0ZVBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JcGFzdGVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFzdGVQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nIGRhdGEgPSAoU3RyaW5nKWNsaXBib2FyZC5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCXBhc3RlVGV4dC5zZXRUZXh0KCJiZWdpbiBwYXN0ZT4iK2RhdGErIjxlbmQgcGFzdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gcGFzdGUiKTsKLQkJCX0KLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVSVEZUcmFuc2ZlcihDb21wb3NpdGUgY29weVBhcmVudCwgQ29tcG9zaXRlIHBhc3RlUGFyZW50KXsKLQkvLwlSVEYgVHJhbnNmZXIKLQlMYWJlbCBsID0gbmV3IExhYmVsKGNvcHlQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlJURlRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgVGV4dCBjb3B5UnRmVGV4dCA9IG5ldyBUZXh0KGNvcHlQYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWNvcHlSdGZUZXh0LnNldFRleHQoInNvbWVcbnJ0ZlxudGV4dCIpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JY29weVJ0ZlRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gY29weVJ0ZlRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCWRhdGEgPSAie1xccnRmMXtcXGNvbG9ydGJsO1xccmVkMjU1XFxncmVlbjBcXGJsdWUwO31cXHVjMVxcYlxcaSAiICsgZGF0YSArICJ9IjsKLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHtkYXRhfSwgbmV3IFRyYW5zZmVyW10ge1JURlRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gY29weSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JICAKLQlsID0gbmV3IExhYmVsKHBhc3RlUGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJSVEZUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFRleHQgcGFzdGVSdGZUZXh0ID0gbmV3IFRleHQocGFzdGVQYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlUnRmVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWIgPSBuZXcgQnV0dG9uKHBhc3RlUGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gKFN0cmluZyljbGlwYm9hcmQuZ2V0Q29udGVudHMoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCXBhc3RlUnRmVGV4dC5zZXRUZXh0KCJzdGFydCBwYXN0ZT4iK2RhdGErIjxlbmQgcGFzdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gcGFzdGUiKTsKLQkJCX0KLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVIVE1MVHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy8JSFRNTCBUcmFuc2ZlcgotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiSFRNTFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgVGV4dCBjb3B5SHRtbFRleHQgPSBuZXcgVGV4dChjb3B5UGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQljb3B5SHRtbFRleHQuc2V0VGV4dCgiPGI+SGVsbG8gV29ybGQ8L2I+Iik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQljb3B5SHRtbFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBkYXRhID0gY29weUh0bWxUZXh0LmdldFRleHQoKTsKLQkJCWlmIChkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHtkYXRhfSwgbmV3IFRyYW5zZmVyW10ge0hUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIGNvcHkiKTsKLQkJCX0KLQkJfQotCX0pOwotCSAgCi0JbCA9IG5ldyBMYWJlbChwYXN0ZVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiSFRNTFRyYW5zZmVyOiIpOyAvLyROT04tTkxTLTEkCi0JZmluYWwgVGV4dCBwYXN0ZUh0bWxUZXh0ID0gbmV3IFRleHQocGFzdGVQYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlSHRtbFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQliID0gbmV3IEJ1dHRvbihwYXN0ZVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2xpcGJvYXJkLmdldENvbnRlbnRzKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVIdG1sVGV4dC5zZXRUZXh0KCJzdGFydCBwYXN0ZT4iK2RhdGErIjxlbmQgcGFzdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gcGFzdGUiKTsKLQkJCX0KLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVGaWxlVHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy9GaWxlIFRyYW5zZmVyCi0JTGFiZWwgbCA9IG5ldyBMYWJlbChjb3B5UGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJGaWxlVHJhbnNmZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQkKLQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlmaW5hbCBUYWJsZSBjb3B5RmlsZVRhYmxlID0gbmV3IFRhYmxlKGMsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JY29weUZpbGVUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJTZWxlY3QgZmlsZShzKSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOIHwgU1dULk1VTFRJKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApewotCQkJCVN0cmluZyBzZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JCQkJU3RyaW5nIHBhdGggPSBkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpOwotCQkJCVN0cmluZ1tdIG5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvcHlGaWxlVGFibGUsIFNXVC5OT05FKTsKLQkJCQkJaXRlbS5zZXRUZXh0KHBhdGgrc2VwYXJhdG9yK25hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJTZWxlY3QgZGlyZWN0b3J5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApewotCQkJCS8vY29weUZpbGVUYWJsZS5yZW1vdmVBbGwoKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29weUZpbGVUYWJsZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dChyZXN1bHQpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24oY29weVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gY29weUZpbGVUYWJsZS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDApewotCQkJCXN0YXR1cy5zZXRUZXh0KCIiKTsKLQkJCQlTdHJpbmdbXSBkYXRhID0gbmV3IFN0cmluZ1tpdGVtcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCQlkYXRhW2ldID0gaXRlbXNbaV0uZ2V0VGV4dCgpOwotCQkJCX0KLQkJCQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHtkYXRhfSwgbmV3IFRyYW5zZmVyW10ge0ZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIGNvcHkiKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWwgPSBuZXcgTGFiZWwocGFzdGVQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIkZpbGVUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFRhYmxlIHBhc3RlRmlsZVRhYmxlID0gbmV3IFRhYmxlKHBhc3RlUGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXBhc3RlRmlsZVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFzdGVQYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlBhc3RlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3RyaW5nW10gZGF0YSA9IChTdHJpbmdbXSljbGlwYm9hcmQuZ2V0Q29udGVudHMoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCA+IDApIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVGaWxlVGFibGUucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShwYXN0ZUZpbGVUYWJsZSwgU1dULk5PTkUpOwotCQkJCQlpdGVtLnNldFRleHQoZGF0YVtpXSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMuc2V0VGV4dCgibm90aGluZyB0byBwYXN0ZSIpOwotCQkJfQotCQl9Ci0JfSk7CSAKLX0KLQotdm9pZCBjcmVhdGVJbWFnZVRyYW5zZmVyKENvbXBvc2l0ZSBjb3B5UGFyZW50LCBDb21wb3NpdGUgcGFzdGVQYXJlbnQpewotCWZpbmFsIEltYWdlW10gY29weUltYWdlID0gbmV3IEltYWdlW10ge251bGx9OwotCUxhYmVsIGwgPSBuZXcgTGFiZWwoY29weVBhcmVudCwgU1dULk5PTkUpOwotCWwuc2V0VGV4dCgiSW1hZ2VUcmFuc2ZlcjoiKTsgLy8kTk9OLU5MUy0xJAotCQotCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShjb3B5UGFyZW50LCBTV1QuTk9ORSk7Ci0JYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JYy5zZXRMYXlvdXREYXRhKGRhdGEpOwkKLQkKLQlmaW5hbCBDYW52YXMgY29weUltYWdlQ2FudmFzID0gbmV3IENhbnZhcyhjLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCWNvcHlJbWFnZUNhbnZhcy5zZXRMYXlvdXREYXRhKGRhdGEpOwkKLQkKLQlmaW5hbCBQb2ludCBjb3B5T3JpZ2luID0gbmV3IFBvaW50KDAsIDApOwotCWZpbmFsIFNjcm9sbEJhciBjb3B5SEJhciA9IGNvcHlJbWFnZUNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JY29weUhCYXIuc2V0RW5hYmxlZChmYWxzZSk7CQotCWNvcHlIQmFyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKGNvcHlJbWFnZVswXSAhPSBudWxsKSB7Ci0JCQkJaW50IGhTZWxlY3Rpb24gPSBjb3B5SEJhci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgZGVzdFggPSAtaFNlbGVjdGlvbiAtIGNvcHlPcmlnaW4ueDsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGNvcHlJbWFnZVswXS5nZXRCb3VuZHMoKTsKLQkJCQljb3B5SW1hZ2VDYW52YXMuc2Nyb2xsKGRlc3RYLCAwLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJCWNvcHlPcmlnaW4ueCA9IC1oU2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JfSk7Ci0JZmluYWwgU2Nyb2xsQmFyIGNvcHlWQmFyID0gY29weUltYWdlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JY29weVZCYXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JY29weVZCYXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJaWYgKGNvcHlJbWFnZVswXSAhPSBudWxsKSB7Ci0JCQkJaW50IHZTZWxlY3Rpb24gPSBjb3B5VkJhci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgZGVzdFkgPSAtdlNlbGVjdGlvbiAtIGNvcHlPcmlnaW4ueTsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGNvcHlJbWFnZVswXS5nZXRCb3VuZHMoKTsKLQkJCQljb3B5SW1hZ2VDYW52YXMuc2Nyb2xsKDAsIGRlc3RZLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJCWNvcHlPcmlnaW4ueSA9IC12U2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JfSk7Ci0JY29weUltYWdlQ2FudmFzLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZihjb3B5SW1hZ2VbMF0gIT0gbnVsbCkgewotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQlnYy5kcmF3SW1hZ2UoY29weUltYWdlWzBdLCBjb3B5T3JpZ2luLngsIGNvcHlPcmlnaW4ueSk7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBjb3B5SW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGNsaWVudCA9IGNvcHlJbWFnZUNhbnZhcy5nZXRDbGllbnRBcmVhICgpOwotCQkJCWludCBtYXJnaW5XaWR0aCA9IGNsaWVudC53aWR0aCAtIHJlY3Qud2lkdGg7Ci0JCQkJaWYgKG1hcmdpbldpZHRoID4gMCkgewotCQkJCQlnYy5maWxsUmVjdGFuZ2xlIChyZWN0LndpZHRoLCAwLCBtYXJnaW5XaWR0aCwgY2xpZW50LmhlaWdodCk7Ci0JCQkJfQotCQkJCWludCBtYXJnaW5IZWlnaHQgPSBjbGllbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQ7Ci0JCQkJaWYgKG1hcmdpbkhlaWdodCA+IDApIHsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCByZWN0LmhlaWdodCwgY2xpZW50LndpZHRoLCBtYXJnaW5IZWlnaHQpOwotCQkJCX0KLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gb3BlbkJ1dHRvbiA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotCW9wZW5CdXR0b24uc2V0VGV4dCgiT3BlbiBJbWFnZSIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCW9wZW5CdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlvcGVuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nIChzaGVsbCwgU1dULk9QRU4pOwotCQkJZGlhbG9nLnNldFRleHQoIk9wZW4gYW4gaW1hZ2UgZmlsZSBvciBjYW5jZWwiKTsKLQkJCVN0cmluZyBzdHJpbmcgPSBkaWFsb2cub3BlbiAoKTsKLQkJCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQkJCWlmIChjb3B5SW1hZ2VbMF0gIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvcHlJbWFnZSIpOwotCQkJCQljb3B5SW1hZ2VbMF0uZGlzcG9zZSgpOwotCQkJCX0KLQkJCQljb3B5SW1hZ2VbMF0gPSBuZXcgSW1hZ2UoZS5kaXNwbGF5LCBzdHJpbmcpOwotCQkJCWNvcHlWQmFyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJY29weUhCYXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQljb3B5T3JpZ2luLnggPSAwOyBjb3B5T3JpZ2luLnkgPSAwOwotCQkJCVJlY3RhbmdsZSByZWN0ID0gY29weUltYWdlWzBdLmdldEJvdW5kcygpOwotCQkJCVJlY3RhbmdsZSBjbGllbnQgPSBjb3B5SW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwkJCi0JCQkJY29weUhCYXIuc2V0TWF4aW11bShyZWN0LndpZHRoKTsKLQkJCQljb3B5VkJhci5zZXRNYXhpbXVtKHJlY3QuaGVpZ2h0KTsKLQkJCQljb3B5SEJhci5zZXRUaHVtYihNYXRoLm1pbihyZWN0LndpZHRoLCBjbGllbnQud2lkdGgpKTsKLQkJCQljb3B5VkJhci5zZXRUaHVtYihNYXRoLm1pbihyZWN0LmhlaWdodCwgY2xpZW50LmhlaWdodCkpOwotCQkJCWNvcHlJbWFnZUNhbnZhcy5zY3JvbGwoMCwgMCwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIHRydWUpOwotCQkJCWNvcHlWQmFyLnNldFNlbGVjdGlvbigwKTsKLQkJCQljb3B5SEJhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJY29weUltYWdlQ2FudmFzLnJlZHJhdygpOwotCQkJfQotCQl9Ci0JfSk7CQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb3B5UGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGNvcHlJbWFnZVswXSAhPSBudWxsKSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIiIpOwotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10ge2NvcHlJbWFnZVswXS5nZXRJbWFnZURhdGEoKX0sIG5ldyBUcmFuc2ZlcltdIHtJbWFnZVRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzLnNldFRleHQoIm5vdGhpbmcgdG8gY29weSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JZmluYWwgSW1hZ2VbXSBwYXN0ZUltYWdlID0gbmV3IEltYWdlW10ge251bGx9OwkgIAotCWwgPSBuZXcgTGFiZWwocGFzdGVQYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIkltYWdlVHJhbnNmZXI6Iik7Ci0JZmluYWwgQ2FudmFzIHBhc3RlSW1hZ2VDYW52YXMgPSBuZXcgQ2FudmFzKHBhc3RlUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCWRhdGEuaGVpZ2h0SGludCA9IGRhdGEud2lkdGhIaW50ID0gU0laRTsKLQlwYXN0ZUltYWdlQ2FudmFzLnNldExheW91dERhdGEoZGF0YSk7Ci0JZmluYWwgUG9pbnQgcGFzdGVPcmlnaW4gPSBuZXcgUG9pbnQoMCwgMCk7Ci0JZmluYWwgU2Nyb2xsQmFyIHBhc3RlSEJhciA9IHBhc3RlSW1hZ2VDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCXBhc3RlSEJhci5zZXRFbmFibGVkKGZhbHNlKTsJCi0JcGFzdGVIQmFyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKHBhc3RlSW1hZ2VbMF0gIT0gbnVsbCkgewotCQkJCWludCBoU2VsZWN0aW9uID0gcGFzdGVIQmFyLmdldFNlbGVjdGlvbigpOwotCQkJCWludCBkZXN0WCA9IC1oU2VsZWN0aW9uIC0gcGFzdGVPcmlnaW4ueDsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhc3RlSW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJcGFzdGVJbWFnZUNhbnZhcy5zY3JvbGwoZGVzdFgsIDAsIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQkJcGFzdGVPcmlnaW4ueCA9IC1oU2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JfSk7Ci0JZmluYWwgU2Nyb2xsQmFyIHBhc3RlVkJhciA9IHBhc3RlSW1hZ2VDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQlwYXN0ZVZCYXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JcGFzdGVWQmFyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYgKHBhc3RlSW1hZ2VbMF0gIT0gbnVsbCkgewotCQkJCWludCB2U2VsZWN0aW9uID0gcGFzdGVWQmFyLmdldFNlbGVjdGlvbigpOwotCQkJCWludCBkZXN0WSA9IC12U2VsZWN0aW9uIC0gcGFzdGVPcmlnaW4ueTsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhc3RlSW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJcGFzdGVJbWFnZUNhbnZhcy5zY3JvbGwoMCwgZGVzdFksIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQkJcGFzdGVPcmlnaW4ueSA9IC12U2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JfSk7Ci0JcGFzdGVJbWFnZUNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJaWYocGFzdGVJbWFnZVswXSAhPSBudWxsKSB7Ci0JCQkJR0MgZ2MgPSBlLmdjOwotCQkJCWdjLmRyYXdJbWFnZShwYXN0ZUltYWdlWzBdLCBwYXN0ZU9yaWdpbi54LCBwYXN0ZU9yaWdpbi55KTsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhc3RlSW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGNsaWVudCA9IHBhc3RlSW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQlpbnQgbWFyZ2luV2lkdGggPSBjbGllbnQud2lkdGggLSByZWN0LndpZHRoOwotCQkJCWlmIChtYXJnaW5XaWR0aCA+IDApIHsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZShyZWN0LndpZHRoLCAwLCBtYXJnaW5XaWR0aCwgY2xpZW50LmhlaWdodCk7Ci0JCQkJfQotCQkJCWludCBtYXJnaW5IZWlnaHQgPSBjbGllbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQ7Ci0JCQkJaWYgKG1hcmdpbkhlaWdodCA+IDApIHsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCByZWN0LmhlaWdodCwgY2xpZW50LndpZHRoLCBtYXJnaW5IZWlnaHQpOwotCQkJCX0KLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihwYXN0ZVBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CQkKLQkJCUltYWdlRGF0YSBkYXRhID0oSW1hZ2VEYXRhKWNsaXBib2FyZC5nZXRDb250ZW50cyhJbWFnZVRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCWlmIChwYXN0ZUltYWdlWzBdICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQYXN0ZUltYWdlIik7Ci0JCQkJCXBhc3RlSW1hZ2VbMF0uZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlzdGF0dXMuc2V0VGV4dCgiIik7Ci0JCQkJcGFzdGVJbWFnZVswXSA9IG5ldyBJbWFnZShlLmRpc3BsYXksIGRhdGEpOwotCQkJCXBhc3RlVkJhci5zZXRFbmFibGVkKHRydWUpOwotCQkJCXBhc3RlSEJhci5zZXRFbmFibGVkKHRydWUpOwotCQkJCXBhc3RlT3JpZ2luLnggPSAwOyBwYXN0ZU9yaWdpbi55ID0gMDsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHBhc3RlSW1hZ2VbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGNsaWVudCA9IHBhc3RlSW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwkJCi0JCQkJcGFzdGVIQmFyLnNldE1heGltdW0ocmVjdC53aWR0aCk7Ci0JCQkJcGFzdGVWQmFyLnNldE1heGltdW0ocmVjdC5oZWlnaHQpOwotCQkJCXBhc3RlSEJhci5zZXRUaHVtYihNYXRoLm1pbihyZWN0LndpZHRoLCBjbGllbnQud2lkdGgpKTsKLQkJCQlwYXN0ZVZCYXIuc2V0VGh1bWIoTWF0aC5taW4ocmVjdC5oZWlnaHQsIGNsaWVudC5oZWlnaHQpKTsKLQkJCQlwYXN0ZUltYWdlQ2FudmFzLnNjcm9sbCgwLCAwLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgdHJ1ZSk7Ci0JCQkJcGFzdGVWQmFyLnNldFNlbGVjdGlvbigwKTsKLQkJCQlwYXN0ZUhCYXIuc2V0U2VsZWN0aW9uKDApOwotCQkJCXBhc3RlSW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXR1cy5zZXRUZXh0KCJub3RoaW5nIHRvIHBhc3RlIik7Ci0JCQl9CQkJCi0JCX0KLQl9KTsJCi19Ci12b2lkIGNyZWF0ZU15VHJhbnNmZXIoQ29tcG9zaXRlIGNvcHlQYXJlbnQsIENvbXBvc2l0ZSBwYXN0ZVBhcmVudCl7Ci0JLy8JTXlUeXBlIFRyYW5zZmVyCi0JLy8gVE9ETwotfQotdm9pZCBjcmVhdGVDb250cm9sVHJhbnNmZXIoQ29tcG9zaXRlIHBhcmVudCl7Ci0JTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlsLnNldFRleHQoIlRleHQ6Iik7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ3V0Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdGV4dC5jdXQoKTsKLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ29weSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRleHQuY29weSgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRleHQucGFzdGUoKTsKLQkJfQotCX0pOwotCXRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQlkYXRhLmhlaWdodEhpbnQgPSBkYXRhLndpZHRoSGludCA9IFNJWkU7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJDb21ibzoiKTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkN1dCIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWNvbWJvLmN1dCgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJDb3B5Iik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJY29tYm8uY29weSgpOwotCQl9Ci0JfSk7Ci0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJQYXN0ZSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWNvbWJvLnBhc3RlKCk7Ci0JCX0KLQl9KTsKLQljb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5OT05FKTsKLQljb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyJJdGVtIDEiLCAiSXRlbSAyIiwgIkl0ZW0gMyIsICJBIGxvbmdlciBJdGVtIn0pOwotCQotCWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRUZXh0KCJTdHlsZWRUZXh0OiIpOwotCWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNvcHkiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzdHlsZWRUZXh0LmNvcHkoKTsKLQkJfQotCX0pOwotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUGFzdGUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzdHlsZWRUZXh0LnBhc3RlKCk7Ci0JCX0KLQl9KTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTSVpFOwotCXN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLX0KLXZvaWQgY3JlYXRlQXZhaWxhYmxlVHlwZXMoQ29tcG9zaXRlIHBhcmVudCl7Ci0JZmluYWwgTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCWxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJHZXQgQXZhaWxhYmxlIFR5cGVzIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbGlzdC5yZW1vdmVBbGwoKTsKLQkJCVN0cmluZ1tdIG5hbWVzID0gY2xpcGJvYXJkLmdldEF2YWlsYWJsZVR5cGVOYW1lcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWxpc3QuYWRkKG5hbWVzW2ldKTsKLQkJCX0KLQkJfQotCX0pOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjZGZjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNsaXBib2FyZDsKLQotcHVibGljIGNsYXNzIE15VHlwZSB7Ci0JU3RyaW5nIGZpcnN0TmFtZTsKLQlTdHJpbmcgbGFzdE5hbWU7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jbGlwYm9hcmQvTXlUeXBlVHJhbnNmZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGVUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA5ZTNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NsaXBib2FyZC9NeVR5cGVUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2xpcGJvYXJkOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLQotcHVibGljIGNsYXNzIE15VHlwZVRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEVOQU1FID0gIm5hbWVfbGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFSUQgPSByZWdpc3RlclR5cGUoTVlUWVBFTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgTXlUeXBlVHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHlwZVRyYW5zZmVyKCk7Ci0JCi1wdWJsaWMgc3RhdGljIE15VHlwZVRyYW5zZmVyIGdldEluc3RhbmNlICgpIHsKLQlyZXR1cm4gX2luc3RhbmNlOwotfQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JaWYgKCFjaGVja015VHlwZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JfQotCU15VHlwZVtdIG15VHlwZXMgPSAoTXlUeXBlW10pIG9iamVjdDsJCi0JdHJ5IHsKLQkJLy8gd3JpdGUgZGF0YSB0byBhIGJ5dGUgYXJyYXkgYW5kIHRoZW4gYXNrIHN1cGVyIHRvIGNvbnZlcnQgdG8gcE1lZGl1bQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG15VHlwZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyAgaSsrKXsKLQkJCWJ5dGVbXSBidWZmZXIgPSBteVR5cGVzW2ldLmZpcnN0TmFtZS5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJYnVmZmVyID0gbXlUeXBlc1tpXS5maXJzdE5hbWUuZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJfQotCQlieXRlW10gYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCXN1cGVyLmphdmFUb05hdGl2ZShidWZmZXIsIHRyYW5zZmVyRGF0YSk7CQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsJCi0JaWYgKGlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCQotCQlieXRlW10gYnVmZmVyID0gKGJ5dGVbXSlzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCi0JCU15VHlwZVtdIG15RGF0YSA9IG5ldyBNeVR5cGVbMF07Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOwotCQkJd2hpbGUocmVhZEluLmF2YWlsYWJsZSgpID4gMjApIHsKLQkJCQlNeVR5cGUgZGF0dW0gPSBuZXcgTXlUeXBlKCk7Ci0JCQkJaW50IHNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJCWJ5dGVbXSBuYW1lID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQkJcmVhZEluLnJlYWQobmFtZSk7Ci0JCQkJZGF0dW0uZmlyc3ROYW1lID0gbmV3IFN0cmluZyhuYW1lKTsKLQkJCQlzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCQluYW1lID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQkJcmVhZEluLnJlYWQobmFtZSk7Ci0JCQkJZGF0dW0ubGFzdE5hbWUgPSBuZXcgU3RyaW5nKG5hbWUpOwotCQkJCU15VHlwZVtdIG5ld015RGF0YSA9IG5ldyBNeVR5cGVbbXlEYXRhLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobXlEYXRhLCAwLCBuZXdNeURhdGEsIDAsIG15RGF0YS5sZW5ndGgpOwotCQkJCW5ld015RGF0YVtteURhdGEubGVuZ3RoXSA9IGRhdHVtOwotCQkJCW15RGF0YSA9IG5ld015RGF0YTsKLQkJCX0KLQkJCXJlYWRJbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG15RGF0YTsKLQl9Ci0KLQlyZXR1cm4gbnVsbDsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmV3IFN0cmluZ1tde01ZVFlQRU5BTUV9OwotfQotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlyZXR1cm4gbmV3IGludFtdIHtNWVRZUEVJRH07Ci19Ci1ib29sZWFuIGNoZWNrTXlUeXBlKE9iamVjdCBvYmplY3QpIHsKLQlpZiAob2JqZWN0ID09IG51bGwgfHwgIShvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGVbXSkgfHwgKChNeVR5cGVbXSlvYmplY3QpLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7Ci0JTXlUeXBlW10gbXlUeXBlcyA9IChNeVR5cGVbXSlvYmplY3Q7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBteVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChteVR5cGVzW2ldID09IG51bGwgfHwgCi0JCQlteVR5cGVzW2ldLmZpcnN0TmFtZSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maXJzdE5hbWUubGVuZ3RoKCkgPT0gMCB8fAotCQkJbXlUeXBlc1tpXS5sYXN0TmFtZSA9PSBudWxsIHx8Ci0JCQlteVR5cGVzW2ldLmxhc3ROYW1lLmxlbmd0aCgpID09IDApIHJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIGNoZWNrTXlUeXBlKG9iamVjdCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9BbGlnbmFibGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0FsaWduYWJsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzVlZTIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0FsaWduYWJsZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIDxjb2RlPkFsaWduYWJsZVRhYjwvY29kZT4gaXMgdGhlIGFic3RyYWN0Ci0gKiBzdXBlcmNsYXNzIG9mIGV4YW1wbGUgY29udHJvbHMgdGhhdCBjYW4gYmUKLSAqIGFsaWduZWQuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFsaWduYWJsZVRhYiBleHRlbmRzIFRhYiB7Ci0KLQkvKiBBbGlnbm1lbnQgQ29udHJvbHMgKi8KLQlCdXR0b24gbGVmdEJ1dHRvbiwgcmlnaHRCdXR0b24sIGNlbnRlckJ1dHRvbjsKLQotCS8qIEFsaWdubWVudCBHcm91cCAqLwotCUdyb3VwIGFsaWdubWVudEdyb3VwOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUFsaWduYWJsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4gCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJYWxpZ25tZW50R3JvdXAgPSBuZXcgR3JvdXAgKG90aGVyR3JvdXAsIFNXVC5OT05FKTsKLQkJYWxpZ25tZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWFsaWdubWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfAotCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlhbGlnbm1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWxpZ25tZW50IikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCWxlZnRCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJbGVmdEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGVmdCIpKTsKLQkJY2VudGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNlbnRlckJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDZW50ZXIiKSk7Ci0JCXJpZ2h0QnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSaWdodCIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmICghKChCdXR0b24pIGV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uICgpKSByZXR1cm47Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKTsKLQkJCX0KLQkJfTsKLQkJbGVmdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQljZW50ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJcmlnaHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlXaWRnZXQgW10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlpZiAod2lkZ2V0cy5sZW5ndGggIT0gMCkgewotCQkJbGVmdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5MRUZUKSAhPSAwKTsKLQkJCWNlbnRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5DRU5URVIpICE9IDApOwotCQkJcmlnaHRCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQnJvd3NlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQnJvd3NlclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTZhMzc3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0Jyb3dzZXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEJyb3dzZXJUYWIgZXh0ZW5kcyBUYWIgewotCi0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlCcm93c2VyIGJyb3dzZXI7Ci0JR3JvdXAgYnJvd3Nlckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gbW96aWxsYUJ1dHRvbjsKLQkKLQlTdHJpbmcgZXJyb3JNZXNzYWdlOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlCcm93c2VyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0Jdm9pZCBjcmVhdGVCYWNrZ3JvdW5kTW9kZUdyb3VwICgpIHsKLQkJLy8gQnJvd3NlciBkb2VzIG5vdCBuZWVkIGEgYmFja2dyb3VuZCBtb2RlIGdyb3VwLgotCX0KLQkKLQl2b2lkIGNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwICgpIHsKLQkJLy8gQnJvd3NlciBkb2VzIG5vdCBuZWVkIGEgY29sb3IgYW5kIGZvbnQgZ3JvdXAuCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgYnJvd3NlciAqLwotCQlicm93c2VyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlicm93c2VyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWJyb3dzZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlicm93c2VyR3JvdXAuc2V0VGV4dCAoIkJyb3dzZXIiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAobW96aWxsYUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NT1pJTExBOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlciAoYnJvd3Nlckdyb3VwLCBzdHlsZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsgLy9YUENPTSBlcnJvcgotCQkJdHJ5IHsKLQkJCQlicm93c2VyID0gbmV3IEJyb3dzZXIgKGJyb3dzZXJHcm91cCwgc3R5bGUgJn4gU1dULk1PWklMTEEpOwotCQkJfSBjYXRjaCAoU1dURXJyb3IgZTIpIHsgLy8gVW5zdXBwb3J0ZWQgcGxhdGZvcm0KLQkJCQllcnJvck1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULk9LKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNb3ppbGxhTm90Rm91bmQiLCBuZXcgU3RyaW5nIFtdIHtlLmdldE1lc3NhZ2UoKX0pKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0KLQkJCi0gICAgICAgIElucHV0U3RyZWFtIGh0bWxTdHJlYW09IENvbnRyb2xFeGFtcGxlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImJyb3dzZXItY29udGVudC5odG1sIik7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGh0bWxTdHJlYW0pKTsKLQkJU3RyaW5nQnVmZmVyIHNiPSBuZXcgU3RyaW5nQnVmZmVyKDMwMCk7Ci0JCXRyeSB7Ci0JCQlpbnQgcmVhZD0gMDsKLQkJCXdoaWxlICgocmVhZD0gYnIucmVhZCgpKSAhPSAtMSkKLQkJCQlzYi5hcHBlbmQoKGNoYXIpIHJlYWQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlici5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWxvZyhlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHRleHQ9IHNiLnRvU3RyaW5nKCk7Ci0JCWJyb3dzZXIuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4gIFRoaXMgaXMgdHlwaWNhbGx5Ci0JICogYSBjaGlsZCBvZiB0aGUgIkNvbnRyb2wiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCWJhY2tncm91bmRJbWFnZUJ1dHRvbi5kaXNwb3NlICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU2l6ZSIgZ3JvdXAuICBUaGUgIlNpemUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHNpemUgb2YKLQkgKiB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU2l6ZUdyb3VwICgpOwotCQkKLQkJLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlIGZvciBCcm93c2VyIHRvIGZpbGwgaG9yaXpvbnRhbGx5ICYgdmVydGljYWxseS4gKi8KLQkJZmlsbEhCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJZmlsbFZCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQltb3ppbGxhQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbW96aWxsYUJ1dHRvbi5zZXRUZXh0ICgiU1dULk1PWklMTEEiKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKGZpbmFsIFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJc3VwZXIuY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKTsKLQotCQkvKgotCQkgKiBBZGQgYSByZXNpemUgbGlzdGVuZXIgdG8gdGhlIHRhYkZvbGRlclBhZ2Ugc28gdGhhdAotCQkgKiBpZiB0aGUgdXNlciB0eXBlcyBpbnRvIHRoZSBleGFtcGxlIHdpZGdldCB0byBjaGFuZ2UKLQkJICogaXRzIHByZWZlcnJlZCBzaXplLCBhbmQgdGhlbiByZXNpemVzIHRoZSBzaGVsbCwgd2UKLQkJICogcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplIGNvcnJlY3RseS4KLQkJICovCi0JCXRhYkZvbGRlclBhZ2UuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLyoKLQkJICogQWRkIGEgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXIgdG8gYnJpbmcgdXAgYQotCQkgKiBkaWFsb2cgaWYgdGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBCcm93c2VyLgotCQkgKi8KLQkJdGFiRm9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKClbMF0uZ2V0VGV4dCgpLmVxdWFscyhnZXRUYWJUZXh0KCkpKSB7Ci0JCQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1dBUk5JTkcgfCBTV1QuT0spOwotCQkJCQlkaWFsb2cuc2V0TWVzc2FnZShDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQnJvd3Nlck5vdEZvdW5kIiwgbmV3IFN0cmluZyBbXSB7ZXJyb3JNZXNzYWdlfSkpOwotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250ZW50cyhJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRSZWFkZXIgYnI9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYj0gbmV3IFN0cmluZ0J1ZmZlcigzMDApOwotCQl0cnkgewotCQkJaW50IHJlYWQ9IDA7Ci0JCQl3aGlsZSAoKHJlYWQ9IGJyLnJlYWQoKSkgIT0gLTEpCi0JCQkJc2IuYXBwZW5kKChjaGFyKSByZWFkKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWJyLmNsb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjdXN0b20gZXZlbnQgbmFtZXMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGN1c3RvbSBldmVudCBuYW1lcwotCSAqLwotCVN0cmluZyBbXSBnZXRDdXN0b21FdmVudE5hbWVzICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyJDbG9zZVdpbmRvd0xpc3RlbmVyIiwgIkxvY2F0aW9uTGlzdGVuZXIiLCAiT3BlbldpbmRvd0xpc3RlbmVyIiwKLQkJCQkiUHJvZ3Jlc3NMaXN0ZW5lciIsICJTdGF0dXNUZXh0TGlzdGVuZXIiLCAiVGl0bGVMaXN0ZW5lciIsICJWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIifTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlpZiAoYnJvd3NlciAhPSBudWxsKSByZXR1cm4gbmV3IFdpZGdldCBbXSB7YnJvd3Nlcn07Ci0JCXJldHVybiBzdXBlci5nZXRFeGFtcGxlV2lkZ2V0cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVGV4dCIsICJVcmwiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJCcm93c2VyIjsKLQl9Ci0JCi0JLyoqCi0JICogSG9va3MgdGhlIGN1c3RvbSBsaXN0ZW5lciBzcGVjaWZpZWQgYnkgZXZlbnROYW1lLgotCSAqLwotCXZvaWQgaG9va0N1c3RvbUxpc3RlbmVyIChmaW5hbCBTdHJpbmcgZXZlbnROYW1lKSB7Ci0JCWlmIChicm93c2VyID09IG51bGwpIHJldHVybjsKLQkJaWYgKGV2ZW50TmFtZSA9PSAiQ2xvc2VXaW5kb3dMaXN0ZW5lciIpIHsKLQkJCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lciAobmV3IENsb3NlV2luZG93TGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiTG9jYXRpb25MaXN0ZW5lciIpIHsKLQkJCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lciAobmV3IExvY2F0aW9uTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIuY2hhbmdlZCIsIGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIuY2hhbmdpbmciLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiT3BlbldpbmRvd0xpc3RlbmVyIikgewotCQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIgKG5ldyBPcGVuV2luZG93TGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoZXZlbnROYW1lID09ICJQcm9ncmVzc0xpc3RlbmVyIikgewotCQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyIChuZXcgUHJvZ3Jlc3NMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lICsgIi5jaGFuZ2VkIiwgZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIuY29tcGxldGVkIiwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChldmVudE5hbWUgPT0gIlN0YXR1c1RleHRMaXN0ZW5lciIpIHsKLQkJCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyIChuZXcgU3RhdHVzVGV4dExpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChldmVudE5hbWUgPT0gIlRpdGxlTGlzdGVuZXIiKSB7Ci0JCQlicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIgKG5ldyBUaXRsZUxpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoZXZlbnROYW1lID09ICJWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKSB7Ci0JCQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lciAobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIuaGlkZSIsIGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIuc2hvdyIsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCWJvb2xlYW4gcnRsU3VwcG9ydCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCW1vemlsbGFCdXR0b24uc2V0U2VsZWN0aW9uIChicm93c2VyID09IG51bGwgPyBmYWxzZSA6IChicm93c2VyLmdldFN0eWxlICgpICYgU1dULk1PWklMTEEpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoYnJvd3Nlci5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0J1dHRvblRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQnV0dG9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkYWJhYTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQnV0dG9uVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIDxjb2RlPkJ1dHRvblRhYjwvY29kZT4gaXMgdGhlIGNsYXNzIHRoYXQKLSAqIGRlbW9uc3RyYXRlcyBTV1QgYnV0dG9ucy4KLSAqLwotY2xhc3MgQnV0dG9uVGFiIGV4dGVuZHMgQWxpZ25hYmxlVGFiIHsKLQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQnV0dG9uIGJ1dHRvbjEsIGJ1dHRvbjIsIGJ1dHRvbjMsIGJ1dHRvbjQsIGJ1dHRvbjUsIGJ1dHRvbjYsIGJ1dHRvbjcsIGJ1dHRvbjgsIGJ1dHRvbjk7Ci0JR3JvdXAgdGV4dEJ1dHRvbkdyb3VwLCBpbWFnZUJ1dHRvbkdyb3VwLCBpbWFnZXRleHRCdXR0b25Hcm91cDsKLQotCS8qIEFsaWdubWVudCB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQlCdXR0b24gdXBCdXR0b24sIGRvd25CdXR0b247Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHB1c2hCdXR0b24sIGNoZWNrQnV0dG9uLCByYWRpb0J1dHRvbiwgdG9nZ2xlQnV0dG9uLCBhcnJvd0J1dHRvbiwgZmxhdEJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQnV0dG9uVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb250cm9scyAqLwotCQl1cEJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQl1cEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVXAiKSk7Ci0JCWRvd25CdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJZG93bkJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRG93biIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCEoKEJ1dHRvbikgZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkgcmV0dXJuOwotCQkJCXNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCk7Ci0JCQl9Ci0JCX07Ci0JCXVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0ZXh0IGJ1dHRvbnMgKi8KLQkJdGV4dEJ1dHRvbkdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJdGV4dEJ1dHRvbkdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJdGV4dEJ1dHRvbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRleHRCdXR0b25Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGV4dF9CdXR0b25zIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIGJ1dHRvbnMgKi8KLQkJaW1hZ2VCdXR0b25Hcm91cCA9IG5ldyBHcm91cChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWltYWdlQnV0dG9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlpbWFnZUJ1dHRvbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlQnV0dG9uR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlX0J1dHRvbnMiKSk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSBhbmQgdGV4dCBidXR0b25zICovCi0JCWltYWdldGV4dEJ1dHRvbkdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW1hZ2V0ZXh0QnV0dG9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlpbWFnZXRleHRCdXR0b25Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpbWFnZXRleHRCdXR0b25Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VfVGV4dF9CdXR0b25zIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAocHVzaEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlBVU0g7Ci0JCWlmIChjaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkNIRUNLOwotCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5SQURJTzsKLQkJaWYgKHRvZ2dsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlRPR0dMRTsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5GTEFUOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlJJR0hUOwotCQlpZiAoYXJyb3dCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXN0eWxlIHw9IFNXVC5BUlJPVzsgCi0JCQlpZiAodXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5VUDsKLQkJCWlmIChkb3duQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRE9XTjsKLQkJfSBlbHNlIHsKLQkJCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5DRU5URVI7CQkJCi0JCX0KLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJYnV0dG9uMSA9IG5ldyBCdXR0b24odGV4dEJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjEuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT25lIikpOwotCQlidXR0b24yID0gbmV3IEJ1dHRvbih0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uMi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUd28iKSk7Ci0JCWJ1dHRvbjMgPSBuZXcgQnV0dG9uKHRleHRCdXR0b25Hcm91cCwgc3R5bGUpOwotCQlidXR0b24zLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRocmVlIikpOwotCQlidXR0b240ID0gbmV3IEJ1dHRvbihpbWFnZUJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjQuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWJ1dHRvbjUgPSBuZXcgQnV0dG9uKGltYWdlQnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uNS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWJ1dHRvbjYgPSBuZXcgQnV0dG9uKGltYWdlQnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uNi5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJYnV0dG9uNyA9IG5ldyBCdXR0b24oaW1hZ2V0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uNy5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPbmUiKSk7Ci0JCWJ1dHRvbjcuc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWJ1dHRvbjggPSBuZXcgQnV0dG9uKGltYWdldGV4dEJ1dHRvbkdyb3VwLCBzdHlsZSk7Ci0JCWJ1dHRvbjguc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHdvIikpOwotCQlidXR0b244LnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJYnV0dG9uOSA9IG5ldyBCdXR0b24oaW1hZ2V0ZXh0QnV0dG9uR3JvdXAsIHN0eWxlKTsKLQkJYnV0dG9uOS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaHJlZSIpKTsKLQkJYnV0dG9uOS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlwdXNoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJcHVzaEJ1dHRvbi5zZXRUZXh0KCJTV1QuUFVTSCIpOwotCQljaGVja0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNoZWNrQnV0dG9uLnNldFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0ICgiU1dULlJBRElPIik7Ci0JCXRvZ2dsZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvZ2dsZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlRPR0dMRSIpOwotCQlhcnJvd0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFycm93QnV0dG9uLnNldFRleHQgKCJTV1QuQVJST1ciKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtidXR0b24xLCBidXR0b24yLCBidXR0b24zLCBidXR0b240LCBidXR0b241LCBidXR0b242LCBidXR0b243LCBidXR0b244LCBidXR0b245fTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTZWxlY3Rpb24iLCAiVGV4dCIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkJ1dHRvbiI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGFsaWdubWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0QWxpZ25tZW50ICgpIHsKLQkJaW50IGFsaWdubWVudCA9IDA7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuUklHSFQ7Ci0JCWlmICh1cEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5VUDsKLQkJaWYgKGRvd25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuRE9XTjsKLQkJYnV0dG9uMS5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjIuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b24zLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uNC5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjUuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b242LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJYnV0dG9uNy5zZXRBbGlnbm1lbnQgKGFsaWdubWVudCk7Ci0JCWJ1dHRvbjguc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlidXR0b245LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlpZiAoYXJyb3dCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQl1cEJ1dHRvbi5zZXRFbmFibGVkICh0cnVlKTsKLQkJCWNlbnRlckJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCQlkb3duQnV0dG9uLnNldEVuYWJsZWQgKHRydWUpOwotCQl9IGVsc2UgewotCQkJdXBCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQkJY2VudGVyQnV0dG9uLnNldEVuYWJsZWQgKHRydWUpOwotCQkJZG93bkJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCX0KLQkJdXBCdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5VUCkgIT0gMCk7Ci0JCWRvd25CdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5ET1dOKSAhPSAwKTsKLQkJcHVzaEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULlBVU0gpICE9IDApOwotCQljaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkNIRUNLKSAhPSAwKTsKLQkJcmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uICgoYnV0dG9uMS5nZXRTdHlsZSAoKSAmIFNXVC5SQURJTykgIT0gMCk7Ci0JCXRvZ2dsZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULlRPR0dMRSkgIT0gMCk7Ci0JCWFycm93QnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuQVJST1cpICE9IDApOwotCQlmbGF0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGJ1dHRvbjEuZ2V0U3R5bGUgKCkgJiBTV1QuRkxBVCkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChidXR0b24xLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0NvbWJvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DQ29tYm9UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiYmJmOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DQ29tYm9UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIENDb21ib1RhYiBleHRlbmRzIFRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUNDb21ibyBjb21ibzE7Ci0JR3JvdXAgY29tYm9Hcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGZsYXRCdXR0b24sIHJlYWRPbmx5QnV0dG9uOwotCQotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8wIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzEiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMiIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8zIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzQiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNSIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV82IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzciKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfOCIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlDQ29tYm9UYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGNvbWJvIGJveCAqLwotCQljb21ib0dyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY29tYm9Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJY29tYm9Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQljb21ib0dyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXN0b21fQ29tYm8iKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoZmxhdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5GTEFUOwotCQlpZiAocmVhZE9ubHlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUkVBRF9PTkxZOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWNvbWJvMSA9IG5ldyBDQ29tYm8gKGNvbWJvR3JvdXAsIHN0eWxlKTsKLQkJY29tYm8xLnNldEl0ZW1zIChMaXN0RGF0YSk7Ci0JCWlmIChMaXN0RGF0YS5sZW5ndGggPj0gMykgewotCQkJY29tYm8xLnNldFRleHQoTGlzdERhdGEgWzJdKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlyZWFkT25seUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVBRF9PTkxZIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCQlmbGF0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmxhdEJ1dHRvbi5zZXRUZXh0ICgiU1dULkZMQVQiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7Y29tYm8xfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJFZGl0YWJsZSIsICJJdGVtcyIsICJTZWxlY3Rpb24iLCAiVGV4dCIsICJUZXh0TGltaXQiLCAiVG9vbFRpcFRleHQiLCAiVmlzaWJsZUl0ZW1Db3VudCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNDb21ibyI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJZmxhdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuRkxBVCkgIT0gMCk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoY29tYm8xLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ0xhYmVsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DTGFiZWxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE2OGM1OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DTGFiZWxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIENMYWJlbFRhYiBleHRlbmRzIEFsaWduYWJsZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlDTGFiZWwgbGFiZWwxLCBsYWJlbDIsIGxhYmVsMzsKLQlHcm91cCB0ZXh0TGFiZWxHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gc2hhZG93SW5CdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgc2hhZG93Tm9uZUJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ0xhYmVsVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB0ZXh0IGxhYmVscyAqLwotCQl0ZXh0TGFiZWxHcm91cCA9IG5ldyBHcm91cChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCXRleHRMYWJlbEdyb3VwLnNldExheW91dCAoZ3JpZExheW91dCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXRleHRMYWJlbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRleHRMYWJlbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXN0b21fTGFiZWxzIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNoYWRvd0luQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19JTjsKLQkJaWYgKHNoYWRvd05vbmVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX05PTkU7Ci0JCWlmIChzaGFkb3dPdXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX09VVDsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5SSUdIVDsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJbGFiZWwxID0gbmV3IENMYWJlbCAodGV4dExhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWwxLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZSIpKTsKLQkJbGFiZWwxLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJbGFiZWwyID0gbmV3IENMYWJlbCAodGV4dExhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWwyLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJbGFiZWwzID0gbmV3IENMYWJlbCAodGV4dExhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWwzLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikgKyAiXG4iICsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZV9Ud29fVGhyZWUiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXNoYWRvd05vbmVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dOb25lQnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX05PTkUiKTsKLQkJc2hhZG93SW5CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19JTiIpOwotCQlzaGFkb3dPdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfT1VUIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2xhYmVsMSwgbGFiZWwyLCBsYWJlbDN9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRleHQiLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJDTGFiZWwiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEFsaWdubWVudCAoKSB7Ci0JCWludCBhbGlnbm1lbnQgPSAwOwotCQlpZiAobGVmdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5MRUZUOwotCQlpZiAoY2VudGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgYWxpZ25tZW50ID0gU1dULlJJR0hUOwotCQlsYWJlbDEuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlsYWJlbDIuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCQlsYWJlbDMuc2V0QWxpZ25tZW50IChhbGlnbm1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWxlZnRCdXR0b24uc2V0U2VsZWN0aW9uICgobGFiZWwxLmdldFN0eWxlICgpICYgU1dULkxFRlQpICE9IDApOwotCQljZW50ZXJCdXR0b24uc2V0U2VsZWN0aW9uICgobGFiZWwxLmdldFN0eWxlICgpICYgU1dULkNFTlRFUikgIT0gMCk7Ci0JCXJpZ2h0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5SSUdIVCkgIT0gMCk7Ci0JCXNoYWRvd0luQnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfSU4pICE9IDApOwotCQlzaGFkb3dPdXRCdXR0b24uc2V0U2VsZWN0aW9uICgobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19PVVQpICE9IDApOwotCQlzaGFkb3dOb25lQnV0dG9uLnNldFNlbGVjdGlvbiAoKGxhYmVsMS5nZXRTdHlsZSAoKSAmIChTV1QuU0hBRE9XX0lOIHwgU1dULlNIQURPV19PVVQpKSA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DVGFiRm9sZGVyVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DVGFiRm9sZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNjExMjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ1RhYkZvbGRlclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIENUYWJGb2xkZXJUYWIgZXh0ZW5kcyBUYWIgewotCWludCBsYXN0U2VsZWN0ZWRUYWIgPSAwOwotCQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JQ1RhYkZvbGRlciB0YWJGb2xkZXIxOwotCUdyb3VwIHRhYkZvbGRlckdyb3VwLCBpdGVtR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiB0b3BCdXR0b24sIGJvdHRvbUJ1dHRvbiwgZmxhdEJ1dHRvbiwgY2xvc2VCdXR0b247Ci0KLQlzdGF0aWMgU3RyaW5nIFtdIENUYWJJdGVtczEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNUYWJJdGVtMV8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNUYWJJdGVtMV8xIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNUYWJJdGVtMV8yIil9OwotCi0JLyogQ29udHJvbHMgYW5kIHJlc291cmNlcyBhZGRlZCB0byB0aGUgIkZvbnRzIiBncm91cCAqLwotCXN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OX0ZPUkVHUk9VTkRfQ09MT1IgPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OX0JBQ0tHUk9VTkRfQ09MT1IgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgSVRFTV9GT05UID0gNTsKLQlDb2xvciBzZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IsIHNlbGVjdGlvbkJhY2tncm91bmRDb2xvcjsKLQlGb250IGl0ZW1Gb250OwotCQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gc2ltcGxlVGFiQnV0dG9uLCBzaW5nbGVUYWJCdXR0b24sIGltYWdlQnV0dG9uLCBzaG93TWluQnV0dG9uLCBzaG93TWF4QnV0dG9uLCB1bnNlbGVjdGVkQ2xvc2VCdXR0b24sIHVuc2VsZWN0ZWRJbWFnZUJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlDVGFiRm9sZGVyVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbG9ycyBhbmQgRm9udHMiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQ29sb3JBbmRGb250R3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVDb2xvckFuZEZvbnRHcm91cCgpOwotCQkKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdGlvbl9Gb3JlZ3JvdW5kX0NvbG9yIikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTZWxlY3Rpb25fQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbV9Gb250IikpOwotCi0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHNlbGVjdGlvbkJhY2tncm91bmRDb2xvciAhPSBudWxsKSBzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChzZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoaXRlbUZvbnQgIT0gbnVsbCkgaXRlbUZvbnQuZGlzcG9zZSgpOwotCQkJCXNlbGVjdGlvbkJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yID0gbnVsbDsJCQkKLQkJCQlpdGVtRm9udCA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgY2hhbmdlRm9udE9yQ29sb3IoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgU0VMRUNUSU9OX0ZPUkVHUk9VTkRfQ09MT1I6IHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IHNlbGVjdGlvbkZvcmVncm91bmRDb2xvcjsKLQkJCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0YWJGb2xkZXIxLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBzZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yIChkaXNwbGF5LCByZ2IpOwotCQkJCXNldFNlbGVjdGlvbkZvcmVncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCWNhc2UgU0VMRUNUSU9OX0JBQ0tHUk9VTkRfQ09MT1I6IHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IHNlbGVjdGlvbkJhY2tncm91bmRDb2xvcjsKLQkJCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0YWJGb2xkZXIxLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7Ci0JCQkJc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yIChkaXNwbGF5LCByZ2IpOwotCQkJCXNldFNlbGVjdGlvbkJhY2tncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCWNhc2UgSVRFTV9GT05UOiB7Ci0JCQkJRm9udCBvbGRGb250ID0gaXRlbUZvbnQ7Ci0JCQkJaWYgKG9sZEZvbnQgPT0gbnVsbCkgb2xkRm9udCA9IHRhYkZvbGRlcjEuZ2V0SXRlbSAoMCkuZ2V0Rm9udCAoKTsKLQkJCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4gKCk7Ci0JCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRGb250ID0gaXRlbUZvbnQ7Ci0JCQkJaXRlbUZvbnQgPSBuZXcgRm9udCAoZGlzcGxheSwgZm9udERhdGEpOwotCQkJCXNldEl0ZW1Gb250ICgpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSAoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdXBlci5jaGFuZ2VGb250T3JDb2xvcihpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQlzaW1wbGVUYWJCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaW1wbGVUYWJCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9TaW1wbGVfVGFicyIpKTsKLQkJc2ltcGxlVGFiQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJc2ltcGxlVGFiQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRTaW1wbGVUYWJzKCk7Ci0JCQl9Ci0JCX0pOwotCQkJCQotCQlzaW5nbGVUYWJCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaW5nbGVUYWJCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9TaW5nbGVfVGFicyIpKTsKLQkJc2luZ2xlVGFiQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXNpbmdsZVRhYkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0U2luZ2xlVGFicygpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNob3dNaW5CdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaG93TWluQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfTWluX1Zpc2libGUiKSk7Ci0JCXNob3dNaW5CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc2hvd01pbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0TWluaW1pemVWaXNpYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hvd01heEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNob3dNYXhCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9NYXhfVmlzaWJsZSIpKTsKLQkJc2hvd01heEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlzaG93TWF4QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRNYXhpbWl6ZVZpc2libGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWltYWdlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfSW1hZ2UiKSk7Ci0JCWltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRJbWFnZXMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl1bnNlbGVjdGVkSW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQl1bnNlbGVjdGVkSW1hZ2VCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNldF9VbnNlbGVjdGVkX0ltYWdlX1Zpc2libGUiKSk7Ci0JCXVuc2VsZWN0ZWRJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXVuc2VsZWN0ZWRJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0VW5zZWxlY3RlZEltYWdlVmlzaWJsZSgpOwotCQkJfQotCQl9KTsKLQkJdW5zZWxlY3RlZENsb3NlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJdW5zZWxlY3RlZENsb3NlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTZXRfVW5zZWxlY3RlZF9DbG9zZV9WaXNpYmxlIikpOwotCQl1bnNlbGVjdGVkQ2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl1bnNlbGVjdGVkQ2xvc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFVuc2VsZWN0ZWRDbG9zZVZpc2libGUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBDVGFiRm9sZGVyICovCi0JCXRhYkZvbGRlckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldFRleHQgKCJDVGFiRm9sZGVyIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAodG9wQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlRPUDsKLQkJaWYgKGJvdHRvbUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1RUT007Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoZmxhdEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5GTEFUOwotCQlpZiAoY2xvc2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0xPU0U7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJdGFiRm9sZGVyMSA9IG5ldyBDVGFiRm9sZGVyICh0YWJGb2xkZXJHcm91cCwgc3R5bGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IENUYWJJdGVtczEubGVuZ3RoOyBpKyspIHsKLQkJCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyMSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KENUYWJJdGVtczFbaV0pOwotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQodGFiRm9sZGVyMSwgU1dULlJFQURfT05MWSk7Ci0JCQl0ZXh0LnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNUYWJJdGVtX2NvbnRlbnQiKSArICI6ICIgKyBpKTsKLQkJCWl0ZW0uc2V0Q29udHJvbCh0ZXh0KTsKLQkJfQotCQl0YWJGb2xkZXIxLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJbGFzdFNlbGVjdGVkVGFiID0gdGFiRm9sZGVyMS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJfQotCQl9KTsKLQkJdGFiRm9sZGVyMS5zZXRTZWxlY3Rpb24obGFzdFNlbGVjdGVkVGFiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJdG9wQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdG9wQnV0dG9uLnNldFRleHQgKCJTV1QuVE9QIik7Ci0JCXRvcEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJvdHRvbUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWJvdHRvbUJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPVFRPTSIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JCWNsb3NlQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJY2xvc2VCdXR0b24uc2V0VGV4dCAoIlNXVC5DTE9TRSIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIGN1c3RvbSBldmVudCBuYW1lcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgY3VzdG9tIGV2ZW50IG5hbWVzCi0JICovCi0JU3RyaW5nIFtdIGdldEN1c3RvbUV2ZW50TmFtZXMgKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IkNUYWJGb2xkZXJFdmVudCJ9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJcmV0dXJuIHRhYkZvbGRlcjEuZ2V0SXRlbXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7dGFiRm9sZGVyMX07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNUYWJGb2xkZXIiOwotCX0KLQotCS8qKgotCSAqIEhvb2tzIHRoZSBjdXN0b20gbGlzdGVuZXIgc3BlY2lmaWVkIGJ5IGV2ZW50TmFtZS4KLQkgKi8KLQl2b2lkIGhvb2tDdXN0b21MaXN0ZW5lciAoZmluYWwgU3RyaW5nIGV2ZW50TmFtZSkgewotCQlpZiAoZXZlbnROYW1lID09ICJDVGFiRm9sZGVyRXZlbnQiKSB7Ci0JCQl0YWJGb2xkZXIxLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIgKG5ldyBDVGFiRm9sZGVyMkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGNsb3NlIChDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBmb250Ci0JICogb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzIHRvIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MuCi0JICogQWxzbyBzZXRzIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIE5vZGUgMQotCSAqIFRyZWVJdGVtcyB0byBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXZvaWQgcmVzZXRDb2xvcnNBbmRGb250cyAoKSB7Ci0JCXN1cGVyLnJlc2V0Q29sb3JzQW5kRm9udHMgKCk7Ci0JCUNvbG9yIG9sZENvbG9yID0gc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yOwotCQlzZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IHNlbGVjdGlvbkJhY2tncm91bmRDb2xvcjsKLQkJc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0U2VsZWN0aW9uQmFja2dyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJRm9udCBvbGRGb250ID0gaXRlbUZvbnQ7Ci0JCWl0ZW1Gb250ID0gbnVsbDsKLQkJc2V0SXRlbUZvbnQgKCk7Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUoKTsKLQkJc2V0U2ltcGxlVGFicygpOwotCQlzZXRTaW5nbGVUYWJzKCk7Ci0JCXNldEltYWdlcygpOwotCQlzZXRNaW5pbWl6ZVZpc2libGUoKTsKLQkJc2V0TWF4aW1pemVWaXNpYmxlKCk7Ci0JCXNldFVuc2VsZWN0ZWRDbG9zZVZpc2libGUoKTsKLQkJc2V0VW5zZWxlY3RlZEltYWdlVmlzaWJsZSgpOwotCQlzZXRTZWxlY3Rpb25CYWNrZ3JvdW5kICgpOwotCQlzZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kICgpOwotCQlzZXRJdGVtRm9udCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2hhcGUgdGhhdCB0aGUgQ1RhYkZvbGRlciB3aWxsIHVzZSB0byByZW5kZXIgaXRzZWxmLiAKLQkgKi8KLQl2b2lkIHNldFNpbXBsZVRhYnMgKCkgewotCQl0YWJGb2xkZXIxLnNldFNpbXBsZSAoc2ltcGxlVGFiQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiB0YWJzIHRoYXQgdGhlIENUYWJGb2xkZXIgc2hvdWxkIGRpc3BsYXkuCi0JICovCi0Jdm9pZCBzZXRTaW5nbGVUYWJzICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRTaW5nbGUgKHNpbmdsZVRhYkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIGFuIGltYWdlIGludG8gZWFjaCBpdGVtIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEltYWdlcyAoKSB7Ci0JCWJvb2xlYW4gc2V0SW1hZ2UgPSBpbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCUNUYWJJdGVtIGl0ZW1zW10gPSB0YWJGb2xkZXIxLmdldEl0ZW1zICgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2V0SW1hZ2UpIHsKLQkJCQlpdGVtc1tpXS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCQl9IGVsc2UgewotCQkJCWl0ZW1zW2ldLnNldEltYWdlIChudWxsKTsKLQkJCX0KLQkJfQotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgbWluaW1pemUgYnV0dG9uCi0JICovCi0Jdm9pZCBzZXRNaW5pbWl6ZVZpc2libGUgKCkgewotCQl0YWJGb2xkZXIxLnNldE1pbmltaXplVmlzaWJsZShzaG93TWluQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIG1heGltaXplIGJ1dHRvbgotCSAqLwotCXZvaWQgc2V0TWF4aW1pemVWaXNpYmxlICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRNYXhpbWl6ZVZpc2libGUoc2hvd01heEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjbG9zZSBidXR0b24gb24gdW5zZWxlY3RlZCB0YWJzCi0JICovCi0Jdm9pZCBzZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlICgpIHsKLQkJdGFiRm9sZGVyMS5zZXRVbnNlbGVjdGVkQ2xvc2VWaXNpYmxlKHVuc2VsZWN0ZWRDbG9zZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBpbWFnZSBvbiB1bnNlbGVjdGVkIHRhYnMKLQkgKi8KLQl2b2lkIHNldFVuc2VsZWN0ZWRJbWFnZVZpc2libGUgKCkgewotCQl0YWJGb2xkZXIxLnNldFVuc2VsZWN0ZWRJbWFnZVZpc2libGUodW5zZWxlY3RlZEltYWdlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgQ1RhYkl0ZW0gMC4KLQkgKi8KLQl2b2lkIHNldFNlbGVjdGlvbkJhY2tncm91bmQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRhYkZvbGRlcjEuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChzZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8vIFNldCB0aGUgc2VsZWN0aW9uIGJhY2tncm91bmQgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3Rpb24uCi0JCUNvbG9yIGNvbG9yID0gc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJGb2xkZXIxLmdldFNlbGVjdGlvbkJhY2tncm91bmQgKCk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShTRUxFQ1RJT05fQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgQ1RhYkl0ZW0gMC4KLQkgKi8KLQl2b2lkIHNldFNlbGVjdGlvbkZvcmVncm91bmQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRhYkZvbGRlcjEuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChzZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8vIFNldCB0aGUgc2VsZWN0aW9uIGZvcmVncm91bmQgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3Rpb24uCi0JCUNvbG9yIGNvbG9yID0gc2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJGb2xkZXIxLmdldFNlbGVjdGlvbkZvcmVncm91bmQgKCk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShTRUxFQ1RJT05fRk9SRUdST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgQ1RhYkl0ZW0gMC4KLQkgKi8KLQl2b2lkIHNldEl0ZW1Gb250ICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJGb2xkZXIxLmdldEl0ZW0gKDApLnNldEZvbnQgKGl0ZW1Gb250KTsKLQkJCXNldEV4YW1wbGVXaWRnZXRTaXplKCk7Ci0JCX0KLQkJLyogU2V0IHRoZSBmb250IGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgZm9udCBvZiB0aGUgaXRlbS4gKi8KLQkJRm9udCBmdCA9IGl0ZW1Gb250OwotCQlpZiAoZnQgPT0gbnVsbCkgZnQgPSB0YWJGb2xkZXIxLmdldEl0ZW0gKDApLmdldEZvbnQgKCk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShJVEVNX0ZPTlQpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoZm9udEltYWdlKGZ0KSk7Ci0JCWl0ZW0uc2V0Rm9udChmdCk7Ci0JCWNvbG9yQW5kRm9udFRhYmxlLmxheW91dCAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9DYW52YXNUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NhbnZhc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWJmYzBkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NhbnZhc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgQ2FudmFzVGFiIGV4dGVuZHMgVGFiIHsKLQlzdGF0aWMgZmluYWwgaW50IGNvbG9ycyBbXSA9IHsKLQkJU1dULkNPTE9SX1JFRCwKLQkJU1dULkNPTE9SX0dSRUVOLAotCQlTV1QuQ09MT1JfQkxVRSwKLQkJU1dULkNPTE9SX01BR0VOVEEsCi0JCVNXVC5DT0xPUl9ZRUxMT1csCi0JCVNXVC5DT0xPUl9DWUFOLAotCQlTV1QuQ09MT1JfREFSS19SRUQsCi0JCVNXVC5DT0xPUl9EQVJLX0dSRUVOLAotCQlTV1QuQ09MT1JfREFSS19CTFVFLAotCQlTV1QuQ09MT1JfREFSS19NQUdFTlRBLAotCQlTV1QuQ09MT1JfREFSS19ZRUxMT1csCi0JCVNXVC5DT0xPUl9EQVJLX0NZQU4KLQl9OwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgY2FudmFzU3RyaW5nID0gIkNhbnZhcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUNhbnZhcyBjYW52YXM7Ci0JR3JvdXAgY2FudmFzR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uLCBub0JhY2tncm91bmRCdXR0b24sIG5vRm9jdXNCdXR0b24sIAotCW5vTWVyZ2VQYWludHNCdXR0b24sIG5vUmVkcmF3UmVzaXplQnV0dG9uLCBkb3VibGVCdWZmZXJlZEJ1dHRvbjsKLQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gY2FyZXRCdXR0b24sIGZpbGxEYW1hZ2VCdXR0b247Ci0KLQlpbnQgcGFpbnRDb3VudDsKLQlpbnQgY3gsIGN5OwotCWludCBtYXhYLCBtYXhZOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlDYW52YXNUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIGRpc3BsYXkgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCWNhcmV0QnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJY2FyZXRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNhcmV0IikpOwotCQlmaWxsRGFtYWdlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJZmlsbERhbWFnZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsbERhbWFnZSIpKTsKLQkJCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQljYXJldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2FyZXQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGNhbnZhcyB3aWRnZXQgKi8KLQkJY2FudmFzR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQljYW52YXNHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJY2FudmFzR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJY2FudmFzR3JvdXAuc2V0VGV4dCAoIkNhbnZhcyIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChub0JhY2tncm91bmRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTk9fQkFDS0dST1VORDsKLQkJaWYgKG5vRm9jdXNCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTk9fRk9DVVM7Ci0JCWlmIChub01lcmdlUGFpbnRzQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk5PX01FUkdFX1BBSU5UUzsKLQkJaWYgKG5vUmVkcmF3UmVzaXplQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk5PX1JFRFJBV19SRVNJWkU7Ci0JCWlmIChkb3VibGVCdWZmZXJlZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5ET1VCTEVfQlVGRkVSRUQ7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJcGFpbnRDb3VudCA9IDA7IGN4ID0gMDsgY3kgPSAwOwotCQljYW52YXMgPSBuZXcgQ2FudmFzIChjYW52YXNHcm91cCwgc3R5bGUpOwotCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJcGFpbnRDb3VudCsrOwotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQlpZiAoZmlsbERhbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJQ29sb3IgY29sb3IgPSBlLmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKGNvbG9ycyBbcGFpbnRDb3VudCAlIGNvbG9ycy5sZW5ndGhdKTsKLQkJCQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCQkJCWdjLmZpbGxSZWN0YW5nbGUoZS54LCBlLnksIGUud2lkdGgsIGUuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJUG9pbnQgc2l6ZSA9IGNhbnZhcy5nZXRTaXplICgpOwotCQkJCWdjLmRyYXdBcmMoY3ggKyAxLCBjeSArIDEsIHNpemUueCAtIDIsIHNpemUueSAtIDIsIDAsIDM2MCk7Ci0JCQkJZ2MuZHJhd1JlY3RhbmdsZShjeCArIChzaXplLnggLSAxMCkgLyAyLCBjeSArIChzaXplLnkgLSAxMCkgLyAyLCAxMCwgMTApOwotCQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQoY2FudmFzU3RyaW5nKTsKLQkJCQlnYy5kcmF3U3RyaW5nKGNhbnZhc1N0cmluZywgY3ggKyAoc2l6ZS54IC0gZXh0ZW50LngpIC8gMiwgY3kgLSBleHRlbnQueSArIChzaXplLnkgLSAxMCkgLyAyLCB0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWNhbnZhcy5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJUG9pbnQgc2l6ZSA9IGNhbnZhcy5nZXRTaXplICgpOwotCQkJCW1heFggPSBzaXplLnggKiAzIC8gMjsgbWF4WSA9IHNpemUueSAqIDMgLyAyOwotCQkJCXJlc2l6ZVNjcm9sbEJhcnMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlTY3JvbGxCYXIgYmFyID0gY2FudmFzLmdldEhvcml6b250YWxCYXIoKTsKLQkJaWYgKGJhciAhPSBudWxsKSB7Ci0JCQlob29rTGlzdGVuZXJzIChiYXIpOwotCQkJYmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNjcm9sbEhvcml6b250YWwgKChTY3JvbGxCYXIpZXZlbnQud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQliYXIgPSBjYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKGJhciAhPSBudWxsKSB7Ci0JCQlob29rTGlzdGVuZXJzIChiYXIpOwotCQkJYmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNjcm9sbFZlcnRpY2FsICgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSF9TQ1JPTEwiKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WX1NDUk9MTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJPUkRFUiIpOwotCQlub0JhY2tncm91bmRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub0JhY2tncm91bmRCdXR0b24uc2V0VGV4dCAoIlNXVC5OT19CQUNLR1JPVU5EIik7Ci0JCW5vRm9jdXNCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub0ZvY3VzQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fRk9DVVMiKTsKLQkJbm9NZXJnZVBhaW50c0J1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW5vTWVyZ2VQYWludHNCdXR0b24uc2V0VGV4dCAoIlNXVC5OT19NRVJHRV9QQUlOVFMiKTsKLQkJbm9SZWRyYXdSZXNpemVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub1JlZHJhd1Jlc2l6ZUJ1dHRvbi5zZXRUZXh0ICgiU1dULk5PX1JFRFJBV19SRVNJWkUiKTsKLQkJZG91YmxlQnVmZmVyZWRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlkb3VibGVCdWZmZXJlZEJ1dHRvbi5zZXRUZXh0ICgiU1dULkRPVUJMRV9CVUZGRVJFRCIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBmb2xkZXIgcGFnZS4KLQkgKgotCSAqIEBwYXJhbSB0YWJGb2xkZXIgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyCi0JICogQHJldHVybiB0aGUgbmV3IHBhZ2UgZm9yIHRoZSB0YWIgZm9sZGVyCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UgKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJc3VwZXIuY3JlYXRlVGFiRm9sZGVyUGFnZSAodGFiRm9sZGVyKTsKLQotCQkvKgotCQkgKiBBZGQgYSByZXNpemUgbGlzdGVuZXIgdG8gdGhlIHRhYkZvbGRlclBhZ2Ugc28gdGhhdAotCQkgKiBpZiB0aGUgdXNlciB0eXBlcyBpbnRvIHRoZSBleGFtcGxlIHdpZGdldCB0byBjaGFuZ2UKLQkJICogaXRzIHByZWZlcnJlZCBzaXplLCBhbmQgdGhlbiByZXNpemVzIHRoZSBzaGVsbCwgd2UKLQkJICogcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplIGNvcnJlY3RseS4KLQkJICovCi0JCXRhYkZvbGRlclBhZ2UuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7Y2FudmFzfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNhbnZhcyI7Ci0JfQotCQotCS8qKgotCSAqIFJlc2l6ZXMgdGhlIG1heGltdW0gYW5kIHRodW1iIG9mIGJvdGggc2Nyb2xsYmFycy4KLQkgKi8KLQl2b2lkIHJlc2l6ZVNjcm9sbEJhcnMgKCkgewotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCVNjcm9sbEJhciBiYXIgPSBjYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlpZiAoYmFyICE9IG51bGwpIHsKLQkJCWJhci5zZXRNYXhpbXVtKG1heFgpOwotCQkJYmFyLnNldFRodW1iKGNsaWVudEFyZWEud2lkdGgpOwotCQkJYmFyLnNldFBhZ2VJbmNyZW1lbnQoY2xpZW50QXJlYS53aWR0aCk7Ci0JCX0KLQkJYmFyID0gY2FudmFzLmdldFZlcnRpY2FsQmFyKCk7Ci0JCWlmIChiYXIgIT0gbnVsbCkgewotCQkJYmFyLnNldE1heGltdW0obWF4WSk7Ci0JCQliYXIuc2V0VGh1bWIoY2xpZW50QXJlYS5oZWlnaHQpOwotCQkJYmFyLnNldFBhZ2VJbmNyZW1lbnQoY2xpZW50QXJlYS5oZWlnaHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2Nyb2xscyB0aGUgY2FudmFzIGhvcml6b250YWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gc2Nyb2xsQmFyCi0JICovCi0Jdm9pZCBzY3JvbGxIb3Jpem9udGFsIChTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgeCA9IC1zY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh4ICsgbWF4WCA8IGJvdW5kcy53aWR0aCkgewotCQkJeCA9IGJvdW5kcy53aWR0aCAtIG1heFg7Ci0JCX0KLQkJY2FudmFzLnNjcm9sbCh4LCBjeSwgY3gsIGN5LCBtYXhYLCBtYXhZLCBmYWxzZSk7Ci0JCWN4ID0geDsKLQl9Ci0KLQkvKioKLQkgKiBTY3JvbGxzIHRoZSBjYW52YXMgdmVydGljYWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gc2Nyb2xsQmFyCi0JICovCi0Jdm9pZCBzY3JvbGxWZXJ0aWNhbCAoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHkgPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoeSArIG1heFkgPCBib3VuZHMuaGVpZ2h0KSB7Ci0JCQl5ID0gYm91bmRzLmhlaWdodCAtIG1heFk7Ci0JCX0KLQkJY2FudmFzLnNjcm9sbChjeCwgeSwgY3gsIGN5LCBtYXhYLCBtYXhZLCBmYWxzZSk7Ci0JCWN5ID0geTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIG9yIGNsZWFycyB0aGUgY2FyZXQgaW4gdGhlICJFeGFtcGxlIiB3aWRnZXQuCi0JICovCi0Jdm9pZCBzZXRDYXJldCAoKSB7Ci0JCUNhcmV0IG9sZENhcmV0ID0gY2FudmFzLmdldENhcmV0ICgpOwotCQlpZiAoY2FyZXRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlDYXJldCBuZXdDYXJldCA9IG5ldyBDYXJldChjYW52YXMsIFNXVC5OT05FKTsKLQkJCUZvbnQgZm9udCA9IGNhbnZhcy5nZXRGb250KCk7Ci0JCQluZXdDYXJldC5zZXRGb250KGZvbnQpOwotCQkJR0MgZ2MgPSBuZXcgR0MoY2FudmFzKTsKLQkJCWdjLnNldEZvbnQoZm9udCk7Ci0JCQluZXdDYXJldC5zZXRCb3VuZHMoMSwgMSwgMSwgZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCQljYW52YXMuc2V0Q2FyZXQgKG5ld0NhcmV0KTsKLQkJCWNhbnZhcy5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJY2FudmFzLnNldENhcmV0IChudWxsKTsKLQkJfQotCQlpZiAob2xkQ2FyZXQgIT0gbnVsbCkgb2xkQ2FyZXQuZGlzcG9zZSAoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5IX1NDUk9MTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5WX1NDUk9MTCkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQkJbm9CYWNrZ3JvdW5kQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5OT19CQUNLR1JPVU5EKSAhPSAwKTsKLQkJbm9Gb2N1c0J1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuTk9fRk9DVVMpICE9IDApOwotCQlub01lcmdlUGFpbnRzQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5OT19NRVJHRV9QQUlOVFMpICE9IDApOwotCQlub1JlZHJhd1Jlc2l6ZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjYW52YXMuZ2V0U3R5bGUgKCkgJiBTV1QuTk9fUkVEUkFXX1JFU0laRSkgIT0gMCk7Ci0JCWRvdWJsZUJ1ZmZlcmVkQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNhbnZhcy5nZXRTdHlsZSAoKSAmIFNXVC5ET1VCTEVfQlVGRkVSRUQpICE9IDApOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHNldENhcmV0ICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbWJvVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db21ib1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Y2EzNzc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0NvbWJvVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBDb21ib1RhYiBleHRlbmRzIFRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUNvbWJvIGNvbWJvMTsKLQlHcm91cCBjb21ib0dyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gZHJvcERvd25CdXR0b24sIHJlYWRPbmx5QnV0dG9uLCBzaW1wbGVCdXR0b247Ci0JCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YSA9IHtDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzAiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMSIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8yIiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzMiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNCIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF81IiksCi0JCQkJCQkJCSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzYiKSwKLQkJCQkJCQkJIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNyIpLAotCQkJCQkJCQkgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF84Iil9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUNvbWJvVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjb21ibyBib3ggKi8KLQkJY29tYm9Hcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWNvbWJvR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJY29tYm9Hcm91cC5zZXRUZXh0ICgiQ29tYm8iKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChkcm9wRG93bkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5EUk9QX0RPV047Ci0JCWlmIChyZWFkT25seUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5SRUFEX09OTFk7Ci0JCWlmIChzaW1wbGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0lNUExFOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJY29tYm8xID0gbmV3IENvbWJvIChjb21ib0dyb3VwLCBzdHlsZSk7Ci0JCWNvbWJvMS5zZXRJdGVtcyAoTGlzdERhdGEpOwotCQlpZiAoTGlzdERhdGEubGVuZ3RoID49IDMpIHsKLQkJCWNvbWJvMS5zZXRUZXh0KExpc3REYXRhIFsyXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQlzdXBlci5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpOwotCi0JCS8qCi0JCSAqIEFkZCBhIHJlc2l6ZSBsaXN0ZW5lciB0byB0aGUgdGFiRm9sZGVyUGFnZSBzbyB0aGF0Ci0JCSAqIGlmIHRoZSB1c2VyIHR5cGVzIGludG8gdGhlIGV4YW1wbGUgd2lkZ2V0IHRvIGNoYW5nZQotCQkgKiBpdHMgcHJlZmVycmVkIHNpemUsIGFuZCB0aGVuIHJlc2l6ZXMgdGhlIHNoZWxsLCB3ZQotCQkgKiByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUgY29ycmVjdGx5LgotCQkgKi8KLQkJdGFiRm9sZGVyUGFnZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlkcm9wRG93bkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JCXNpbXBsZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNpbXBsZUJ1dHRvbi5zZXRUZXh0KCJTV1QuU0lNUExFIik7Ci0JCXJlYWRPbmx5QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0VGV4dCAoIlNXVC5SRUFEX09OTFkiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7Y29tYm8xfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJJdGVtcyIsICJPcmllbnRhdGlvbiIsICJTZWxlY3Rpb24iLCAiVGV4dCIsICJUZXh0TGltaXQiLCAiVG9vbFRpcFRleHQiLCAiVmlzaWJsZUl0ZW1Db3VudCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkNvbWJvIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuRFJPUF9ET1dOKSAhPSAwKTsKLQkJc2ltcGxlQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvbWJvMS5nZXRTdHlsZSAoKSAmIFNXVC5TSU1QTEUpICE9IDApOwotCQlyZWFkT25seUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChjb21ibzEuZ2V0U3R5bGUgKCkgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0RW5hYmxlZCghc2ltcGxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db250cm9sRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29udHJvbEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTU2YjY4Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Db250cm9sRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbEV4YW1wbGUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0KLQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19jb250cm9sIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFNoZWxsVGFiIHNoZWxsVGFiOwotCXByaXZhdGUgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQlwcml2YXRlIFRhYiBbXSB0YWJzOwotCUltYWdlIGltYWdlc1tdOwotCi0Jc3RhdGljIGZpbmFsIGludCBjaUNsb3NlZEZvbGRlciA9IDAsIGNpT3BlbkZvbGRlciA9IDEsIGNpVGFyZ2V0ID0gMiwgY2lCYWNrZ3JvdW5kID0gMywgY2lQYXJlbnRCYWNrZ3JvdW5kID0gNDsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCSJjbG9zZWRGb2xkZXIuZ2lmIiwgCQkJLy8kTk9OLU5MUy0xJAotCQkib3BlbkZvbGRlci5naWYiLCAJCQkJLy8kTk9OLU5MUy0xJAotCQkidGFyZ2V0LmdpZiIsIAkJCQkJLy8kTk9OLU5MUy0xJAotCQkiYmFja2dyb3VuZEltYWdlLnBuZyIsIAkJCS8vJE5PTi1OTFMtMSQKLQkJInBhcmVudEJhY2tncm91bmRJbWFnZS5wbmcifTsgCS8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgaW50W10gaW1hZ2VUeXBlcyA9IHsKLQkJU1dULklDT04sCi0JCVNXVC5JQ09OLAotCQlTV1QuSUNPTiwKLQkJU1dULkJJVE1BUCwKLQkJU1dULkJJVE1BUH07Ci0KLQlib29sZWFuIHN0YXJ0dXAgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIENvbnRyb2xFeGFtcGxlIGVtYmVkZGVkIGluc2lkZQotCSAqIHRoZSBzdXBwbGllZCBwYXJlbnQgQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBDb250cm9sRXhhbXBsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRSZXNvdXJjZXMoKTsKLQkJdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlciAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRhYnMgPSBjcmVhdGVUYWJzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSAodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCSAgICBpdGVtLnNldFRleHQgKHRhYnMgW2ldLmdldFRhYlRleHQgKCkpOwotCQkgICAgaXRlbS5zZXRDb250cm9sICh0YWJzIFtpXS5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpKTsKLQkJICAgIGl0ZW0uc2V0RGF0YSAodGFicyBbaV0pOwotCQl9Ci0JCXN0YXJ0dXAgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHRoZSBzZXQgb2YgZXhhbXBsZSBUYWJzCi0JICovCi0JVGFiW10gY3JlYXRlVGFicygpIHsKLQkJcmV0dXJuIG5ldyBUYWIgW10gewotCQkJbmV3IEJ1dHRvblRhYiAodGhpcyksCi0JCQluZXcgQ2FudmFzVGFiICh0aGlzKSwKLQkJCW5ldyBDb21ib1RhYiAodGhpcyksCi0JCQluZXcgQ29vbEJhclRhYiAodGhpcyksCi0JCQluZXcgRGF0ZVRpbWVUYWIgKHRoaXMpLAotCQkJbmV3IERpYWxvZ1RhYiAodGhpcyksCi0JCQluZXcgRXhwYW5kQmFyVGFiICh0aGlzKSwKLQkJCW5ldyBHcm91cFRhYiAodGhpcyksCi0JCQluZXcgTGFiZWxUYWIgKHRoaXMpLAotCQkJbmV3IExpbmtUYWIgKHRoaXMpLAotCQkJbmV3IExpc3RUYWIgKHRoaXMpLAotCQkJbmV3IE1lbnVUYWIgKHRoaXMpLAotCQkJbmV3IFByb2dyZXNzQmFyVGFiICh0aGlzKSwKLQkJCW5ldyBTYXNoVGFiICh0aGlzKSwKLQkJCW5ldyBTY2FsZVRhYiAodGhpcyksCi0JCQlzaGVsbFRhYiA9IG5ldyBTaGVsbFRhYih0aGlzKSwKLQkJCW5ldyBTbGlkZXJUYWIgKHRoaXMpLAotCQkJbmV3IFNwaW5uZXJUYWIgKHRoaXMpLAotCQkJbmV3IFRhYkZvbGRlclRhYiAodGhpcyksCi0JCQluZXcgVGFibGVUYWIgKHRoaXMpLAotCQkJbmV3IFRleHRUYWIgKHRoaXMpLAotCQkJbmV3IFRvb2xCYXJUYWIgKHRoaXMpLAotCQkJbmV3IFRvb2xUaXBUYWIgKHRoaXMpLAotCQkJbmV3IFRyZWVUYWIgKHRoaXMpLAotCQkJbmV3IEJyb3dzZXJUYWIgKHRoaXMpLAotCQl9OwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhcgotCSAqIGluc3RhbmNlIG9mIHRoZSBDb250cm9sRXhhbXBsZS4KLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLyoKLQkJICogRGVzdHJveSBhbnkgc2hlbGxzIHRoYXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkCi0JCSAqIGJ5IHRoZSBTaGVsbHMgdGFiLiAgV2hlbiBhIHNoZWxsIGlzIGRpc3Bvc2VkLAotCQkgKiBhbGwgY2hpbGQgc2hlbGxzIGFyZSBhbHNvIGRpc3Bvc2VkLiAgVGhlcmVmb3JlCi0JCSAqIGl0IGlzIG5lY2Vzc2FyeSB0byBjaGVjayBmb3IgZGlzcG9zZWQgc2hlbGxzCi0JCSAqIGluIHRoZSBzaGVsbHMgbGlzdCB0byBhdm9pZCBkaXNwb3NpbmcgYSBzaGVsbAotCQkgKiB0d2ljZS4KLQkJICovCi0JCWlmIChzaGVsbFRhYiAhPSBudWxsKSBzaGVsbFRhYi5jbG9zZUFsbFNoZWxscyAoKTsKLQkJc2hlbGxUYWIgPSBudWxsOwotCQl0YWJGb2xkZXIgPSBudWxsOwotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlcwotCSAqLwotCXZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpbWFnZXMgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggYmVjYXVzZSBvZiBhIG1pc3NpbmcgU3RyaW5nLgotCSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBiaW5kcyBpdAotCSAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsCi0JICogcmV0dXJuIHRoZSBrZXkuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQl2b2lkIGluaXRSZXNvdXJjZXMoKSB7Ci0JCWZpbmFsIENsYXNzIGNsYXp6ID0gQ29udHJvbEV4YW1wbGUuY2xhc3M7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbWFnZXMgPT0gbnVsbCkgewotCQkJCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoc291cmNlU3RyZWFtKTsKLQkJCQkJCWlmIChpbWFnZVR5cGVzW2ldID09IFNXVC5JQ09OKSB7Ci0JCQkJCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJCQkJCWltYWdlc1tpXSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbWFnZXNbaV0gPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc291cmNlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJfQotCQl9Ci0JCVN0cmluZyBlcnJvciA9IChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSA/Ci0JCQlnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzIikgOgotCQkJIlVuYWJsZSB0byBsb2FkIHJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQkJZnJlZVJlc291cmNlcygpOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlcnJvcik7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlcyBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDb250cm9sRXhhbXBsZSBpbnN0YW5jZSA9IG5ldyBDb250cm9sRXhhbXBsZShzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIndpbmRvdy50aXRsZSIpKTsKLQkJc2V0U2hlbGxTaXplKGluc3RhbmNlLCBzaGVsbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogR3JhYnMgaW5wdXQgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXRhYkZvbGRlci5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBzaGVsbCB0byBpdCdzICJwYWNrZWQiIHNpemUsCi0JICogdW5sZXNzIHRoYXQgbWFrZXMgaXQgbGFyZ2VyIHRoYW4gdGhlIG1vbml0b3IgaXQgaXMgYmVpbmcgZGlzcGxheWVkIG9uLAotCSAqIGluIHdoaWNoIGNhc2UganVzdCBzZXQgdGhlIHNoZWxsIHNpemUgdG8gYmUgc2xpZ2h0bHkgc21hbGxlciB0aGFuIHRoZSBtb25pdG9yLgotCSAqLwotCXN0YXRpYyB2b2lkIHNldFNoZWxsU2l6ZShDb250cm9sRXhhbXBsZSBpbnN0YW5jZSwgU2hlbGwgc2hlbGwpIHsKLQkJUG9pbnQgc2l6ZSA9IHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCVJlY3RhbmdsZSBtb25pdG9yQXJlYSA9IHNoZWxsLmdldE1vbml0b3IoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCS8qIFdvcmthcm91bmQ6IGlmIHRoZSB0YWIgZm9sZGVyIGlzIHdpZGVyIHRoYW4gdGhlIHNjcmVlbiwKLQkJICogY2FyYm9uIGNsaXBzIGluc3RlYWQgb2Ygc29tZWhvdyBzY3JvbGxpbmcgdGhlIHRhYiBpdGVtcy4KLQkJICogV2UgdHJ5IHRvIHJlY292ZXIgc29tZSB3aWR0aCBieSB1c2luZyBzaG9ydGVyIHRhYiBuYW1lcy4gKi8KLQkJaWYgKHNpemUueCA+IG1vbml0b3JBcmVhLndpZHRoICYmIFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygiY2FyYm9uIikpIHsKLQkJCVRhYkl0ZW0gW10gdGFiSXRlbXMgPSBpbnN0YW5jZS50YWJGb2xkZXIuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTx0YWJJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCXRhYkl0ZW1zW2ldLnNldFRleHQgKGluc3RhbmNlLnRhYnMgW2ldLmdldFNob3J0VGFiVGV4dCAoKSk7Ci0JCQl9Ci0JCQlzaXplID0gc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJfQotCQlzaGVsbC5zZXRTaXplKE1hdGgubWluKHNpemUueCwgbW9uaXRvckFyZWEud2lkdGgpLCBNYXRoLm1pbihzaXplLnksIG1vbml0b3JBcmVhLmhlaWdodCkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29vbEJhclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ29vbEJhclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzIwY2U4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0Nvb2xCYXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBDb29sQmFyVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwIHRoYXQgY29udGFpbnMgdGhlbSAqLwotCUNvb2xCYXIgY29vbEJhcjsKLQlDb29sSXRlbSBwdXNoSXRlbSwgZHJvcERvd25JdGVtLCByYWRpb0l0ZW0sIGNoZWNrSXRlbSwgdGV4dEl0ZW07Ci0JR3JvdXAgY29vbEJhckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b247Ci0JQnV0dG9uIGRyb3BEb3duQnV0dG9uLCBmbGF0QnV0dG9uOwotCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBsb2NrZWRCdXR0b247Ci0JCi0JUG9pbnRbXSBzaXplczsKLQlpbnRbXSB3cmFwSW5kaWNlczsKLQlpbnRbXSBvcmRlcjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JQ29vbEJhclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVPdGhlckdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlT3RoZXJHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIGRpc3BsYXkgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhpcyBleGFtcGxlICovCi0JCWxvY2tlZEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWxvY2tlZEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTG9ja2VkIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlsb2NrZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldExvY2tlZCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJY29vbEJhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY29vbEJhckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQljb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJY29vbEJhckdyb3VwLnNldFRleHQgKCJDb29sQmFyIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKSwgaXRlbVN0eWxlID0gMDsKLQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQsIGl0ZW0sIGFuZCBpdGVtIHRvb2xCYXIgc3R5bGVzICovCi0JCWludCB0b29sQmFyU3R5bGUgPSBTV1QuRkxBVDsKLQkJYm9vbGVhbiB2ZXJ0aWNhbCA9IGZhbHNlOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCXN0eWxlIHw9IFNXVC5IT1JJWk9OVEFMOwotCQkJdG9vbEJhclN0eWxlIHw9IFNXVC5IT1JJWk9OVEFMOwotCQl9Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCXN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJCXRvb2xCYXJTdHlsZSB8PSBTV1QuVkVSVElDQUw7Ci0JCQl2ZXJ0aWNhbCA9IHRydWU7Ci0JCX0KLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGZsYXRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5GTEFUOwotCQlpZiAoZHJvcERvd25CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW1TdHlsZSB8PSBTV1QuRFJPUF9ET1dOOwotCQotCQkvKgotCQkqIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCQkqLwotCQljb29sQmFyID0gbmV3IENvb2xCYXIgKGNvb2xCYXJHcm91cCwgc3R5bGUpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBwdXNoIGJ1dHRvbiB0b29sYmFyIGNvb2wgaXRlbSAqLwotCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgdG9vbEJhclN0eWxlKTsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUFVTSCIpOwkJCi0JCXB1c2hJdGVtID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCBpdGVtU3R5bGUpOwotCQlwdXNoSXRlbS5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJcHVzaEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJCQotCQkvKiBDcmVhdGUgdGhlIGRyb3Bkb3duIHRvb2xiYXIgY29vbCBpdGVtICovCi0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgdG9vbEJhclN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWRyb3BEb3duSXRlbSA9IG5ldyBDb29sSXRlbSAoY29vbEJhciwgaXRlbVN0eWxlKTsKLQkJZHJvcERvd25JdGVtLnNldENvbnRyb2wgKHRvb2xCYXIpOwotCQlkcm9wRG93bkl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCS8qIENyZWF0ZSB0aGUgcmFkaW8gYnV0dG9uIHRvb2xiYXIgY29vbCBpdGVtICovCi0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgdG9vbEJhclN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuUkFESU8iKTsKLQkJcmFkaW9JdGVtID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCBpdGVtU3R5bGUpOwotCQlyYWRpb0l0ZW0uc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCXJhZGlvSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGNoZWNrIGJ1dHRvbiB0b29sYmFyIGNvb2wgaXRlbSAqLwotCQl0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIHRvb2xCYXJTdHlsZSk7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5DSEVDSyIpOwotCQljaGVja0l0ZW0gPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIGl0ZW1TdHlsZSk7Ci0JCWNoZWNrSXRlbS5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJY2hlY2tJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgdGV4dCBjb29sIGl0ZW0gKi8KLQkJaWYgKCF2ZXJ0aWNhbCkgewotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQgKGNvb2xCYXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJCXRleHRJdGVtID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCBpdGVtU3R5bGUpOwotCQkJdGV4dEl0ZW0uc2V0Q29udHJvbCAodGV4dCk7Ci0JCQl0ZXh0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQlQb2ludCB0ZXh0U2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCXRleHRTaXplID0gdGV4dEl0ZW0uY29tcHV0ZVNpemUodGV4dFNpemUueCwgdGV4dFNpemUueSk7Ci0JCQl0ZXh0SXRlbS5zZXRNaW5pbXVtU2l6ZSh0ZXh0U2l6ZSk7Ci0JCQl0ZXh0SXRlbS5zZXRQcmVmZXJyZWRTaXplKHRleHRTaXplKTsKLQkJCXRleHRJdGVtLnNldFNpemUodGV4dFNpemUpOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBzaXplcyBhZnRlciBhZGRpbmcgYWxsIGNvb2wgaXRlbXMgKi8KLQkJQ29vbEl0ZW1bXSBjb29sSXRlbXMgPSBjb29sQmFyLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29vbEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb29sSXRlbSBjb29sSXRlbSA9IGNvb2xJdGVtc1tpXTsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNvb2xJdGVtLmdldENvbnRyb2woKTsKLQkJCVBvaW50IHNpemUgPSBjb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQlQb2ludCBjb29sU2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgVG9vbEJhcikgewotCQkJCVRvb2xCYXIgYmFyID0gKFRvb2xCYXIpY29udHJvbDsKLQkJCQlpZiAoYmFyLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQlpZiAodmVydGljYWwpIHsKLQkJCQkJCXNpemUueSA9IGJhci5nZXRJdGVtKDApLmdldEJvdW5kcygpLmhlaWdodDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXNpemUueCA9IGJhci5nZXRJdGVtKDApLmdldFdpZHRoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZShzaXplKTsKLQkJCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoY29vbFNpemUpOwotCQkJY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZSk7Ci0JCX0KLQkJCi0JCS8qIElmIHdlIGhhdmUgc2F2ZWQgc3RhdGUsIHJlc3RvcmUgaXQgKi8KLQkJaWYgKG9yZGVyICE9IG51bGwgJiYgb3JkZXIubGVuZ3RoID09IGNvb2xCYXIuZ2V0SXRlbUNvdW50KCkpIHsKLQkJCWNvb2xCYXIuc2V0SXRlbUxheW91dChvcmRlciwgd3JhcEluZGljZXMsIHNpemVzKTsKLQkJfSBlbHNlIHsKLQkJCWNvb2xCYXIuc2V0V3JhcEluZGljZXMobmV3IGludFtdIHsxLCAzfSk7Ci0JCX0KLQkJCi0JCS8qIEFkZCBhIGxpc3RlbmVyIHRvIHJlc2l6ZSB0aGUgZ3JvdXAgYm94IHRvIG1hdGNoIHRoZSBjb29sYmFyICovCi0JCWNvb2xCYXIuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGFtcGxlR3JvdXAubGF5b3V0KCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JCUdyb3VwIGl0ZW1Hcm91cCA9IG5ldyBHcm91cChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWl0ZW1Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaXRlbUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlpdGVtR3JvdXAuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSXRlbV9TdHlsZXMiKSk7Ci0JCWRyb3BEb3duQnV0dG9uID0gbmV3IEJ1dHRvbiAoaXRlbUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlkcm9wRG93bkJ1dHRvbi5zZXRUZXh0ICgiU1dULkRST1BfRE9XTiIpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKiBzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHRvb2xiYXIgaWYgYXBwbGljYWJsZSAqLwotCQlpZiAoY29vbEJhciAhPSBudWxsKSB7Ci0JCQlzaXplcyA9IGNvb2xCYXIuZ2V0SXRlbVNpemVzKCk7Ci0JCQl3cmFwSW5kaWNlcyA9IGNvb2xCYXIuZ2V0V3JhcEluZGljZXMoKTsKLQkJCW9yZGVyID0gY29vbEJhci5nZXRJdGVtT3JkZXIoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlRXhhbXBsZVdpZGdldHMoKTsJCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCXJldHVybiBjb29sQmFyLmdldEl0ZW1zKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2Nvb2xCYXJ9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvcnQgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkNCIjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJDb29sQmFyIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuVkVSVElDQUwpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoY29vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQlmbGF0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuRkxBVCkgIT0gMCk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFNlbGVjdGlvbiAoKGNvb2xCYXIuZ2V0SXRlbSgwKS5nZXRTdHlsZSAoKSAmIFNXVC5EUk9QX0RPV04pICE9IDApOwotCQlsb2NrZWRCdXR0b24uc2V0U2VsZWN0aW9uKGNvb2xCYXIuZ2V0TG9ja2VkKCkpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHNldFdpZGdldExvY2tlZCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaGVhZGVyIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TG9ja2VkICgpIHsKLQkJY29vbEJhci5zZXRMb2NrZWQgKGxvY2tlZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBMaXN0ZW5zIHRvIHdpZGdldFNlbGVjdGVkKCkgZXZlbnRzIG9uIFNXVC5EUk9QX0RPV04gdHlwZSBUb29sSXRlbXMKLQkgKiBhbmQgb3BlbnMvY2xvc2VzIGEgbWVudSB3aGVuIGFwcHJvcHJpYXRlLgotCSAqLwotCWNsYXNzIERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51IG1lbnUgPSBudWxsOwotCQlwcml2YXRlIGJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCS8vIENyZWF0ZSB0aGUgbWVudSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjcmVhdGVkCi0JCQlpZiAobWVudSA9PSBudWxsKSB7Ci0JCQkJLy8gTGF6eSBjcmVhdGUgdGhlIG1lbnUuCi0JCQkJbWVudSA9IG5ldyBNZW51KHNoZWxsKTsKLQkJCQltZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1lbnVIaWRkZW4oTWVudUV2ZW50IGUpIHsKLQkJCQkJCXZpc2libGUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgOTsgKytpKSB7Ci0JCQkJCWZpbmFsIFN0cmluZyB0ZXh0ID0gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BEb3duRGF0YV8iICsgaSk7Ci0JCQkJCWlmICh0ZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJCQkJCW1lbnVJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCQkvKgotCQkJCQkJICogQWRkIGEgbWVudSBzZWxlY3Rpb24gbGlzdGVuZXIgc28gdGhhdCB0aGUgbWVudSBpcyBoaWRkZW4KLQkJCQkJCSAqIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIGZyb20gdGhlIGRyb3AgZG93biBtZW51LgotCQkJCQkJICovCi0JCQkJCQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJCXNldE1lbnVWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyoqCi0JCQkgKiBBIHNlbGVjdGlvbiBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gYSBkcm9wIGRvd24gdG9vbAotCQkJICogaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgbWFpbiBhcmVhIGFuZCBpbiB0aGUgZHJvcAotCQkJICogZG93biBhcnJvdy4gIEV4YW1pbmUgdGhlIGV2ZW50IGRldGFpbCB0byBkZXRlcm1pbmUKLQkJCSAqIHdoZXJlIHRoZSB3aWRnZXQgd2FzIHNlbGVjdGVkLgotCQkJICovCQkKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgZHJvcCBkb3duIGFycm93IHdhcyBzZWxlY3RlZC4KLQkJCQkgKi8KLQkJCQlpZiAodmlzaWJsZSkgewotCQkJCQkvLyBIaWRlIHRoZSBtZW51IHRvIGdpdmUgdGhlIEFycm93IHRoZSBhcHBlYXJhbmNlIG9mIGJlaW5nIGEgdG9nZ2xlIGJ1dHRvbi4KLQkJCQkJc2V0TWVudVZpc2libGUoZmFsc2UpOwotCQkJCX0gZWxzZSB7CQotCQkJCQkvLyBQb3NpdGlvbiB0aGUgbWVudSBiZWxvdyBhbmQgdmVydGljYWxseSBhbGlnbmVkIHdpdGggdGhlIHRoZSBkcm9wIGRvd24gdG9vbCBidXR0b24uCi0JCQkJCWZpbmFsIFRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJCWZpbmFsIFRvb2xCYXIgIHRvb2xCYXIgPSB0b29sSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJCi0JCQkJCVJlY3RhbmdsZSB0b29sSXRlbUJvdW5kcyA9IHRvb2xJdGVtLmdldEJvdW5kcygpOwotCQkJCQlQb2ludCBwb2ludCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sSXRlbUJvdW5kcy54LCB0b29sSXRlbUJvdW5kcy55KSk7Ci0JCQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIHRvb2xJdGVtQm91bmRzLmhlaWdodCk7Ci0JCQkJCXNldE1lbnVWaXNpYmxlKHRydWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBNYWluIGFyZWEgb2YgZHJvcCBkb3duIHRvb2wgaXRlbSBzZWxlY3RlZC4KLQkJCQkgKiBBbiBhcHBsaWNhdGlvbiB3b3VsZCBpbnZva2UgdGhlIGNvZGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIGZvciB0aGUgdG9vbCBpdGVtLgotCQkJCSAqLwotCQkJfQotCQl9Ci0JCXByaXZhdGUgdm9pZCBzZXRNZW51VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCW1lbnUuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCXRoaXMudmlzaWJsZSA9IHZpc2libGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIHdpZGdldFNlbGVjdGVkKCkgZXZlbnRzIG9uIFNXVC5EUk9QX0RPV04gdHlwZSBDb29sSXRlbXMKLQkgKiBhbmQgb3BlbnMvY2xvc2VzIGEgbWVudSB3aGVuIGFwcHJvcHJpYXRlLgotCSAqLwotCWNsYXNzIENvb2xJdGVtU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51IG1lbnUgPSBudWxsOwotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCS8qKgotCQkJICogQSBzZWxlY3Rpb24gZXZlbnQgd2lsbCBiZSBmaXJlZCB3aGVuIHRoZSBjb29sIGl0ZW0KLQkJCSAqIGlzIHNlbGVjdGVkIGJ5IGl0cyBncmlwcGVyIG9yIGlmIHRoZSBkcm9wIGRvd24gYXJyb3cKLQkJCSAqIChvciAnY2hldnJvbicpIGlzIHNlbGVjdGVkLiBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwKLQkJCSAqIHRvIGRldGVybWluZSB3aGVyZSB0aGUgd2lkZ2V0IHdhcyBzZWxlY3RlZC4KLQkJCSAqLwotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQkvKiBJZiB0aGUgcG9wdXAgbWVudSBpcyBhbHJlYWR5IHVwIChpLmUuIHVzZXIgcHJlc3NlZCBhcnJvdyB0d2ljZSksCi0JCQkJICogdGhlbiBkaXNwb3NlIGl0LgotCQkJCSAqLwotCQkJCWlmIChtZW51ICE9IG51bGwpIHsKLQkJCQkJbWVudS5kaXNwb3NlKCk7Ci0JCQkJCW1lbnUgPSBudWxsOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCS8qIEdldCB0aGUgY29vbCBpdGVtIGFuZCBjb252ZXJ0IGl0cyBib3VuZHMgdG8gZGlzcGxheSBjb29yZGluYXRlcy4gKi8KLQkJCQlDb29sSXRlbSBjb29sSXRlbSA9IChDb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gY29vbEl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCWl0ZW1Cb3VuZHMud2lkdGggPSBldmVudC54IC0gaXRlbUJvdW5kcy54OwotCQkJCVBvaW50IHB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50IChpdGVtQm91bmRzLngsIGl0ZW1Cb3VuZHMueSkpOwotCQkJCWl0ZW1Cb3VuZHMueCA9IHB0Lng7Ci0JCQkJaXRlbUJvdW5kcy55ID0gcHQueTsKLQkJCQkKLQkJCQkvKiBHZXQgdGhlIHRvb2xiYXIgZnJvbSB0aGUgY29vbCBpdGVtLiAqLwotCQkJCVRvb2xCYXIgdG9vbEJhciA9IChUb29sQmFyKSBjb29sSXRlbS5nZXRDb250cm9sICgpOwotCQkJCVRvb2xJdGVtW10gdG9vbHMgPSB0b29sQmFyLmdldEl0ZW1zICgpOwotCQkJCWludCB0b29sQ291bnQgPSB0b29scy5sZW5ndGg7Ci0JCQkJCQkJCQotCQkJCS8qIENvbnZlcnQgdGhlIGJvdW5kcyBvZiBlYWNoIHRvb2wgaXRlbSB0byBkaXNwbGF5IGNvb3JkaW5hdGVzLAotCQkJCSAqIGFuZCBkZXRlcm1pbmUgd2hpY2ggb25lcyBhcmUgcGFzdCB0aGUgYm91bmRzIG9mIHRoZSBjb29sIGl0ZW0uCi0JCQkJICovCi0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlIChpIDwgdG9vbENvdW50KSB7Ci0JCQkJCVJlY3RhbmdsZSB0b29sQm91bmRzID0gdG9vbHNbaV0uZ2V0Qm91bmRzICgpOwotCQkJCQlwdCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sQm91bmRzLngsIHRvb2xCb3VuZHMueSkpOwotCQkJCQl0b29sQm91bmRzLnggPSBwdC54OwotCQkJCQl0b29sQm91bmRzLnkgPSBwdC55OwotCQkJICAJCVJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gPSBpdGVtQm91bmRzLmludGVyc2VjdGlvbiAodG9vbEJvdW5kcyk7Ci0JCQkgIAkJaWYgKCFpbnRlcnNlY3Rpb24uZXF1YWxzICh0b29sQm91bmRzKSkgYnJlYWs7Ci0JCQkgIAkJaSsrOwotCQkJCX0KLQkJCQkKLQkJCQkvKiBDcmVhdGUgYSBwb3AtdXAgbWVudSB3aXRoIGl0ZW1zIGZvciBlYWNoIG9mIHRoZSBoaWRkZW4gYnV0dG9ucy4gKi8KLQkJCQltZW51ID0gbmV3IE1lbnUgKGNvb2xCYXIpOwotCQkJCWZvciAoaW50IGogPSBpOyBqIDwgdG9vbENvdW50OyBqKyspIHsKLQkJCQkJVG9vbEl0ZW0gdG9vbCA9IHRvb2xzW2pdOwotCQkJCQlJbWFnZSBpbWFnZSA9IHRvb2wuZ2V0SW1hZ2UoKTsKLQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCW5ldyBNZW51SXRlbSAobWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoKHRvb2wuZ2V0U3R5bGUoKSAmIFNXVC5EUk9QX0RPV04pICE9IDApIHsKLQkJCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULkNBU0NBREUpOwotCQkJCQkJCW1lbnVJdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCQkJCQlTdHJpbmcgdGV4dCA9IHRvb2wuZ2V0VG9vbFRpcFRleHQoKTsKLQkJCQkJCQlpZiAodGV4dCAhPSBudWxsKSBtZW51SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQkJCU1lbnUgbSA9IG5ldyBNZW51KG1lbnUpOwotCQkJCQkJCW1lbnVJdGVtLnNldE1lbnUobSk7Ci0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCA5OyArK2spIHsKLQkJCQkJCQkJdGV4dCA9IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEcm9wRG93bkRhdGFfIiArIGspOwotCQkJCQkJCQlpZiAodGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCQkJCQlNZW51SXRlbSBtaSA9IG5ldyBNZW51SXRlbShtLCBTV1QuTk9ORSk7Ci0JCQkJCQkJCQltaS5zZXRUZXh0KHRleHQpOwotCQkJCQkJCQkJLyogQXBwbGljYXRpb24gY29kZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gZm9yIHRoZSBzdWJtZW51IGl0ZW0gd291bGQgZ28gaGVyZS4gKi8KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCW5ldyBNZW51SXRlbShtLCBTV1QuU0VQQVJBVE9SKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5OT05FKTsKLQkJCQkJCQltZW51SXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQkJCQkJU3RyaW5nIHRleHQgPSB0b29sLmdldFRvb2xUaXBUZXh0KCk7Ci0JCQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgbWVudUl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJCX0KLQkJCQkJCS8qIEFwcGxpY2F0aW9uIGNvZGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIGZvciB0aGUgbWVudSBpdGVtIHdvdWxkIGdvIGhlcmUuICovCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLyogRGlzcGxheSB0aGUgcG9wLXVwIG1lbnUgYXQgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBhcnJvdyBidXR0b24uCi0JCQkJICogRGlzcG9zZSB0aGUgbWVudSB3aGVuIHRoZSB1c2VyIGlzIGRvbmUgd2l0aCBpdC4KLQkJCQkgKi8KLQkJCQlwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJbWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCQl3aGlsZSAobWVudSAhPSBudWxsICYmICFtZW51LmlzRGlzcG9zZWQoKSAmJiBtZW51LmlzVmlzaWJsZSAoKSkgewotCQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQkJCX0KLQkJCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQkJCW1lbnUuZGlzcG9zZSAoKTsKLQkJCQkJbWVudSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ3VzdG9tQ29udHJvbEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0N1c3RvbUNvbnRyb2xFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjQ1ZjMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvQ3VzdG9tQ29udHJvbEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udHJvbEV4YW1wbGUgZXh0ZW5kcyBDb250cm9sRXhhbXBsZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgQ3VzdG9tQ29udHJvbEV4YW1wbGUgZW1iZWRkZWQKLQkgKiBpbnNpZGUgdGhlIHN1cHBsaWVkIHBhcmVudCBDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29udGFpbmVyIG9mIHRoZSBleGFtcGxlCi0JICovCi0JcHVibGljIEN1c3RvbUNvbnRyb2xFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIgKHBhcmVudCk7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlcnMgdGhlIHNldCBvZiBleGFtcGxlIFRhYnMKLQkgKi8KLQlUYWJbXSBjcmVhdGVUYWJzKCkgewotCQlyZXR1cm4gbmV3IFRhYiBbXSB7Ci0JCQluZXcgQ0NvbWJvVGFiICh0aGlzKSwKLQkJCW5ldyBDTGFiZWxUYWIgKHRoaXMpLAotCQkJbmV3IENUYWJGb2xkZXJUYWIgKHRoaXMpLAotCQkJbmV3IFNhc2hGb3JtVGFiICh0aGlzKSwKLQkJCW5ldyBTdHlsZWRUZXh0VGFiICh0aGlzKSwKLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogSW52b2tlcyBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUN1c3RvbUNvbnRyb2xFeGFtcGxlIGluc3RhbmNlID0gbmV3IEN1c3RvbUNvbnRyb2xFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiY3VzdG9tLndpbmRvdy50aXRsZSIpKTsKLQkJc2V0U2hlbGxTaXplKGluc3RhbmNlLCBzaGVsbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RhdGVUaW1lVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9EYXRlVGltZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjVjYjM2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RhdGVUaW1lVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIERhdGVUaW1lVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCURhdGVUaW1lIGRhdGVUaW1lMTsKLQlHcm91cCBkYXRlVGltZUdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gZGF0ZUJ1dHRvbiwgdGltZUJ1dHRvbiwgY2FsZW5kYXJCdXR0b24sIHNob3J0QnV0dG9uLCBtZWRpdW1CdXR0b24sIGxvbmdCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCURhdGVUaW1lVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBsaXN0ICovCi0JCWRhdGVUaW1lR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlkYXRlVGltZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlkYXRlVGltZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWRhdGVUaW1lR3JvdXAuc2V0VGV4dCAoIkRhdGVUaW1lIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoZGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5EQVRFOwotCQlpZiAodGltZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5USU1FOwotCQlpZiAoY2FsZW5kYXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0FMRU5EQVI7Ci0JCWlmIChzaG9ydEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSE9SVDsKLQkJaWYgKG1lZGl1bUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NRURJVU07Ci0JCWlmIChsb25nQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxPTkc7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwkJCi0JCWRhdGVUaW1lMSA9IG5ldyBEYXRlVGltZSAoZGF0ZVRpbWVHcm91cCwgc3R5bGUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlkYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlkYXRlQnV0dG9uLnNldFRleHQoIlNXVC5EQVRFIik7Ci0JCXRpbWVCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRpbWVCdXR0b24uc2V0VGV4dCgiU1dULlRJTUUiKTsKLQkJY2FsZW5kYXJCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNhbGVuZGFyQnV0dG9uLnNldFRleHQoIlNXVC5DQUxFTkRBUiIpOwotCQlHcm91cCBmb3JtYXRHcm91cCA9IG5ldyBHcm91cChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWZvcm1hdEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc2hvcnRCdXR0b24gPSBuZXcgQnV0dG9uKGZvcm1hdEdyb3VwLCBTV1QuUkFESU8pOwotCQlzaG9ydEJ1dHRvbi5zZXRUZXh0KCJTV1QuU0hPUlQiKTsKLQkJbWVkaXVtQnV0dG9uID0gbmV3IEJ1dHRvbihmb3JtYXRHcm91cCwgU1dULlJBRElPKTsKLQkJbWVkaXVtQnV0dG9uLnNldFRleHQoIlNXVC5NRURJVU0iKTsKLQkJbG9uZ0J1dHRvbiA9IG5ldyBCdXR0b24oZm9ybWF0R3JvdXAsIFNXVC5SQURJTyk7Ci0JCWxvbmdCdXR0b24uc2V0VGV4dCgiU1dULkxPTkciKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbihzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCgiU1dULkJPUkRFUiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtkYXRlVGltZTF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkRheSIsICJIb3VycyIsICJNaW51dGVzIiwgIk1vbnRoIiwgIlNlY29uZHMiLCAiWWVhciJ9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJEYXRlVGltZSI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlkYXRlQnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5EQVRFKSAhPSAwKTsKLQkJdGltZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChkYXRlVGltZTEuZ2V0U3R5bGUgKCkgJiBTV1QuVElNRSkgIT0gMCk7Ci0JCWNhbGVuZGFyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5DQUxFTkRBUikgIT0gMCk7Ci0JCXNob3J0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGRhdGVUaW1lMS5nZXRTdHlsZSAoKSAmIFNXVC5TSE9SVCkgIT0gMCk7Ci0JCW1lZGl1bUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChkYXRlVGltZTEuZ2V0U3R5bGUgKCkgJiBTV1QuTUVESVVNKSAhPSAwKTsKLQkJbG9uZ0J1dHRvbi5zZXRTZWxlY3Rpb24gKChkYXRlVGltZTEuZ2V0U3R5bGUgKCkgJiBTV1QuTE9ORykgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKChkYXRlVGltZTEuZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9EaWFsb2dUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RpYWxvZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OWI4M2RiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0RpYWxvZ1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgRGlhbG9nVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUdyb3VwIGRpYWxvZ1N0eWxlR3JvdXAsIHJlc3VsdEdyb3VwOwotCVRleHQgdGV4dFdpZGdldDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQ29tYm8gZGlhbG9nQ29tYm87Ci0JQnV0dG9uIGNyZWF0ZUJ1dHRvbjsKLQlCdXR0b24gb2tCdXR0b24sIGNhbmNlbEJ1dHRvbjsKLQlCdXR0b24geWVzQnV0dG9uLCBub0J1dHRvbjsKLQlCdXR0b24gcmV0cnlCdXR0b247Ci0JQnV0dG9uIGFib3J0QnV0dG9uLCBpZ25vcmVCdXR0b247Ci0JQnV0dG9uIGljb25FcnJvckJ1dHRvbiwgaWNvbkluZm9ybWF0aW9uQnV0dG9uLCBpY29uUXVlc3Rpb25CdXR0b247Ci0JQnV0dG9uIGljb25XYXJuaW5nQnV0dG9uLCBpY29uV29ya2luZ0J1dHRvbiwgbm9JY29uQnV0dG9uOwotCUJ1dHRvbiBwcmltYXJ5TW9kYWxCdXR0b24sIGFwcGxpY2F0aW9uTW9kYWxCdXR0b24sIHN5c3RlbU1vZGFsQnV0dG9uOwotCUJ1dHRvbiBzYXZlQnV0dG9uLCBvcGVuQnV0dG9uLCBtdWx0aUJ1dHRvbjsKLQotCXN0YXRpYyBTdHJpbmcgW10gRmlsdGVyRXh0ZW5zaW9ucwk9IHsiKi50eHQiLCAiKi5iYXQiLCAiKi5kb2MiLCAiKiJ9OwotCXN0YXRpYyBTdHJpbmcgW10gRmlsdGVyTmFtZXMJCT0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWx0ZXJOYW1lXzAiKSwKLQkJCQkJCQkJCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsdGVyTmFtZV8xIiksCi0JCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbHRlck5hbWVfMiIpLAotCQkJCQkJCQkJCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWx0ZXJOYW1lXzMiKX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JRGlhbG9nVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYSBidXR0b24gc3R5bGUgc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IHRoZSBzZWxlY3Rpb24gZXZlbnQKLQkgKi8KLQl2b2lkIGJ1dHRvblN0eWxlU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJLyoKLQkJICogT25seSBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBidXR0b24gc3R5bGVzIGFyZQotCQkgKiBzdXBwb3J0ZWQgZm9yIHZhcmlvdXMgZGlhbG9ncy4gIE1ha2Ugc3VyZSB0aGUKLQkJICogY29udHJvbCB3aWRnZXQgcmVmbGVjdHMgb25seSB2YWxpZCBjb21iaW5hdGlvbnMuCi0JCSAqLwotCQlib29sZWFuIG9rID0gb2tCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQlib29sZWFuIGNhbmNlbCA9IGNhbmNlbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCk7Ci0JCWJvb2xlYW4geWVzID0geWVzQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiBubyA9IG5vQnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiBhYm9ydCA9IGFib3J0QnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiByZXRyeSA9IHJldHJ5QnV0dG9uLmdldFNlbGVjdGlvbiAoKTsKLQkJYm9vbGVhbiBpZ25vcmUgPSBpZ25vcmVCdXR0b24uZ2V0U2VsZWN0aW9uICgpOwotCQkKLQkJb2tCdXR0b24uc2V0RW5hYmxlZCAoISh5ZXMgfHwgbm8gfHwgcmV0cnkgfHwgYWJvcnQgfHwgaWdub3JlKSk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkICghKGFib3J0IHx8IGlnbm9yZSB8fCAoeWVzICE9IG5vKSkpOwotCQl5ZXNCdXR0b24uc2V0RW5hYmxlZCAoIShvayB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUgfHwgKGNhbmNlbCAmJiAheWVzICYmICFubykpKTsKLQkJbm9CdXR0b24uc2V0RW5hYmxlZCAoIShvayB8fCByZXRyeSB8fCBhYm9ydCB8fCBpZ25vcmUgfHwgKGNhbmNlbCAmJiAheWVzICYmICFubykpKTsKLQkJcmV0cnlCdXR0b24uc2V0RW5hYmxlZCAoIShvayB8fCB5ZXMgfHwgbm8pKTsKLQkJYWJvcnRCdXR0b24uc2V0RW5hYmxlZCAoIShvayB8fCBjYW5jZWwgfHwgeWVzIHx8IG5vKSk7Ci0JCWlnbm9yZUJ1dHRvbi5zZXRFbmFibGVkICghKG9rIHx8IGNhbmNlbCB8fCB5ZXMgfHwgbm8pKTsKLQkJCi0JCWNyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkICgKLQkJCQkhKG9rIHx8IGNhbmNlbCB8fCB5ZXMgfHwgbm8gfHwgcmV0cnkgfHwgYWJvcnQgfHwgaWdub3JlKSB8fAotCQkJCW9rIHx8Ci0JCQkJKG9rICYmIGNhbmNlbCkgfHwKLQkJCQkoeWVzICYmIG5vKSB8fAotCQkJCSh5ZXMgJiYgbm8gJiYgY2FuY2VsKSB8fAotCQkJCShyZXRyeSAmJiBjYW5jZWwpIHx8Ci0JCQkJKGFib3J0ICYmIHJldHJ5ICYmIGlnbm9yZSkpOwotCQkKLQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIGNyZWF0ZSBidXR0b24gc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLQkgKi8KLQl2b2lkIGNyZWF0ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCi0JCS8qIENvbXB1dGUgdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKG9rQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgb2tCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuT0s7Ci0JCWlmIChjYW5jZWxCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBjYW5jZWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0FOQ0VMOwotCQlpZiAoeWVzQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgeWVzQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULllFUzsKLQkJaWYgKG5vQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgbm9CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTk87Ci0JCWlmIChyZXRyeUJ1dHRvbi5nZXRFbmFibGVkICgpICYmIHJldHJ5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFVFJZOwotCQlpZiAoYWJvcnRCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBhYm9ydEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5BQk9SVDsKLQkJaWYgKGlnbm9yZUJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGlnbm9yZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JR05PUkU7Ci0JCWlmIChpY29uRXJyb3JCdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBpY29uRXJyb3JCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9FUlJPUjsKLQkJaWYgKGljb25JbmZvcm1hdGlvbkJ1dHRvbi5nZXRFbmFibGVkICgpICYmIGljb25JbmZvcm1hdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JQ09OX0lORk9STUFUSU9OOwotCQlpZiAoaWNvblF1ZXN0aW9uQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvblF1ZXN0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fUVVFU1RJT047Ci0JCWlmIChpY29uV2FybmluZ0J1dHRvbi5nZXRFbmFibGVkICgpICYmIGljb25XYXJuaW5nQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fV0FSTklORzsKLQkJaWYgKGljb25Xb3JraW5nQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgaWNvbldvcmtpbmdCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9XT1JLSU5HOwotCQlpZiAocHJpbWFyeU1vZGFsQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgcHJpbWFyeU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlBSSU1BUllfTU9EQUw7Ci0JCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5BUFBMSUNBVElPTl9NT0RBTDsKLQkJaWYgKHN5c3RlbU1vZGFsQnV0dG9uLmdldEVuYWJsZWQgKCkgJiYgc3lzdGVtTW9kYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU1lTVEVNX01PREFMOwotCQlpZiAoc2F2ZUJ1dHRvbi5nZXRFbmFibGVkICgpICYmIHNhdmVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0FWRTsKLQkJaWYgKG9wZW5CdXR0b24uZ2V0RW5hYmxlZCAoKSAmJiBvcGVuQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk9QRU47Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRFbmFibGVkICgpICYmIG11bHRpQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULk1VTFRJOwotCQotCQkvKiBPcGVuIHRoZSBhcHByb3ByaWF0ZSBkaWFsb2cgdHlwZSAqLwotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZ0NvbWJvLmdldFRleHQgKCk7Ci0JCQotCQlpZiAobmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvckRpYWxvZyIpKSkgewotCQkJQ29sb3JEaWFsb2cgZGlhbG9nID0gbmV3IENvbG9yRGlhbG9nIChzaGVsbCAsc3R5bGUpOwotCQkJZGlhbG9nLnNldFJHQiAobmV3IFJHQiAoMTAwLCAxMDAsIDEwMCkpOwotCQkJZGlhbG9nLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpKTsKLQkJCVJHQiByZXN1bHQgPSBkaWFsb2cub3BlbiAoKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3JEaWFsb2ciKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IiIgKyByZXN1bHR9KSArIFRleHQuREVMSU1JVEVSICsgVGV4dC5ERUxJTUlURVIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobmFtZS5lcXVhbHMgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaXJlY3RvcnlEaWFsb2ciKSkpIHsKLQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nIChzaGVsbCwgc3R5bGUpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGFtcGxlX3N0cmluZyIpKTsKLQkJCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRpcmVjdG9yeURpYWxvZyIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pICsgVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVEaWFsb2ciKSkpIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cgKHNoZWxsLCBzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0RmlsZU5hbWUgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJyZWFkbWVfdHh0IikpOwotCQkJZGlhbG9nLnNldEZpbHRlck5hbWVzIChGaWx0ZXJOYW1lcyk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyAoRmlsdGVyRXh0ZW5zaW9ucyk7Ci0JCQlkaWFsb2cuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJU3RyaW5nIHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVEaWFsb2ciKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IiIgKyByZXN1bHR9KSArIFRleHQuREVMSU1JVEVSKTsKLQkJCWlmICgoZGlhbG9nLmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKSB7Ci0JCQkJU3RyaW5nIFtdIGZpbGVzID0gZGlhbG9nLmdldEZpbGVOYW1lcyAoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8ZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKCJcdCIgKyBmaWxlcyBbaV0gKyBUZXh0LkRFTElNSVRFUik7Ci0JCQkJfQotCQkJfQotCQkJdGV4dFdpZGdldC5hcHBlbmQgKFRleHQuREVMSU1JVEVSKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udERpYWxvZyIpKSkgewotCQkJRm9udERpYWxvZyBkaWFsb2cgPSBuZXcgRm9udERpYWxvZyAoc2hlbGwsIHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlGb250RGF0YSByZXN1bHQgPSBkaWFsb2cub3BlbiAoKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udERpYWxvZyIpICsgVGV4dC5ERUxJTUlURVIpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pICsgVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByaW50RGlhbG9nIikpKSB7Ci0JCQlQcmludERpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbnREaWFsb2cgKHNoZWxsLCBzdHlsZSk7Ci0JCQlkaWFsb2cuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGUiKSk7Ci0JCQlQcmludGVyRGF0YSByZXN1bHQgPSBkaWFsb2cub3BlbiAoKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHJpbnREaWFsb2ciKSArIFRleHQuREVMSU1JVEVSKTsKLQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IiIgKyByZXN1bHR9KSArIFRleHQuREVMSU1JVEVSICsgVGV4dC5ERUxJTUlURVIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCWlmIChuYW1lLmVxdWFscyhDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVzc2FnZUJveCIpKSkgewotCQkJTWVzc2FnZUJveCBkaWFsb2cgPSBuZXcgTWVzc2FnZUJveCAoc2hlbGwsIHN0eWxlKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRXhhbXBsZV9zdHJpbmciKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikpOwotCQkJaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuICgpOwotCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNZXNzYWdlQm94IikgKyBUZXh0LkRFTElNSVRFUik7Ci0JCQkvKgotCQkJICogVGhlIHJlc3VsdGluZyBpbnRlZ2VyIGRlcGVuZHMgb24gdGhlIG9yaWdpbmFsCi0JCQkgKiBkaWFsb2cgc3R5bGUuICBEZWNvZGUgdGhlIHJlc3VsdCBhbmQgZGlzcGxheSBpdC4KLQkJCSAqLwotCQkJc3dpdGNoIChyZXN1bHQpIHsKLQkJCQljYXNlIFNXVC5PSzoKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULk9LIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuWUVTOgotCQkJCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc3VsdCIsIG5ldyBTdHJpbmcgW10geyJTV1QuWUVTIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTk86Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5OTyJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULkNBTkNFTDoKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULkNBTkNFTCJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULkFCT1JUOiAKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULkFCT1JUIn0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUkVUUlk6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVzdWx0IiwgbmV3IFN0cmluZyBbXSB7IlNXVC5SRVRSWSJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULklHTk9SRToKLQkJCQkJdGV4dFdpZGdldC5hcHBlbmQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiU1dULklHTk9SRSJ9KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRleHRXaWRnZXQuYXBwZW5kKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXN1bHQiLCBuZXcgU3RyaW5nIFtdIHsiIiArIHJlc3VsdH0pKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQl0ZXh0V2lkZ2V0LmFwcGVuZCAoVGV4dC5ERUxJTUlURVIgKyBUZXh0LkRFTElNSVRFUik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgIkNvbnRyb2wiIGdyb3VwLiAgVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gIEl0IGNvbnNpc3RzIG9mIHRoZQotCQkgKiBzdHlsZSBncm91cCwgdGhlIGRpc3BsYXkgZ3JvdXAgYW5kIHRoZSBzaXplIGdyb3VwLgotCQkgKi8JCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dD0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQljb250cm9sR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmFtZXRlcnMiKSk7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGUgYSBncm91cCB0byBob2xkIHRoZSBkaWFsb2cgc3R5bGUgY29tYm8gYm94IGFuZAotCQkgKiBjcmVhdGUgZGlhbG9nIGJ1dHRvbi4KLQkJICovCi0JCWRpYWxvZ1N0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlkaWFsb2dTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRpYWxvZ1N0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQlkaWFsb2dTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaWFsb2dfVHlwZSIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjb21ibyAqLwotCQlTdHJpbmcgW10gc3RyaW5ncyA9IHsKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvckRpYWxvZyIpLCAKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaXJlY3RvcnlEaWFsb2ciKSwKLQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxlRGlhbG9nIiksCi0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udERpYWxvZyIpLAotCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByaW50RGlhbG9nIiksCi0JCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVzc2FnZUJveCIpLAotCQl9OwotCQlkaWFsb2dDb21ibyA9IG5ldyBDb21ibyAoZGlhbG9nU3R5bGVHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWRpYWxvZ0NvbWJvLnNldEl0ZW1zIChzdHJpbmdzKTsKLQkJZGlhbG9nQ29tYm8uc2V0VGV4dCAoc3RyaW5ncyBbMF0pOwotCQlkaWFsb2dDb21iby5zZXRWaXNpYmxlSXRlbUNvdW50KHN0cmluZ3MubGVuZ3RoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBjcmVhdGUgZGlhbG9nIGJ1dHRvbiAqLwotCQljcmVhdGVCdXR0b24gPSBuZXcgQnV0dG9uKGRpYWxvZ1N0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJY3JlYXRlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDcmVhdGVfRGlhbG9nIikpOwotCQljcmVhdGVCdXR0b24uc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdmFyaW91cyBkaWFsb2cgYnV0dG9uIHN0eWxlIGNvbnRyb2xzICovCi0JCUdyb3VwIGJ1dHRvblN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlidXR0b25TdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlidXR0b25TdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlidXR0b25TdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCdXR0b25fU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGJ1dHRvbiBzdHlsZSBidXR0b25zICovCi0JCW9rQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJb2tCdXR0b24uc2V0VGV4dCAoIlNXVC5PSyIpOwotCQljYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljYW5jZWxCdXR0b24uc2V0VGV4dCAoIlNXVC5DQU5DRUwiKTsKLQkJeWVzQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJeWVzQnV0dG9uLnNldFRleHQgKCJTV1QuWUVTIik7Ci0JCW5vQnV0dG9uID0gbmV3IEJ1dHRvbiAoYnV0dG9uU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9CdXR0b24uc2V0VGV4dCAoIlNXVC5OTyIpOwotCQlyZXRyeUJ1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJldHJ5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVUUlkiKTsKLQkJYWJvcnRCdXR0b24gPSBuZXcgQnV0dG9uIChidXR0b25TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlhYm9ydEJ1dHRvbi5zZXRUZXh0ICgiU1dULkFCT1JUIik7Ci0JCWlnbm9yZUJ1dHRvbiA9IG5ldyBCdXR0b24gKGJ1dHRvblN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWlnbm9yZUJ1dHRvbi5zZXRUZXh0ICgiU1dULklHTk9SRSIpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGljb24gc3R5bGUgY29udHJvbHMgKi8KLQkJR3JvdXAgaWNvblN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlpY29uU3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaWNvblN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCWljb25TdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJY29uX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBpY29uIHN0eWxlIGJ1dHRvbnMgKi8KLQkJaWNvbkVycm9yQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25FcnJvckJ1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fRVJST1IiKTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25JbmZvcm1hdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fSU5GT1JNQVRJT04iKTsKLQkJaWNvblF1ZXN0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWljb25RdWVzdGlvbkJ1dHRvbi5zZXRUZXh0ICgiU1dULklDT05fUVVFU1RJT04iKTsKLQkJaWNvbldhcm5pbmdCdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbldhcm5pbmdCdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX1dBUk5JTkciKTsKLQkJaWNvbldvcmtpbmdCdXR0b24gPSBuZXcgQnV0dG9uIChpY29uU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbldvcmtpbmdCdXR0b24uc2V0VGV4dCAoIlNXVC5JQ09OX1dPUktJTkciKTsKLQkJbm9JY29uQnV0dG9uID0gbmV3IEJ1dHRvbiAoaWNvblN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW5vSWNvbkJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9fSWNvbiIpKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbW9kYWwgc3R5bGUgY29udHJvbHMgKi8KLQkJR3JvdXAgbW9kYWxTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbW9kYWxTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQltb2RhbFN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW9kYWxfU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1vZGFsIHN0eWxlIGJ1dHRvbnMgKi8KLQkJcHJpbWFyeU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmltYXJ5TW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5QUklNQVJZX01PREFMIik7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWFwcGxpY2F0aW9uTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5BUFBMSUNBVElPTl9NT0RBTCIpOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc3lzdGVtTW9kYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5TWVNURU1fTU9EQUwiKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBmaWxlIGRpYWxvZyBzdHlsZSBjb250cm9scyAqLwotCQlHcm91cCBmaWxlRGlhbG9nU3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWZpbGVEaWFsb2dTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlmaWxlRGlhbG9nU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJZmlsZURpYWxvZ1N0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVfRGlhbG9nX1N0eWxlcyIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBmaWxlIGRpYWxvZyBzdHlsZSBidXR0b25zICovCi0JCW9wZW5CdXR0b24gPSBuZXcgQnV0dG9uKGZpbGVEaWFsb2dTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlvcGVuQnV0dG9uLnNldFRleHQoIlNXVC5PUEVOIik7Ci0JCXNhdmVCdXR0b24gPSBuZXcgQnV0dG9uIChmaWxlRGlhbG9nU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2F2ZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNBVkUiKTsKLQkJbXVsdGlCdXR0b24gPSBuZXcgQnV0dG9uKGZpbGVEaWFsb2dTdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQltdWx0aUJ1dHRvbi5zZXRUZXh0KCJTV1QuTVVMVEkiKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBvcmllbnRhdGlvbiBncm91cCAqLwotCQlpZiAoUlRMX1NVUFBPUlRfRU5BQkxFKSB7Ci0JCQljcmVhdGVPcmllbnRhdGlvbkdyb3VwKCk7Ci0JCX0KLQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWRpYWxvZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlkaWFsb2dTZWxlY3RlZCAoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJY3JlYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQljcmVhdGVCdXR0b25TZWxlY3RlZCAoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uU3R5bGVMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWJ1dHRvblN0eWxlU2VsZWN0ZWQgKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQkJb2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQljYW5jZWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQl5ZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQlub0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoYnV0dG9uU3R5bGVMaXN0ZW5lcik7Ci0JCXJldHJ5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChidXR0b25TdHlsZUxpc3RlbmVyKTsKLQkJYWJvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQlpZ25vcmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGJ1dHRvblN0eWxlTGlzdGVuZXIpOwotCQotCQkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIHN0eWxlIGJ1dHRvbnMgKi8KLQkJb2tCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQljYW5jZWxCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQl5ZXNCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlub0J1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCXJldHJ5QnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJYWJvcnRCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpZ25vcmVCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uRXJyb3JCdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uUXVlc3Rpb25CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlpY29uV2FybmluZ0J1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCWljb25Xb3JraW5nQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJbm9JY29uQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJc2F2ZUJ1dHRvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCW9wZW5CdXR0b24uc2V0RW5hYmxlZCAoZmFsc2UpOwotCQlvcGVuQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCW11bHRpQnV0dG9uLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJbm9JY29uQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQotCQkvKgotCQkgKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgd2lkZ2V0IHRvIGRpc3BsYXkKLQkJICogdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkgdGhlIGV4YW1wbGUgZGlhbG9ncy4KLQkJICovCi0JCXJlc3VsdEdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJcmVzdWx0R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXJlc3VsdEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXJlc3VsdEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaWFsb2dfUmVzdWx0IikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyoKLQkJICogQ3JlYXRlIGEgbXVsdGkgbGluZWQsIHNjcm9sbGVkIHRleHQgd2lkZ2V0IGZvciBvdXRwdXQuCi0JCSAqLwotCQl0ZXh0V2lkZ2V0ID0gbmV3IFRleHQocmVzdWx0R3JvdXAsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGV4dFdpZGdldC5zZXRMYXlvdXREYXRhIChncmlkRGF0YSk7CQotCX0KLQkKLQkvKioKLQkgKiBUaGUgcGxhdGZvcm0gZGlhbG9ncyBkbyBub3QgaGF2ZSBTV1QgbGlzdGVuZXJzLgotCSAqLwotCXZvaWQgY3JlYXRlTGlzdGVuZXJzR3JvdXAgKCkgewotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIGRpYWxvZyB0eXBlIGNvbWJvIHNlbGVjdGlvbiBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBldmVudCB0aGUgc2VsZWN0aW9uIGV2ZW50Ci0JICovCi0Jdm9pZCBkaWFsb2dTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkKLQkJLyogRW5hYmxlL0Rpc2FibGUgdGhlIGJ1dHRvbnMgKi8KLQkJU3RyaW5nIG5hbWUgPSBkaWFsb2dDb21iby5nZXRUZXh0ICgpOwotCQlib29sZWFuIGlzTWVzc2FnZUJveCA9IG5hbWUuZXF1YWxzIChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVzc2FnZUJveCIpKTsKLQkJYm9vbGVhbiBpc0ZpbGVEaWFsb2cgPSBuYW1lLmVxdWFscyAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVEaWFsb2ciKSk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQl5ZXNCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJbm9CdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJcmV0cnlCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJYWJvcnRCdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWdub3JlQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWljb25FcnJvckJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24uc2V0RW5hYmxlZCAoaXNNZXNzYWdlQm94KTsKLQkJaWNvblF1ZXN0aW9uQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWljb25XYXJuaW5nQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCWljb25Xb3JraW5nQnV0dG9uLnNldEVuYWJsZWQgKGlzTWVzc2FnZUJveCk7Ci0JCW5vSWNvbkJ1dHRvbi5zZXRFbmFibGVkIChpc01lc3NhZ2VCb3gpOwotCQlzYXZlQnV0dG9uLnNldEVuYWJsZWQgKGlzRmlsZURpYWxvZyk7Ci0JCW9wZW5CdXR0b24uc2V0RW5hYmxlZCAoaXNGaWxlRGlhbG9nKTsKLQkJbXVsdGlCdXR0b24uc2V0RW5hYmxlZCAoaXNGaWxlRGlhbG9nKTsKLQkKLQkJLyogVW5zZWxlY3QgdGhlIGJ1dHRvbnMgKi8KLQkJaWYgKCFpc01lc3NhZ2VCb3gpIHsKLQkJCW9rQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJY2FuY2VsQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJeWVzQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJbm9CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlyZXRyeUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCWFib3J0QnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJaWdub3JlQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgWzBdOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJEaWFsb2ciOwotCX0KLQkKLQkvKioKLQkgKiBSZWNyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCWlmICh0ZXh0V2lkZ2V0ID09IG51bGwpIHsKLQkJCXN1cGVyLnJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCX0gCi0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvRXhwYW5kQmFyVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9FeHBhbmRCYXJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxYTI1ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9FeHBhbmRCYXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgRXhwYW5kQmFyVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUV4cGFuZEJhciBleHBhbmRCYXIxOwotCUdyb3VwIGV4cGFuZEJhckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8JCi0JQnV0dG9uIHZlcnRpY2FsQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUV4cGFuZEJhclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbGlzdCAqLwotCQlleHBhbmRCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZEJhckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlleHBhbmRCYXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlleHBhbmRCYXJHcm91cC5zZXRUZXh0ICgiRXhwYW5kQmFyIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVl9TQ1JPTEw7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCQkKLQkJZXhwYW5kQmFyMSA9IG5ldyBFeHBhbmRCYXIgKGV4cGFuZEJhckdyb3VwLCBzdHlsZSk7Ci0JCQotCQkvLyBGaXJzdCBpdGVtCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChleHBhbmRCYXIxLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQgKCkpOwotCQluZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5QVVNIKS5zZXRUZXh0KCJTV1QuUFVTSCIpOwotCQluZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5SQURJTykuc2V0VGV4dCgiU1dULlJBRElPIik7Ci0JCW5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULkNIRUNLKS5zZXRUZXh0KCJTV1QuQ0hFQ0siKTsKLQkJbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuVE9HR0xFKS5zZXRUZXh0KCJTV1QuVE9HR0xFIik7Ci0JCUV4cGFuZEl0ZW0gaXRlbSA9IG5ldyBFeHBhbmRJdGVtIChleHBhbmRCYXIxLCBTV1QuTk9ORSwgMCk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSXRlbTFfVGV4dCIpKTsKLQkJaXRlbS5zZXRIZWlnaHQoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0JCWl0ZW0uc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQlpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQkKLQkJLy8gU2Vjb25kIGl0ZW0KLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoZXhwYW5kQmFyMSwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0ICgyLCBmYWxzZSkpOwkKLQkJbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKSk7Ci0JCW5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU1dULklDT05fRVJST1IiKTsKLQkJbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKSk7Ci0JCW5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU1dULklDT05fSU5GT1JNQVRJT04iKTsKLQkJbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpKTsKLQkJbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJTV1QuSUNPTl9XQVJOSU5HIik7Ci0JCW5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9RVUVTVElPTikpOwotCQluZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlNXVC5JQ09OX1FVRVNUSU9OIik7Ci0JCWl0ZW0gPSBuZXcgRXhwYW5kSXRlbSAoZXhwYW5kQmFyMSwgU1dULk5PTkUsIDEpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkl0ZW0yX1RleHQiKSk7Ci0JCWl0ZW0uc2V0SGVpZ2h0KGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnkpOwotCQlpdGVtLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WX1NDUk9MTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7ZXhwYW5kQmFyMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiU3BhY2luZyJ9OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBzaG9ydCB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRTaG9ydFRhYlRleHQoKSB7Ci0JCXJldHVybiAiRUIiOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkV4cGFuZEJhciI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlXaWRnZXQgW10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlpZiAod2lkZ2V0cy5sZW5ndGggIT0gMCl7Ci0JCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5WX1NDUk9MTCkgIT0gMCk7Ci0JCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0dyb3VwVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Hcm91cFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU3MjUxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0dyb3VwVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBHcm91cFRhYiBleHRlbmRzIFRhYiB7Ci0JQnV0dG9uIHRpdGxlQnV0dG9uOwotCQotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JR3JvdXAgZ3JvdXAxOwotCUdyb3VwIGdyb3VwR3JvdXA7Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBzaGFkb3dFdGNoZWRJbkJ1dHRvbiwgc2hhZG93RXRjaGVkT3V0QnV0dG9uLCBzaGFkb3dJbkJ1dHRvbiwgc2hhZG93T3V0QnV0dG9uLCBzaGFkb3dOb25lQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCUdyb3VwVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJdGl0bGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQl0aXRsZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGVfVGV4dCIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJdGl0bGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFRpdGxlVGV4dCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgR3JvdXAgKi8KLQkJZ3JvdXBHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdyb3VwR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWdyb3VwR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJZ3JvdXBHcm91cC5zZXRUZXh0ICgiR3JvdXAiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaGFkb3dFdGNoZWRJbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfRVRDSEVEX0lOOwotCQlpZiAoc2hhZG93RXRjaGVkT3V0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19FVENIRURfT1VUOwotCQlpZiAoc2hhZG93SW5CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX0lOOwotCQlpZiAoc2hhZG93T3V0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19PVVQ7Ci0JCWlmIChzaGFkb3dOb25lQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19OT05FOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlncm91cDEgPSBuZXcgR3JvdXAgKGdyb3VwR3JvdXAsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc2hhZG93RXRjaGVkSW5CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dFdGNoZWRJbkJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19FVENIRURfSU4iKTsKLQkJc2hhZG93RXRjaGVkSW5CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlzaGFkb3dFdGNoZWRPdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzaGFkb3dFdGNoZWRPdXRCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfRVRDSEVEX09VVCIpOwotCQlzaGFkb3dJbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNoYWRvd0luQnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX0lOIik7Ci0JCXNoYWRvd091dEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19PVVQiKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfTk9ORSIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7Z3JvdXAxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkdyb3VwIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSB0ZXh0IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFRpdGxlVGV4dCAoKSB7Ci0JCWlmICh0aXRsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCWdyb3VwMS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGl0bGVfVGV4dCIpKTsKLQkJfSBlbHNlIHsKLQkJCWdyb3VwMS5zZXRUZXh0ICgiIik7Ci0JCX0KLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlzaGFkb3dFdGNoZWRJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0VUQ0hFRF9JTikgIT0gMCk7Ci0JCXNoYWRvd0V0Y2hlZE91dEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0VUQ0hFRF9PVVQpICE9IDApOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX0lOKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGdyb3VwMS5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKChncm91cDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX05PTkUpICE9IDApOwotCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgoZ3JvdXAxLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgc2V0VGl0bGVUZXh0ICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xhYmVsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MYWJlbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTY4ZWNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xhYmVsVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIExhYmVsVGFiIGV4dGVuZHMgQWxpZ25hYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUxhYmVsIGxhYmVsMSwgbGFiZWwyLCBsYWJlbDMsIGxhYmVsNCwgbGFiZWw1LCBsYWJlbDY7Ci0JR3JvdXAgdGV4dExhYmVsR3JvdXAsIGltYWdlTGFiZWxHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gd3JhcEJ1dHRvbiwgc2VwYXJhdG9yQnV0dG9uLCBob3Jpem9udGFsQnV0dG9uLCB2ZXJ0aWNhbEJ1dHRvbiwgc2hhZG93SW5CdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgc2hhZG93Tm9uZUJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JTGFiZWxUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgbGFiZWxzICovCi0JCXRleHRMYWJlbEdyb3VwID0gbmV3IEdyb3VwKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJdGV4dExhYmVsR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdGV4dExhYmVsR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRleHRfTGFiZWxzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIGxhYmVscyAqLwotCQlpbWFnZUxhYmVsR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULlNIQURPV19OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCQlpbWFnZUxhYmVsR3JvdXAuc2V0TGF5b3V0IChncmlkTGF5b3V0KTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJaW1hZ2VMYWJlbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlTGFiZWxHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VfTGFiZWxzIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKHNlcGFyYXRvckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TRVBBUkFUT1I7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKHNoYWRvd0luQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlNIQURPV19JTjsKLQkJaWYgKHNoYWRvd091dEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfT1VUOwotCQlpZiAoc2hhZG93Tm9uZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSEFET1dfTk9ORTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChsZWZ0QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkxFRlQ7Ci0JCWlmIChjZW50ZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0VOVEVSOwotCQlpZiAocmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxhYmVsMSA9IG5ldyBMYWJlbCAodGV4dExhYmVsR3JvdXAsIHN0eWxlKTsKLQkJbGFiZWwxLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZSIpKTsKLQkJbGFiZWwyID0gbmV3IExhYmVsICh0ZXh0TGFiZWxHcm91cCwgc3R5bGUpOwotCQlsYWJlbDIuc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHdvIikpOwotCQlsYWJlbDMgPSBuZXcgTGFiZWwgKHRleHRMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWlmICh3cmFwQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJbGFiZWwzLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJXcmFwX1RleHQiKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsYWJlbDMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRocmVlIikpOwotCQl9Ci0JCWxhYmVsNCA9IG5ldyBMYWJlbCAoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNC5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWxhYmVsNSA9IG5ldyBMYWJlbCAoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlsYWJlbDYgPSBuZXcgTGFiZWwoaW1hZ2VMYWJlbEdyb3VwLCBzdHlsZSk7Ci0JCWxhYmVsNi5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXdyYXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwQnV0dG9uLnNldFRleHQgKCJTV1QuV1JBUCIpOwotCQlzZXBhcmF0b3JCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzZXBhcmF0b3JCdXR0b24uc2V0VGV4dCAoIlNXVC5TRVBBUkFUT1IiKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQlHcm91cCBzdHlsZVN1Ykdyb3VwID0gbmV3IEdyb3VwIChzdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlU3ViR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNoYWRvd0luQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0VGV4dCAoIlNXVC5TSEFET1dfSU4iKTsKLQkJc2hhZG93T3V0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFRleHQgKCJTV1QuU0hBRE9XX09VVCIpOwotCQlzaGFkb3dOb25lQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVTdWJHcm91cCwgU1dULlJBRElPKTsKLQkJc2hhZG93Tm9uZUJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19OT05FIik7Ci0JCWJvcmRlckJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7bGFiZWwxLCBsYWJlbDIsIGxhYmVsMywgbGFiZWw0LCBsYWJlbDUsIGxhYmVsNn07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiVGV4dCIsICJUb29sVGlwVGV4dCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkxhYmVsIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRBbGlnbm1lbnQgKCkgewotCQlpbnQgYWxpZ25tZW50ID0gMDsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBhbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIGFsaWdubWVudCA9IFNXVC5SSUdIVDsKLQkJbGFiZWwxLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwyLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWwzLnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWw0LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWw1LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQkJbGFiZWw2LnNldEFsaWdubWVudCAoYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlib29sZWFuIGlzU2VwYXJhdG9yID0gKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5TRVBBUkFUT1IpICE9IDA7Ci0JCXdyYXBCdXR0b24uc2V0U2VsZWN0aW9uICghaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJbGVmdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULkxFRlQpICE9IDApOwotCQljZW50ZXJCdXR0b24uc2V0U2VsZWN0aW9uICghaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5DRU5URVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCFpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlJJR0hUKSAhPSAwKTsKLQkJc2hhZG93SW5CdXR0b24uc2V0U2VsZWN0aW9uIChpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19JTikgIT0gMCk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuU0hBRE9XX09VVCkgIT0gMCk7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0U2VsZWN0aW9uIChpc1NlcGFyYXRvciAmJiAobGFiZWwxLmdldFN0eWxlICgpICYgU1dULlNIQURPV19OT05FKSAhPSAwKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGlzU2VwYXJhdG9yICYmIChsYWJlbDEuZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoaXNTZXBhcmF0b3IgJiYgKGxhYmVsMS5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7CQkKLQkJd3JhcEJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQlsZWZ0QnV0dG9uLnNldEVuYWJsZWQgKCFpc1NlcGFyYXRvcik7Ci0JCWNlbnRlckJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQlyaWdodEJ1dHRvbi5zZXRFbmFibGVkICghaXNTZXBhcmF0b3IpOwotCQlzaGFkb3dJbkJ1dHRvbi5zZXRFbmFibGVkIChpc1NlcGFyYXRvcik7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRFbmFibGVkIChpc1NlcGFyYXRvcik7Ci0JCXNoYWRvd05vbmVCdXR0b24uc2V0RW5hYmxlZCAoaXNTZXBhcmF0b3IpOwotCQlob3Jpem9udGFsQnV0dG9uLnNldEVuYWJsZWQgKGlzU2VwYXJhdG9yKTsKLQkJdmVydGljYWxCdXR0b24uc2V0RW5hYmxlZCAoaXNTZXBhcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpbmtUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpbmtUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiMDFiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9MaW5rVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgTGlua1RhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlMaW5rIGxpbmsxOwotCUdyb3VwIGxpbmtHcm91cDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JTGlua1RhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbGlzdCAqLwotCQlsaW5rR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlsaW5rR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWxpbmtHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlsaW5rR3JvdXAuc2V0VGV4dCAoIkxpbmsiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwkJCi0JCXRyeSB7Ci0JCQlsaW5rMSA9IG5ldyBMaW5rIChsaW5rR3JvdXAsIHN0eWxlKTsKLQkJCWxpbmsxLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5rVGV4dCIpKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJLy8gdGVtcG9yYXJ5IGNvZGUgZm9yIHBob3RvbgotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGxpbmtHcm91cCwgU1dULkNFTlRFUiB8IFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQgKCJMaW5rIHdpZGdldCBub3Qgc3Vwb3J0ZWQiKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRUZXh0KCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLS8vCQkgdGVtcG9yYXJ5IGNvZGUgZm9yIHBob3RvbgotCQlpZiAobGluazEgIT0gbnVsbCkgcmV0dXJuIG5ldyBXaWRnZXQgW10ge2xpbmsxfTsKLQkJcmV0dXJuIG5ldyBXaWRnZXRbXSB7fTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJUZXh0IiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkxpbmsiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlzdFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvTGlzdFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2VhY2E5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL0xpc3RUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1jbGFzcyBMaXN0VGFiIGV4dGVuZHMgU2Nyb2xsYWJsZVRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCUxpc3QgbGlzdDE7Ci0JR3JvdXAgbGlzdEdyb3VwOwotCQotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGExID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNCIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNyIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfOCIpfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlMaXN0VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBsaXN0ICovCi0JCWxpc3RHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbGlzdEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWxpc3RHcm91cC5zZXRUZXh0ICgiTGlzdCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCWxpc3QxID0gbmV3IExpc3QgKGxpc3RHcm91cCwgc3R5bGUpOwotCQlsaXN0MS5zZXRJdGVtcyAoTGlzdERhdGExKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7bGlzdDF9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ikl0ZW1zIiwgIlNlbGVjdGlvbiIsICJUb29sVGlwVGV4dCIsICJUb3BJbmRleCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkxpc3QiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL01lbnVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL01lbnVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxNTc5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9NZW51VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBNZW51VGFiIGV4dGVuZHMgVGFiIHsJCi0JLyogV2lkZ2V0cyBhZGRlZCB0byB0aGUgIk1lbnUgU3R5bGUiLCAiTWVudUl0ZW0gU3R5bGUiIGFuZCAiT3RoZXIiIGdyb3VwcyAqLwotCUJ1dHRvbiBiYXJCdXR0b24sIGRyb3BEb3duQnV0dG9uLCBwb3BVcEJ1dHRvbiwgbm9SYWRpb0dyb3VwQnV0dG9uLCBsZWZ0VG9SaWdodEJ1dHRvbiwgcmlnaHRUb0xlZnRCdXR0b247Ci0JQnV0dG9uIGNoZWNrQnV0dG9uLCBjYXNjYWRlQnV0dG9uLCBwdXNoQnV0dG9uLCByYWRpb0J1dHRvbiwgc2VwYXJhdG9yQnV0dG9uOwotCUJ1dHRvbiBpbWFnZXNCdXR0b24sIGFjY2VsZXJhdG9yc0J1dHRvbiwgbW5lbW9uaWNzQnV0dG9uLCBzdWJNZW51QnV0dG9uLCBzdWJTdWJNZW51QnV0dG9uOwotCUJ1dHRvbiBjcmVhdGVCdXR0b24sIGNsb3NlQWxsQnV0dG9uOwotCUdyb3VwIG1lbnVJdGVtU3R5bGVHcm91cDsKLQotCS8qIFZhcmlhYmxlcyB1c2VkIHRvIHRyYWNrIHRoZSBvcGVuIHNoZWxscyAqLwotCWludCBzaGVsbENvdW50ID0gMDsKLQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGwgWzRdOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlNZW51VGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbGwgdGhlIGV4YW1wbGUgc2hlbGxzLgotCSAqLwotCXZvaWQgY2xvc2VBbGxTaGVsbHMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHNoZWxsQ291bnQ7IGkrKykgewotCQkJaWYgKHNoZWxsc1tpXSAhPSBudWxsICYgIXNoZWxscyBbaV0uaXNEaXNwb3NlZCAoKSkgewotCQkJCXNoZWxscyBbaV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXNoZWxsQ291bnQgPSAwOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIENyZWF0ZSBidXR0b24gc2VsZWN0aW9uIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGV2ZW50IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQotCQkvKgotCQkgKiBSZW1lbWJlciB0aGUgZXhhbXBsZSBzaGVsbHMgc28gdGhleQotCQkgKiBjYW4gYmUgZGlzcG9zZWQgYnkgdGhlIHVzZXIuCi0JCSAqLwotCQlpZiAoc2hlbGxDb3VudCA+PSBzaGVsbHMubGVuZ3RoKSB7Ci0JCQlTaGVsbCBbXSBuZXdTaGVsbHMgPSBuZXcgU2hlbGwgW3NoZWxscy5sZW5ndGggKyA0XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkgKHNoZWxscywgMCwgbmV3U2hlbGxzLCAwLCBzaGVsbHMubGVuZ3RoKTsKLQkJCXNoZWxscyA9IG5ld1NoZWxsczsKLQkJfQotCQotCQlpbnQgb3JpZW50YXRpb24gPSAwOwotCQlpZiAobGVmdFRvUmlnaHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIG9yaWVudGF0aW9uIHw9IFNXVC5MRUZUX1RPX1JJR0hUOwotCQlpZiAocmlnaHRUb0xlZnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIG9yaWVudGF0aW9uIHw9IFNXVC5SSUdIVF9UT19MRUZUOwotCQlpbnQgcmFkaW9CZWhhdmlvciA9IDA7Ci0JCWlmIChub1JhZGlvR3JvdXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHJhZGlvQmVoYXZpb3IgfD0gU1dULk5PX1JBRElPX0dST1VQOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBzaGVsbCBhbmQgbWVudShzKSAqLwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoU1dULlNIRUxMX1RSSU0gfCBvcmllbnRhdGlvbik7Ci0JCXNoZWxscyBbc2hlbGxDb3VudF0gPSBzaGVsbDsKLQkJaWYgKGJhckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCS8qIENyZWF0ZSBtZW51IGJhci4gKi8KLQkJCU1lbnUgbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSIHwgcmFkaW9CZWhhdmlvcik7Ci0JCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQkJaG9va0xpc3RlbmVycyhtZW51QmFyKTsKLQotCQkJaWYgKGRyb3BEb3duQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIGNhc2NhZGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkvKiBDcmVhdGUgY2FzY2FkZSBidXR0b24gYW5kIGRyb3AtZG93biBtZW51IGluIG1lbnUgYmFyLiAqLwotCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIkNhc2NhZGUiKSk7Ci0JCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lPcGVuRm9sZGVyXSk7Ci0JCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJCQlNZW51IGRyb3BEb3duTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOIHwgcmFkaW9CZWhhdmlvcik7Ci0JCQkJaXRlbS5zZXRNZW51KGRyb3BEb3duTWVudSk7Ci0JCQkJaG9va0xpc3RlbmVycyhkcm9wRG93bk1lbnUpOwotCQotCQkJCS8qIENyZWF0ZSB2YXJpb3VzIG1lbnUgaXRlbXMsIGRlcGVuZGluZyBvbiBzZWxlY3Rpb25zLiAqLwotCQkJCWNyZWF0ZU1lbnVJdGVtcyhkcm9wRG93bk1lbnUsIHN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uKCksIHN1YlN1Yk1lbnVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocG9wVXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCS8qIENyZWF0ZSBwb3AtdXAgbWVudS4gKi8KLQkJCU1lbnUgcG9wVXBNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5QT1BfVVAgfCByYWRpb0JlaGF2aW9yKTsKLQkJCXNoZWxsLnNldE1lbnUocG9wVXBNZW51KTsKLQkJCWhvb2tMaXN0ZW5lcnMocG9wVXBNZW51KTsKLQotCQkJLyogQ3JlYXRlIHZhcmlvdXMgbWVudSBpdGVtcywgZGVwZW5kaW5nIG9uIHNlbGVjdGlvbnMuICovCi0JCQljcmVhdGVNZW51SXRlbXMocG9wVXBNZW51LCBzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbigpLCBzdWJTdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJLyogU2V0IHRoZSBzaXplLCB0aXRsZSBhbmQgb3BlbiB0aGUgc2hlbGwuICovCi0JCXNoZWxsLnNldFNpemUgKDMwMCwgMTAwKTsKLQkJc2hlbGwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIikgKyBzaGVsbENvdW50KTsKLQkJc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQllLmdjLmRyYXdTdHJpbmcoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBvcHVwTWVudUhlcmUiKSwgMjAsIDIwKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXNoZWxsQ291bnQrKzsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgIkNvbnRyb2wiIGdyb3VwLiAgVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gIEZvciBNZW51VGFiLCBpdCBjb25zaXN0cyBvZgotCQkgKiB0aGUgTWVudSBzdHlsZSBncm91cCwgdGhlIE1lbnVJdGVtIHN0eWxlIGdyb3VwIGFuZCB0aGUgJ290aGVyJyBncm91cC4KLQkJICovCQkKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJY29udHJvbEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIG1lbnUgc3R5bGUgY29udHJvbHMgKi8KLQkJc3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXN0eWxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVfU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIG1lbnUgaXRlbSBzdHlsZSBjb250cm9scyAqLwotCQltZW51SXRlbVN0eWxlR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQltZW51SXRlbVN0eWxlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW1lbnVJdGVtU3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQltZW51SXRlbVN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX1N0eWxlcyIpKTsKLQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlICdvdGhlcicgY29udHJvbHMgKi8KLQkJb3RoZXJHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCW90aGVyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJb3RoZXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3RoZXIiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgbWVudSBzdHlsZSBidXR0b25zICovCi0JCWJhckJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJhckJ1dHRvbi5zZXRUZXh0ICgiU1dULkJBUiIpOwotCQlkcm9wRG93bkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFRleHQgKCJTV1QuRFJPUF9ET1dOIik7Ci0JCXBvcFVwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcG9wVXBCdXR0b24uc2V0VGV4dCAoIlNXVC5QT1BfVVAiKTsKLQkJbm9SYWRpb0dyb3VwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9SYWRpb0dyb3VwQnV0dG9uLnNldFRleHQgKCJTV1QuTk9fUkFESU9fR1JPVVAiKTsKLQkJbGVmdFRvUmlnaHRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlsZWZ0VG9SaWdodEJ1dHRvbi5zZXRUZXh0ICgiU1dULkxFRlRfVE9fUklHSFQiKTsKLQkJbGVmdFRvUmlnaHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyaWdodFRvTGVmdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0VG9MZWZ0QnV0dG9uLnNldFRleHQgKCJTV1QuUklHSFRfVE9fTEVGVCIpOwotCQotCQkvKiBDcmVhdGUgdGhlIG1lbnUgaXRlbSBzdHlsZSBidXR0b25zICovCi0JCWNhc2NhZGVCdXR0b24gPSBuZXcgQnV0dG9uIChtZW51SXRlbVN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNhc2NhZGVCdXR0b24uc2V0VGV4dCAoIlNXVC5DQVNDQURFIik7Ci0JCWNoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbiAobWVudUl0ZW1TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCXB1c2hCdXR0b24gPSBuZXcgQnV0dG9uIChtZW51SXRlbVN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXB1c2hCdXR0b24uc2V0VGV4dCAoIlNXVC5QVVNIIik7Ci0JCXJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbiAobWVudUl0ZW1TdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0ICgiU1dULlJBRElPIik7Ci0JCXNlcGFyYXRvckJ1dHRvbiA9IG5ldyBCdXR0b24gKG1lbnVJdGVtU3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc2VwYXJhdG9yQnV0dG9uLnNldFRleHQgKCJTV1QuU0VQQVJBVE9SIik7Ci0JCQotCQkvKiBDcmVhdGUgdGhlICdvdGhlcicgYnV0dG9ucyAqLwotCQlpbWFnZXNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbWFnZXNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlcyIpKTsKLQkJYWNjZWxlcmF0b3JzQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJYWNjZWxlcmF0b3JzQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBY2NlbGVyYXRvcnMiKSk7Ci0JCW1uZW1vbmljc0J1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1uZW1vbmljc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW5lbW9uaWNzIikpOwotCQlzdWJNZW51QnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc3ViTWVudUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3ViTWVudSIpKTsKLQkJc3ViU3ViTWVudUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXN1YlN1Yk1lbnVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN1YlN1Yk1lbnUiKSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlICJjcmVhdGUiIGFuZCAiY2xvc2VBbGwiIGJ1dHRvbnMgKGFuZCBhICdmaWxsZXInIGxhYmVsIHRvIHBsYWNlIHRoZW0pICovCi0JCW5ldyBMYWJlbChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY3JlYXRlQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3JlYXRlX1NoZWxsIikpOwotCQljbG9zZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQljbG9zZUFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWNsb3NlQWxsQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDbG9zZV9BbGxfU2hlbGxzIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQljcmVhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3JlYXRlQnV0dG9uU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQljbG9zZUFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljbG9zZUFsbFNoZWxscyAoKTsKLQkJCX0KLQkJfSk7Ci0JCXN1Yk1lbnVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3ViU3ViTWVudUJ1dHRvbi5zZXRFbmFibGVkIChzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgKi8KLQkJYmFyQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWRyb3BEb3duQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCXBvcFVwQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWNhc2NhZGVCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJcHVzaEJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlyYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCQlzZXBhcmF0b3JCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJc3ViU3ViTWVudUJ1dHRvbi5zZXRFbmFibGVkIChzdWJNZW51QnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qIENyZWF0ZSB2YXJpb3VzIG1lbnUgaXRlbXMsIGRlcGVuZGluZyBvbiBzZWxlY3Rpb25zLiAqLwotCXZvaWQgY3JlYXRlTWVudUl0ZW1zKE1lbnUgbWVudSwgYm9vbGVhbiBjcmVhdGVTdWJNZW51LCBib29sZWFuIGNyZWF0ZVN1YlN1Yk1lbnUpIHsKLQkJTWVudUl0ZW0gaXRlbTsKLQkJaWYgKHB1c2hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0KGdldE1lbnVJdGVtVGV4dCgiUHVzaCIpKTsKLQkJCWlmIChhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyBTV1QuTU9EMiArICdQJyk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJfQotCQkKLQkJaWYgKHNlcGFyYXRvckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQl9Ci0JCQotCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIkNoZWNrIikpOwotCQkJaWYgKGFjY2VsZXJhdG9yc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArIFNXVC5NT0QyICsgJ0MnKTsKLQkJCWlmIChpbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQkJaG9va0xpc3RlbmVycyhpdGVtKTsKLQkJfQotCQkJCQotCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlJBRElPKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIjFSYWRpbyIpKTsKLQkJCWlmIChhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyBTV1QuTU9EMiArICcxJyk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQkJaXRlbS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlob29rTGlzdGVuZXJzKGl0ZW0pOwotCi0JCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5SQURJTyk7Ci0JCQlpdGVtLnNldFRleHQoZ2V0TWVudUl0ZW1UZXh0KCIyUmFkaW8iKSk7Ci0JCQlpZiAoYWNjZWxlcmF0b3JzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgU1dULk1PRDIgKyAnMicpOwotCQkJaWYgKGltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgaXRlbS5zZXRJbWFnZShpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0JCX0KLQotCQlpZiAoY3JlYXRlU3ViTWVudSAmJiBjYXNjYWRlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvKiBDcmVhdGUgY2FzY2FkZSBidXR0b24gYW5kIGRyb3AtZG93biBtZW51IGZvciB0aGUgc3ViLW1lbnUuICovCi0JCQlpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQkJCWl0ZW0uc2V0VGV4dChnZXRNZW51SXRlbVRleHQoIkNhc2NhZGUiKSk7Ci0JCQlpZiAoaW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJCWhvb2tMaXN0ZW5lcnMoaXRlbSk7Ci0JCQlNZW51IHN1Yk1lbnUgPSBuZXcgTWVudShtZW51LmdldFNoZWxsKCksIFNXVC5EUk9QX0RPV04pOwotCQkJaXRlbS5zZXRNZW51KHN1Yk1lbnUpOwotCQkJaG9va0xpc3RlbmVycyhzdWJNZW51KTsKLQkJCQotCQkJY3JlYXRlTWVudUl0ZW1zKHN1Yk1lbnUsIGNyZWF0ZVN1YlN1Yk1lbnUsIGZhbHNlKTsKLQkJfQotCX0KLQkKLQlTdHJpbmcgZ2V0TWVudUl0ZW1UZXh0KFN0cmluZyBpdGVtKSB7Ci0JCWJvb2xlYW4gY2FzY2FkZSA9IGl0ZW0uZXF1YWxzKCJDYXNjYWRlIik7Ci0JCWJvb2xlYW4gbW5lbW9uaWMgPSBtbmVtb25pY3NCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gYWNjZWxlcmF0b3IgPSBhY2NlbGVyYXRvcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWNoYXIgYWNjZWxlcmF0b3JLZXkgPSBpdGVtLmNoYXJBdCgwKTsKLQkJaWYgKG1uZW1vbmljICYmIGFjY2VsZXJhdG9yICYmICFjYXNjYWRlKSB7Ci0JCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSArICJXaXRoTW5lbW9uaWMiKSArICJcdEN0cmwrU2hpZnQrIiArIGFjY2VsZXJhdG9yS2V5OwotCQl9Ci0JCWlmIChhY2NlbGVyYXRvciAmJiAhY2FzY2FkZSkgewotCQkJcmV0dXJuIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKGl0ZW0pICsgIlx0Q3RybCtTaGlmdCsiICsgYWNjZWxlcmF0b3JLZXk7Ci0JCX0KLQkJaWYgKG1uZW1vbmljKSB7Ci0JCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSArICJXaXRoTW5lbW9uaWMiKTsKLQkJfQotCQlyZXR1cm4gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaXRlbSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIk1lbnUiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Byb2dyZXNzQmFyVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Qcm9ncmVzc0JhclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZThjYjUxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Byb2dyZXNzQmFyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIFByb2dyZXNzQmFyVGFiIGV4dGVuZHMgUmFuZ2VUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXIxOwotCUdyb3VwIHByb2dyZXNzQmFyR3JvdXA7Ci0KLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHNtb290aEJ1dHRvbjsKLQlCdXR0b24gaW5kZXRlcm1pbmF0ZUJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlQcm9ncmVzc0JhclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBwcm9ncmVzcyBiYXIgKi8KLQkJcHJvZ3Jlc3NCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXByb2dyZXNzQmFyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXByb2dyZXNzQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJcHJvZ3Jlc3NCYXJHcm91cC5zZXRUZXh0ICgiUHJvZ3Jlc3NCYXIiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhPUklaT05UQUw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WRVJUSUNBTDsKLQkJaWYgKHNtb290aEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TTU9PVEg7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoaW5kZXRlcm1pbmF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5JTkRFVEVSTUlOQVRFOwotCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXByb2dyZXNzQmFyMSA9IG5ldyBQcm9ncmVzc0JhciAocHJvZ3Jlc3NCYXJHcm91cCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc21vb3RoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc21vb3RoQnV0dG9uLnNldFRleHQgKCJTV1QuU01PT1RIIik7Ci0JCWluZGV0ZXJtaW5hdGVCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlpbmRldGVybWluYXRlQnV0dG9uLnNldFRleHQgKCJTV1QuSU5ERVRFUk1JTkFURSIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3Byb2dyZXNzQmFyMX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTZWxlY3Rpb24iLCAiVG9vbFRpcFRleHQifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG9ydCB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRTaG9ydFRhYlRleHQoKSB7Ci0JCXJldHVybiAiUEIiOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlByb2dyZXNzQmFyIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWlmIChpbmRldGVybWluYXRlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCQltaW5pbXVtU3Bpbm5lci5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCQltYXhpbXVtU3Bpbm5lci5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25TcGlubmVyLnNldEVuYWJsZWQgKHRydWUpOwotCQkJbWluaW11bVNwaW5uZXIuc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCQltYXhpbXVtU3Bpbm5lci5zZXRFbmFibGVkICh0cnVlKTsKLQkJfQotCQlzbW9vdGhCdXR0b24uc2V0U2VsZWN0aW9uICgocHJvZ3Jlc3NCYXIxLmdldFN0eWxlICgpICYgU1dULlNNT09USCkgIT0gMCk7Ci0JCWluZGV0ZXJtaW5hdGVCdXR0b24uc2V0U2VsZWN0aW9uICgocHJvZ3Jlc3NCYXIxLmdldFN0eWxlICgpICYgU1dULklOREVURVJNSU5BVEUpICE9IDApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWF4aW11bSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRNYXhpbXVtICgpIHsKLQkJcmV0dXJuIHByb2dyZXNzQmFyMS5nZXRNYXhpbXVtKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRNaW5pbXVtICgpIHsKLQkJcmV0dXJuIHByb2dyZXNzQmFyMS5nZXRNaW5pbXVtKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFNlbGVjdGlvbiAoKSB7Ci0JCXJldHVybiBwcm9ncmVzc0JhcjEuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWF4aW11bSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNYXhpbXVtICgpIHsKLQkJcHJvZ3Jlc3NCYXIxLnNldE1heGltdW0gKG1heGltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JCXVwZGF0ZVNwaW5uZXJzICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWluaW11bSAoKSB7Ci0JCXByb2dyZXNzQmFyMS5zZXRNaW5pbXVtIChtaW5pbXVtU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCQl1cGRhdGVTcGlubmVycyAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZWxlY3Rpb24gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0U2VsZWN0aW9uICgpIHsKLQkJcHJvZ3Jlc3NCYXIxLnNldFNlbGVjdGlvbiAoc2VsZWN0aW9uU3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCQl1cGRhdGVTcGlubmVycyAoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0cyB0byByZWZsZWN0IHRoZSBhY3R1YWwgdmFsdWUgc2V0IAotCSAqIG9uIHRoZSAiRXhhbXBsZSIgd2lkZ2V0LgotCSAqLwotCXZvaWQgdXBkYXRlU3Bpbm5lcnMgKCkgewotCQltaW5pbXVtU3Bpbm5lci5zZXRTZWxlY3Rpb24gKHByb2dyZXNzQmFyMS5nZXRNaW5pbXVtICgpKTsKLQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRTZWxlY3Rpb24gKHByb2dyZXNzQmFyMS5nZXRTZWxlY3Rpb24gKCkpOwotCQltYXhpbXVtU3Bpbm5lci5zZXRTZWxlY3Rpb24gKHByb2dyZXNzQmFyMS5nZXRNYXhpbXVtICgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9SYW5nZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvUmFuZ2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmIyOTJhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9SYW5nZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotYWJzdHJhY3QgY2xhc3MgUmFuZ2VUYWIgZXh0ZW5kcyBUYWIgewotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b247Ci0JYm9vbGVhbiBvcmllbnRhdGlvbkJ1dHRvbnMgPSB0cnVlOwotCi0JLyogU2NhbGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JU3Bpbm5lciBtaW5pbXVtU3Bpbm5lciwgc2VsZWN0aW9uU3Bpbm5lciwgbWF4aW11bVNwaW5uZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JUmFuZ2VUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENyZWF0ZSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJY3JlYXRlTWluaW11bUdyb3VwICgpOwotCQljcmVhdGVNYXhpbXVtR3JvdXAgKCk7Ci0JCWNyZWF0ZVNlbGVjdGlvbkdyb3VwICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIG1heGltdW0KLQkgKiBhdHRyaWJ1dGUgb2YgdGhlIGV4YW1wbGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgY3JlYXRlTWF4aW11bUdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIG1heGltdW1Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1heGltdW1Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbWF4aW11bUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNYXhpbXVtIikpOwotCQltYXhpbXVtR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkKLQkJLyogQ3JlYXRlIGEgU3Bpbm5lciB3aWRnZXQgKi8KLQkJbWF4aW11bVNwaW5uZXIgPSBuZXcgU3Bpbm5lciAobWF4aW11bUdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0TWF4aW11bSgpKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJbWF4aW11bVNwaW5uZXIuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJbWF4aW11bVNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0TWF4aW11bSAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgbWluaW11bQotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVNaW5pbXVtR3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgbWluaW11bUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWluaW11bUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQltaW5pbXVtR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1pbmltdW0iKSk7Ci0JCW1pbmltdW1Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgYSBTcGlubmVyIHdpZGdldCAqLwotCQltaW5pbXVtU3Bpbm5lciA9IG5ldyBTcGlubmVyIChtaW5pbXVtR3JvdXAsIFNXVC5CT1JERVIpOwotCQltaW5pbXVtU3Bpbm5lci5zZXRNYXhpbXVtICgxMDAwMDApOwotCQltaW5pbXVtU3Bpbm5lci5zZXRTZWxlY3Rpb24oZ2V0RGVmYXVsdE1pbmltdW0oKSk7Ci0JCW1pbmltdW1TcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCW1pbmltdW1TcGlubmVyLnNldEluY3JlbWVudCAoMSk7Ci0JCW1pbmltdW1TcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJbWluaW11bVNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldE1pbmltdW0gKCk7Ci0JCQl9Ci0JCX0pOwotCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIHNlbGVjdGlvbgotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVTZWxlY3Rpb25Hcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBzZWxlY3Rpb25Hcm91cCA9IG5ldyBHcm91cChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc2VsZWN0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKTsKLQkJc2VsZWN0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNlbGVjdGlvbkdyb3VwLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNlbGVjdGlvbiIpKTsKLQkKLQkJLyogQ3JlYXRlIGEgU3Bpbm5lciB3aWRnZXQgKi8KLQkJc2VsZWN0aW9uU3Bpbm5lciA9IG5ldyBTcGlubmVyIChzZWxlY3Rpb25Hcm91cCwgU1dULkJPUkRFUik7Ci0JCXNlbGVjdGlvblNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRTZWxlY3Rpb24gKGdldERlZmF1bHRTZWxlY3Rpb24oKSk7Ci0JCXNlbGVjdGlvblNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJc2VsZWN0aW9uU3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQlzZWxlY3Rpb25TcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJc2VsZWN0aW9uU3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0U2VsZWN0aW9uICgpOwotCQkJfQotCQl9KTsKLQkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWlmIChvcmllbnRhdGlvbkJ1dHRvbnMpIHsKLQkJCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJfQotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXNldFdpZGdldE1pbmltdW0gKCk7Ci0JCQlzZXRXaWRnZXRNYXhpbXVtICgpOwotCQkJc2V0V2lkZ2V0U2VsZWN0aW9uICgpOwotCQl9Ci0JCVdpZGdldCBbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWlmICh3aWRnZXRzLmxlbmd0aCAhPSAwKSB7Ci0JCQlpZiAob3JpZW50YXRpb25CdXR0b25zKSB7Ci0JCQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5IT1JJWk9OVEFMKSAhPSAwKTsKLQkJCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh3aWRnZXRzIFswXS5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCQl9Ci0JCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuQk9SREVSKSAhPSAwKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IGludCBnZXREZWZhdWx0TWF4aW11bSAoKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWFic3RyYWN0IGludCBnZXREZWZhdWx0TWluaW11bSAoKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JYWJzdHJhY3QgaW50IGdldERlZmF1bHRTZWxlY3Rpb24gKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtYXhpbXVtIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHNldFdpZGdldE1heGltdW0gKCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBzZXRXaWRnZXRNaW5pbXVtICgpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBzZXRXaWRnZXRTZWxlY3Rpb24gKCk7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TYXNoRm9ybVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaEZvcm1UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0MjQ3ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TYXNoRm9ybVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgU2FzaEZvcm1UYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JR3JvdXAgc2FzaEZvcm1Hcm91cDsKLQlTYXNoRm9ybSBmb3JtOwotCUxpc3QgbGlzdDEsIGxpc3QyOwotCVRleHQgdGV4dDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIGhvcml6b250YWxCdXR0b24sIHZlcnRpY2FsQnV0dG9uLCBzbW9vdGhCdXR0b247Ci0KLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhMCA9IHtDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzAiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfMSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF8yIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMF81IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTBfNyIpfTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIAotCXN0YXRpYyBTdHJpbmcgW10gTGlzdERhdGExID0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8xIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzIiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfMyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV80IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGExXzUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaXN0RGF0YTFfNiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV83Iil9OyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTYXNoRm9ybVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBzYXNoZm9ybSB3aWRnZXQgKi8KLQkJc2FzaEZvcm1Hcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNhc2hGb3JtR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNhc2hGb3JtR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc2FzaEZvcm1Hcm91cC5zZXRUZXh0ICgiU2FzaEZvcm0iKTsKLQl9Ci0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhfU0NST0xMOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVl9TQ1JPTEw7Ci0JCWlmIChzbW9vdGhCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU01PT1RIOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJZm9ybSA9IG5ldyBTYXNoRm9ybSAoc2FzaEZvcm1Hcm91cCwgc3R5bGUpOwotCQlsaXN0MSA9IG5ldyBMaXN0IChmb3JtLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJbGlzdDEuc2V0SXRlbXMgKExpc3REYXRhMCk7Ci0JCWxpc3QyID0gbmV3IExpc3QgKGZvcm0sIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlsaXN0Mi5zZXRJdGVtcyAoTGlzdERhdGExKTsKLQkJdGV4dCA9IG5ldyBUZXh0IChmb3JtLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJdGV4dC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlfbGluZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlmb3JtLnNldFdlaWdodHMobmV3IGludFtdIHsxLCAxLCAxfSk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXZlcnRpY2FsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJdmVydGljYWxCdXR0b24uc2V0VGV4dCAoIlNXVC5WRVJUSUNBTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlzbW9vdGhCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzbW9vdGhCdXR0b24uc2V0VGV4dCAoIlNXVC5TTU9PVEgiKTsKLQkJc21vb3RoQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge2Zvcm19OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGZvbGRlciBpdGVtLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICJTYXNoRm9ybSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChmb3JtLmdldFN0eWxlICgpICYgU1dULkhfU0NST0xMKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgoZm9ybS5nZXRTdHlsZSAoKSAmIFNXVC5WX1NDUk9MTCkgIT0gMCk7Ci0JCXNtb290aEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChmb3JtLmdldFN0eWxlICgpICYgU1dULlNNT09USCkgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2FzaFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTVhYThmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Nhc2hUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFNhc2hUYWIgZXh0ZW5kcyBUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JU2FzaCBoU2FzaCwgdlNhc2g7Ci0JQ29tcG9zaXRlIHNhc2hDb21wOwotCUdyb3VwIHNhc2hHcm91cDsKLQlMaXN0IGxpc3QxLCBsaXN0MiwgbGlzdDM7Ci0JVGV4dCB0ZXh0OwotCUJ1dHRvbiBzbW9vdGhCdXR0b247Ci0KLQlzdGF0aWMgU3RyaW5nIFtdIExpc3REYXRhMCA9IHtDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzAiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzEiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzIiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzMiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzQiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzUiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzYiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzciKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGlzdERhdGEwXzgiKX07Ci0JCQkJCQkJCSAgCi0Jc3RhdGljIFN0cmluZyBbXSBMaXN0RGF0YTEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8wIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8xIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8yIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV8zIiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV80IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV81IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV82IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV83IiksCi0JCQkJCQkJCSAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpc3REYXRhMV84Iil9OwotCi0JLyogQ29uc3RhbnRzICovCi0Jc3RhdGljIGZpbmFsIGludCBTQVNIX1dJRFRIID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFNBU0hfTElNSVQgPSAyMDsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTYXNoVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQlleGFtcGxlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgc2FzaCB3aWRnZXRzICovCi0JCXNhc2hHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCUZpbGxMYXlvdXQgbGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDU7Ci0JCXNhc2hHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2FzaEdyb3VwLnNldFRleHQgKCJTYXNoIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgcGFnZS4gIFRoaXMgZXhhbXBsZSBkb2VzIG5vdCB1c2UgbGF5b3V0cy4KLQkJICovCi0JCXNhc2hDb21wID0gbmV3IENvbXBvc2l0ZShzYXNoR3JvdXAsIFNXVC5CT1JERVIpOwotCQotCQkvKiBDcmVhdGUgdGhlIGxpc3QgYW5kIHRleHQgd2lkZ2V0cyAqLwotCQlsaXN0MSA9IG5ldyBMaXN0IChzYXNoQ29tcCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWxpc3QxLnNldEl0ZW1zIChMaXN0RGF0YTApOwotCQlsaXN0MiA9IG5ldyBMaXN0IChzYXNoQ29tcCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWxpc3QyLnNldEl0ZW1zIChMaXN0RGF0YTEpOwotCQl0ZXh0ID0gbmV3IFRleHQgKHNhc2hDb21wLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJdGV4dC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlfbGluZSIpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBzYXNoZXMgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzbW9vdGhCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5TTU9PVEg7Ci0JCXZTYXNoID0gbmV3IFNhc2ggKHNhc2hDb21wLCBTV1QuVkVSVElDQUwgfCBzdHlsZSk7Ci0JCWhTYXNoID0gbmV3IFNhc2ggKHNhc2hDb21wLCBTV1QuSE9SSVpPTlRBTCB8IHN0eWxlKTsKLQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWhTYXNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHZTYXNoLmdldFBhcmVudCgpLmdldENsaWVudEFyZWEoKTsKLQkJCQlldmVudC55ID0gTWF0aC5taW4gKE1hdGgubWF4IChldmVudC55LCBTQVNIX0xJTUlUKSwgcmVjdC5oZWlnaHQgLSBTQVNIX0xJTUlUKTsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsICE9IFNXVC5EUkFHKSB7Ci0JCQkJCWhTYXNoLnNldEJvdW5kcyAoZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJCWxheW91dCAoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl2U2FzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSB2U2FzaC5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZXZlbnQueCA9IE1hdGgubWluIChNYXRoLm1heCAoZXZlbnQueCwgU0FTSF9MSU1JVCksIHJlY3Qud2lkdGggLSBTQVNIX0xJTUlUKTsKLQkJCQlpZiAoZXZlbnQuZGV0YWlsICE9IFNXVC5EUkFHKSB7Ci0JCQkJCXZTYXNoLnNldEJvdW5kcyAoZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJCWxheW91dCAoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzYXNoQ29tcC5hZGRDb250cm9sTGlzdGVuZXIgKG5ldyBDb250cm9sQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZCAoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzaXplZCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlNpemUiIGdyb3VwLiAgVGhlICJTaXplIiBncm91cCBjb250YWlucwotCSAqIGNvbnRyb2xzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBzaXplIG9mCi0JICogdGhlIGV4YW1wbGUgd2lkZ2V0cy4KLQkgKi8JCi0Jdm9pZCBjcmVhdGVTaXplR3JvdXAgKCkgewkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc21vb3RoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc21vb3RoQnV0dG9uLnNldFRleHQoIlNXVC5TTU9PVEgiKTsKLQl9Ci0JCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQlzYXNoQ29tcC5kaXNwb3NlKCk7Ci0JCXNhc2hDb21wID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtoU2FzaCwgdlNhc2h9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2FzaCI7Ci0JfQotCQotCS8qKgotCSAqIExheW91dCB0aGUgbGlzdCBhbmQgdGV4dCB3aWRnZXRzIGFjY29yZGluZyB0byB0aGUgbmV3Ci0JICogcG9zaXRpb25zIG9mIHRoZSBzYXNoZXMuLmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXZvaWQgbGF5b3V0ICgpIHsKLQkJCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2FzaENvbXAuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJUmVjdGFuZ2xlIGhTYXNoQm91bmRzID0gaFNhc2guZ2V0Qm91bmRzICgpOwotCQlSZWN0YW5nbGUgdlNhc2hCb3VuZHMgPSB2U2FzaC5nZXRCb3VuZHMgKCk7Ci0JCQotCQlsaXN0MS5zZXRCb3VuZHMgKDAsIDAsIHZTYXNoQm91bmRzLngsIGhTYXNoQm91bmRzLnkpOwotCQlsaXN0Mi5zZXRCb3VuZHMgKHZTYXNoQm91bmRzLnggKyB2U2FzaEJvdW5kcy53aWR0aCwgMCwgY2xpZW50QXJlYS53aWR0aCAtICh2U2FzaEJvdW5kcy54ICsgdlNhc2hCb3VuZHMud2lkdGgpLCBoU2FzaEJvdW5kcy55KTsKLQkJdGV4dC5zZXRCb3VuZHMgKDAsIGhTYXNoQm91bmRzLnkgKyBoU2FzaEJvdW5kcy5oZWlnaHQsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0IC0gKGhTYXNoQm91bmRzLnkgKyBoU2FzaEJvdW5kcy5oZWlnaHQpKTsKLQkKLQkJLyoqCi0JCSogSWYgdGhlIGhvcml6b250YWwgc2FzaCBoYXMgYmVlbiBtb3ZlZCB0aGVuIHRoZSB2ZXJ0aWNhbAotCQkqIHNhc2ggaXMgZWl0aGVyIHRvbyBsb25nIG9yIHRvbyBzaG9ydCBhbmQgaXRzIHNpemUgbXVzdAotCQkqIGJlIGFkanVzdGVkLgotCQkqLwotCQl2U2FzaEJvdW5kcy5oZWlnaHQgPSBoU2FzaEJvdW5kcy55OwotCQl2U2FzaC5zZXRCb3VuZHMgKHZTYXNoQm91bmRzKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKSB7Ci0JCXNhc2hHcm91cC5sYXlvdXQgKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXNtb290aEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChoU2FzaC5nZXRTdHlsZSAoKSAmIFNXVC5TTU9PVEgpICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIHNoZWxsIHJlc2l6ZWQgZXZlbnQuCi0JICovCi0Jdm9pZCByZXNpemVkICgpIHsKLQkKLQkJLyogR2V0IHRoZSBjbGllbnQgYXJlYSBmb3IgdGhlIHNoZWxsICovCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2FzaENvbXAuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCi0JCS8qCi0JCSogTWFrZSBsaXN0IDEgaGFsZiB0aGUgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgbGlzdCAxIGluIHRoZSB0b3AgbGVmdCBxdWFkcmFudCBvZiB0aGUgdGFiLgotCQkqLwotCQlSZWN0YW5nbGUgbGlzdDFCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlICgwLCAwLCAoY2xpZW50QXJlYS53aWR0aCAtIFNBU0hfV0lEVEgpIC8gMiwgKGNsaWVudEFyZWEuaGVpZ2h0IC0gU0FTSF9XSURUSCkgLyAyKTsKLQkJbGlzdDEuc2V0Qm91bmRzIChsaXN0MUJvdW5kcyk7Ci0JCi0JCS8qCi0JCSogTWFrZSBsaXN0IDIgaGFsZiB0aGUgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgbGlzdCAyIGluIHRoZSB0b3AgcmlnaHQgcXVhZHJhbnQgb2YgdGhlIHRhYi4KLQkJKi8KLQkJbGlzdDIuc2V0Qm91bmRzIChsaXN0MUJvdW5kcy53aWR0aCArIFNBU0hfV0lEVEgsIDAsIGNsaWVudEFyZWEud2lkdGggLSAobGlzdDFCb3VuZHMud2lkdGggKyBTQVNIX1dJRFRIKSwgbGlzdDFCb3VuZHMuaGVpZ2h0KTsKLQkKLQkJLyoKLQkJKiBNYWtlIHRoZSB0ZXh0IGFyZWEgdGhlIGZ1bGwgd2lkdGggYW5kIGhhbGYgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGxlYXZpbmcgcm9vbSBmb3IgdGhlIHNhc2guCi0JCSogUGxhY2UgdGhlIHRleHQgYXJlYSBpbiB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIHRhYi4KLQkJKi8KLQkJdGV4dC5zZXRCb3VuZHMgKDAsIGxpc3QxQm91bmRzLmhlaWdodCArIFNBU0hfV0lEVEgsIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0IC0gKGxpc3QxQm91bmRzLmhlaWdodCArIFNBU0hfV0lEVEgpKTsKLQkKLQkJLyogUG9zaXRpb24gdGhlIHNhc2hlcyAqLwotCQl2U2FzaC5zZXRCb3VuZHMgKGxpc3QxQm91bmRzLndpZHRoLCAwLCBTQVNIX1dJRFRILCBsaXN0MUJvdW5kcy5oZWlnaHQpOwotCQloU2FzaC5zZXRCb3VuZHMgKDAsIGxpc3QxQm91bmRzLmhlaWdodCwgY2xpZW50QXJlYS53aWR0aCwgU0FTSF9XSURUSCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2NhbGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NjYWxlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjJlMGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2NhbGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFNjYWxlVGFiIGV4dGVuZHMgUmFuZ2VUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JU2NhbGUgc2NhbGUxOwotCUdyb3VwIHNjYWxlR3JvdXA7Ci0KLQkvKiBTcGlubmVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJDb250cm9sIiBncm91cCAqLwotCVNwaW5uZXIgaW5jcmVtZW50U3Bpbm5lciwgcGFnZUluY3JlbWVudFNwaW5uZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVNjYWxlVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXN1cGVyKGluc3RhbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY3JlYXRlSW5jcmVtZW50R3JvdXAgKCk7Ci0JCWNyZWF0ZVBhZ2VJbmNyZW1lbnRHcm91cCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBzY2FsZSAqLwotCQlzY2FsZUdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJc2NhbGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc2NhbGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzY2FsZUdyb3VwLnNldFRleHQgKCJTY2FsZSIpOwotCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZFUlRJQ0FMOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJc2NhbGUxID0gbmV3IFNjYWxlIChzY2FsZUdyb3VwLCBzdHlsZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgaW5jcmVtZW50Ci0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUluY3JlbWVudEdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIGluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbmNyZW1lbnQiKSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgU3Bpbm5lciB3aWRnZXQgKi8KLQkJaW5jcmVtZW50U3Bpbm5lciA9IG5ldyBTcGlubmVyIChpbmNyZW1lbnRHcm91cCwgU1dULkJPUkRFUik7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRTZWxlY3Rpb24gKGdldERlZmF1bHRJbmNyZW1lbnQoKSk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWluY3JlbWVudFNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7CQkKLQkJCQlzZXRXaWRnZXRJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIHBhZ2UgaW5jcmVtZW50Ci0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVBhZ2VJbmNyZW1lbnRHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBwYWdlSW5jcmVtZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFnZV9JbmNyZW1lbnQiKSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCi0JCS8qIENyZWF0ZSB0aGUgU3Bpbm5lciB3aWRnZXQgKi8KLQkJcGFnZUluY3JlbWVudFNwaW5uZXIgPSBuZXcgU3Bpbm5lciAocGFnZUluY3JlbWVudEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0UGFnZUluY3JlbWVudCgpKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3NjYWxlMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uIiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2NhbGUiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0TWF4aW11bSAoKSB7Ci0JCXJldHVybiBzY2FsZTEuZ2V0TWF4aW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0TWluaW11bSAoKSB7Ci0JCXJldHVybiBzY2FsZTEuZ2V0TWluaW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRTZWxlY3Rpb24gKCkgewotCQlyZXR1cm4gc2NhbGUxLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdEluY3JlbWVudCAoKSB7Ci0JCXJldHVybiBzY2FsZTEuZ2V0SW5jcmVtZW50KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgcGFnZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0UGFnZUluY3JlbWVudCAoKSB7Ci0JCXJldHVybiBzY2FsZTEuZ2V0UGFnZUluY3JlbWVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SW5jcmVtZW50ICgpIHsKLQkJc2NhbGUxLnNldEluY3JlbWVudCAoaW5jcmVtZW50U3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1heGltdW0gKCkgewotCQlzY2FsZTEuc2V0TWF4aW11bSAobWF4aW11bVNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWluaW1pbSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRNaW5pbXVtICgpIHsKLQkJc2NhbGUxLnNldE1pbmltdW0gKG1pbmltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCkgewotCQlzY2FsZTEuc2V0UGFnZUluY3JlbWVudCAocGFnZUluY3JlbWVudFNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKSB7Ci0JCXNjYWxlMS5zZXRTZWxlY3Rpb24gKHNlbGVjdGlvblNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TY3JvbGxhYmxlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TY3JvbGxhYmxlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhODcwOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2Nyb2xsYWJsZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotYWJzdHJhY3QgY2xhc3MgU2Nyb2xsYWJsZVRhYiBleHRlbmRzIFRhYiB7Ci0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwkKLQlCdXR0b24gc2luZ2xlQnV0dG9uLCBtdWx0aUJ1dHRvbiwgaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2Nyb2xsYWJsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJc2luZ2xlQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJc2luZ2xlQnV0dG9uLnNldFRleHQgKCJTV1QuU0lOR0xFIik7Ci0JCW11bHRpQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJbXVsdGlCdXR0b24uc2V0VGV4dCAoIlNXVC5NVUxUSSIpOwotCQlob3Jpem9udGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkhfU0NST0xMIik7Ci0JCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVl9TQ1JPTEwiKTsKLQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlXaWRnZXQgW10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlpZiAod2lkZ2V0cy5sZW5ndGggIT0gMCl7Ci0JCQlzaW5nbGVCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuU0lOR0xFKSAhPSAwKTsKLQkJCW11bHRpQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuSF9TQ1JPTEwpICE9IDApOwotCQkJdmVydGljYWxCdXR0b24uc2V0U2VsZWN0aW9uICgod2lkZ2V0cyBbMF0uZ2V0U3R5bGUgKCkgJiBTV1QuVl9TQ1JPTEwpICE9IDApOwotCQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKHdpZGdldHMgWzBdLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TaGVsbFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2hlbGxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjgzOThjNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TaGVsbFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotY2xhc3MgU2hlbGxUYWIgZXh0ZW5kcyBUYWIgewkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwcywgYW5kICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gbm9QYXJlbnRCdXR0b24sIHBhcmVudEJ1dHRvbjsKLQlCdXR0b24gbm9UcmltQnV0dG9uLCBjbG9zZUJ1dHRvbiwgdGl0bGVCdXR0b24sIG1pbkJ1dHRvbiwgbWF4QnV0dG9uLCBib3JkZXJCdXR0b24sIHJlc2l6ZUJ1dHRvbiwgb25Ub3BCdXR0b24sIHRvb2xCdXR0b247Ci0JQnV0dG9uIGNyZWF0ZUJ1dHRvbiwgY2xvc2VBbGxCdXR0b247Ci0JQnV0dG9uIG1vZGVsZXNzQnV0dG9uLCBwcmltYXJ5TW9kYWxCdXR0b24sIGFwcGxpY2F0aW9uTW9kYWxCdXR0b24sIHN5c3RlbU1vZGFsQnV0dG9uOwotCUJ1dHRvbiBpbWFnZUJ1dHRvbjsKLQlHcm91cCBwYXJlbnRTdHlsZUdyb3VwLCBtb2RhbFN0eWxlR3JvdXA7Ci0KLQkvKiBWYXJpYWJsZXMgdXNlZCB0byB0cmFjayB0aGUgb3BlbiBzaGVsbHMgKi8KLQlpbnQgc2hlbGxDb3VudCA9IDA7Ci0JU2hlbGwgW10gc2hlbGxzID0gbmV3IFNoZWxsIFs0XTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JU2hlbGxUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENsb3NlIGFsbCB0aGUgZXhhbXBsZSBzaGVsbHMuCi0JICovCi0Jdm9pZCBjbG9zZUFsbFNoZWxscygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGk8c2hlbGxDb3VudDsgaSsrKSB7Ci0JCQlpZiAoc2hlbGxzW2ldICE9IG51bGwgJiAhc2hlbGxzIFtpXS5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQkJc2hlbGxzIFtpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJc2hlbGxDb3VudCA9IDA7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgQ3JlYXRlIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCi0JCS8qCi0JCSAqIFJlbWVtYmVyIHRoZSBleGFtcGxlIHNoZWxscyBzbyB0aGV5Ci0JCSAqIGNhbiBiZSBkaXNwb3NlZCBieSB0aGUgdXNlci4KLQkJICovCi0JCWlmIChzaGVsbENvdW50ID49IHNoZWxscy5sZW5ndGgpIHsKLQkJCVNoZWxsIFtdIG5ld1NoZWxscyA9IG5ldyBTaGVsbCBbc2hlbGxzLmxlbmd0aCArIDRdOwotCQkJU3lzdGVtLmFycmF5Y29weSAoc2hlbGxzLCAwLCBuZXdTaGVsbHMsIDAsIHNoZWxscy5sZW5ndGgpOwotCQkJc2hlbGxzID0gbmV3U2hlbGxzOwotCQl9Ci0JCi0JCS8qIENvbXB1dGUgdGhlIHNoZWxsIHN0eWxlICovCi0JCWludCBzdHlsZSA9IFNXVC5OT05FOwotCQlpZiAobm9UcmltQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTk9fVFJJTTsKLQkJaWYgKGNsb3NlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQ0xPU0U7Ci0JCWlmICh0aXRsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULlRJVExFOwotCQlpZiAobWluQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTUlOOwotCQlpZiAobWF4QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTUFYOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAocmVzaXplQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUkVTSVpFOwotCQlpZiAob25Ub3BCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5PTl9UT1A7Ci0JCWlmICh0b29sQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVE9PTDsKLQkJaWYgKG1vZGVsZXNzQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuTU9ERUxFU1M7Ci0JCWlmIChwcmltYXJ5TW9kYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5QUklNQVJZX01PREFMOwotCQlpZiAoYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkFQUExJQ0FUSU9OX01PREFMOwotCQlpZiAoc3lzdGVtTW9kYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5TWVNURU1fTU9EQUw7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgc2hlbGwgd2l0aCBvciB3aXRob3V0IGEgcGFyZW50ICovCi0JCWlmIChub1BhcmVudEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCXNoZWxscyBbc2hlbGxDb3VudF0gPSBuZXcgU2hlbGwgKHN0eWxlKTsKLQkJfSBlbHNlIHsKLQkJCXNoZWxscyBbc2hlbGxDb3VudF0gPSBuZXcgU2hlbGwgKHNoZWxsLCBzdHlsZSk7Ci0JCX0KLQkJZmluYWwgU2hlbGwgY3VycmVudFNoZWxsID0gc2hlbGxzIFtzaGVsbENvdW50XTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY3VycmVudFNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRCb3VuZHMoMjAsIDIwLCAxMjAsIDMwKTsKLQkJQnV0dG9uIGNsb3NlID0gbmV3IEJ1dHRvbihjdXJyZW50U2hlbGwsIFNXVC5QVVNIKTsKLQkJY2xvc2Uuc2V0Qm91bmRzKDE2MCwgMjAsIDEyMCwgMzApOwotCQljbG9zZS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDbG9zZSIpKTsKLQkJY2xvc2UuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQljdXJyZW50U2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkKLQkJLyogU2V0IHRoZSBzaXplLCB0aXRsZSwgYW5kIGltYWdlLCBhbmQgb3BlbiB0aGUgc2hlbGwgKi8KLQkJY3VycmVudFNoZWxsLnNldFNpemUgKDMwMCwgMTAwKTsKLQkJY3VycmVudFNoZWxsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIpICsgc2hlbGxDb3VudCk7Ci0JCWlmIChpbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgY3VycmVudFNoZWxsLnNldEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaVRhcmdldF0pOwotCQlpZiAoYmFja2dyb3VuZEltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBjdXJyZW50U2hlbGwuc2V0QmFja2dyb3VuZEltYWdlKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUJhY2tncm91bmRdKTsKLQkJaG9va0xpc3RlbmVycyAoY3VycmVudFNoZWxsKTsKLQkJY3VycmVudFNoZWxsLm9wZW4gKCk7Ci0JCXNoZWxsQ291bnQrKzsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIGdyb3VwLiAKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xHcm91cCAoKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgIkNvbnRyb2wiIGdyb3VwLiAgVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JCSAqIHJpZ2h0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4gIEl0IGNvbnNpc3RzIG9mIHRoZQotCQkgKiBzdHlsZSBncm91cCwgdGhlICdvdGhlcicgZ3JvdXAgYW5kIHRoZSBzaXplIGdyb3VwLgotCQkgKi8JCQotCQljb250cm9sR3JvdXAgPSBuZXcgR3JvdXAgKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIHRydWUpKTsKLQkJY29udHJvbEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQljb250cm9sR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmFtZXRlcnMiKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgZGVjb3JhdGlvbiBzdHlsZSBjb250cm9scyAqLwotCQlzdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlLCAxLCAzKSk7Ci0JCXN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlY29yYXRpb25fU3R5bGVzIikpOwotCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIG1vZGFsIHN0eWxlIGNvbnRyb2xzICovCi0JCW1vZGFsU3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJbW9kYWxTdHlsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCW1vZGFsU3R5bGVHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW9kYWxfU3R5bGVzIikpOwkJCi0KLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSAnb3RoZXInIGNvbnRyb2xzICovCi0JCW90aGVyR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlvdGhlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlvdGhlckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQlvdGhlckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPdGhlciIpKTsKLQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHBhcmVudCBzdHlsZSBjb250cm9scyAqLwotCQlwYXJlbnRTdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJcGFyZW50U3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJcGFyZW50U3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChncmlkRGF0YSk7Ci0JCXBhcmVudFN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhcmVudCIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBwYXJlbnQgc3R5bGUgYnV0dG9ucyAqLwotCQlub1BhcmVudEJ1dHRvbiA9IG5ldyBCdXR0b24gKHBhcmVudFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW5vUGFyZW50QnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb19QYXJlbnQiKSk7Ci0JCXBhcmVudEJ1dHRvbiA9IG5ldyBCdXR0b24gKHBhcmVudFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXBhcmVudEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyZW50IikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGRlY29yYXRpb24gc3R5bGUgYnV0dG9ucyAqLwotCQlub1RyaW1CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlub1RyaW1CdXR0b24uc2V0VGV4dCAoIlNXVC5OT19UUklNIik7Ci0JCWNsb3NlQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJY2xvc2VCdXR0b24uc2V0VGV4dCAoIlNXVC5DTE9TRSIpOwotCQl0aXRsZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXRpdGxlQnV0dG9uLnNldFRleHQgKCJTV1QuVElUTEUiKTsKLQkJbWluQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJbWluQnV0dG9uLnNldFRleHQgKCJTV1QuTUlOIik7Ci0JCW1heEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1heEJ1dHRvbi5zZXRUZXh0ICgiU1dULk1BWCIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQkJcmVzaXplQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmVzaXplQnV0dG9uLnNldFRleHQgKCJTV1QuUkVTSVpFIik7Ci0JCW9uVG9wQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJb25Ub3BCdXR0b24uc2V0VGV4dCAoIlNXVC5PTl9UT1AiKTsKLQkJdG9vbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXRvb2xCdXR0b24uc2V0VGV4dCAoIlNXVC5UT09MIik7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgbW9kYWwgc3R5bGUgYnV0dG9ucyAqLwotCQltb2RlbGVzc0J1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJbW9kZWxlc3NCdXR0b24uc2V0VGV4dCAoIlNXVC5NT0RFTEVTUyIpOwotCQlwcmltYXJ5TW9kYWxCdXR0b24gPSBuZXcgQnV0dG9uIChtb2RhbFN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXByaW1hcnlNb2RhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlBSSU1BUllfTU9EQUwiKTsKLQkJYXBwbGljYXRpb25Nb2RhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKG1vZGFsU3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJYXBwbGljYXRpb25Nb2RhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkFQUExJQ0FUSU9OX01PREFMIik7Ci0JCXN5c3RlbU1vZGFsQnV0dG9uID0gbmV3IEJ1dHRvbiAobW9kYWxTdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNZU1RFTV9NT0RBTCIpOwotCQotCQkvKiBDcmVhdGUgdGhlICdvdGhlcicgYnV0dG9ucyAqLwotCQlpbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWltYWdlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZSIpKTsKLQkJYmFja2dyb3VuZEltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQliYWNrZ3JvdW5kSW1hZ2VCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmFja2dyb3VuZEltYWdlIikpOwotCQotCQkvKiBDcmVhdGUgdGhlICJjcmVhdGUiIGFuZCAiY2xvc2VBbGwiIGJ1dHRvbnMgKi8KLQkJY3JlYXRlQnV0dG9uID0gbmV3IEJ1dHRvbiAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhIChHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhIChncmlkRGF0YSk7Ci0JCWNyZWF0ZUJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3JlYXRlX1NoZWxsIikpOwotCQljbG9zZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQljbG9zZUFsbEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2xvc2VfQWxsX1NoZWxscyIpKTsKLQkJY2xvc2VBbGxCdXR0b24uc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQljcmVhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3JlYXRlQnV0dG9uU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQljbG9zZUFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljbG9zZUFsbFNoZWxscyAoKTsKLQkJCX0KLQkJfSk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIGRlY29yYXRpb25CdXR0b25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlkZWNvcmF0aW9uQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCQlub1RyaW1CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCWNsb3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQl0aXRsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJbWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQltYXhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGRlY29yYXRpb25CdXR0b25MaXN0ZW5lcik7Ci0JCWJvcmRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkJcmVzaXplQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQlhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChkZWNvcmF0aW9uQnV0dG9uTGlzdGVuZXIpOwotCQlzeXN0ZW1Nb2RhbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoZGVjb3JhdGlvbkJ1dHRvbkxpc3RlbmVyKTsKLQkKLQkJLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlICovCi0JCW5vUGFyZW50QnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCW1vZGVsZXNzQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWJhY2tncm91bmRJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgYSBkZWNvcmF0aW9uIGJ1dHRvbiBzZWxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRpb25CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQotCQkvKiBNYWtlIHN1cmUgaWYgdGhlIG1vZGFsIHN0eWxlIGlzIFNXVC5BUFBMSUNBVElPTl9NT0RBTCBvciAKLQkJICogU1dULlNZU1RFTV9NT0RBTCB0aGUgc3R5bGUgU1dULkNMT1NFIGlzIGFsc28gc2VsZWN0ZWQuCi0JCSAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoZSB1c2VyIGNhbiBjbG9zZSB0aGUgc2hlbGwuCi0JCSAqLwotCQlCdXR0b24gd2lkZ2V0ID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQlpZiAod2lkZ2V0ID09IGFwcGxpY2F0aW9uTW9kYWxCdXR0b24gfHwgd2lkZ2V0ID09IHN5c3RlbU1vZGFsQnV0dG9uKSB7Ci0JCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJCQlub1RyaW1CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQl9IAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh3aWRnZXQgPT0gY2xvc2VCdXR0b24pIHsKLQkJCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJY2xvc2VCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJCX0KLQkJfQkKLQkJLyoKLQkJICogTWFrZSBzdXJlIGlmIHRoZSBObyBUcmltIGJ1dHRvbiBpcyBzZWxlY3RlZCB0aGVuCi0JCSAqIGFsbCBvdGhlciBkZWNvcmF0aW9uIGJ1dHRvbnMgYXJlIGRlc2VsZWN0ZWQuCi0JCSAqLwotCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpICYmIHdpZGdldCAhPSBub1RyaW1CdXR0b24pIHsKLQkJCW5vVHJpbUJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAod2lkZ2V0LmdldFNlbGVjdGlvbigpICYmIHdpZGdldCA9PSBub1RyaW1CdXR0b24pIHsKLQkJCWlmIChhcHBsaWNhdGlvbk1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHN5c3RlbU1vZGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJbm9UcmltQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNsb3NlQnV0dG9uLnNldFNlbGVjdGlvbiAoZmFsc2UpOwotCQkJdGl0bGVCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQltaW5CdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQltYXhCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlib3JkZXJCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlyZXNpemVCdXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2hlbGwiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NsaWRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2xpZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFiYjgzOTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU2xpZGVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBTbGlkZXJUYWIgZXh0ZW5kcyBSYW5nZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlTbGlkZXIgc2xpZGVyMTsKLQlHcm91cCBzbGlkZXJHcm91cDsKLQotCS8qIFNwaW5uZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JU3Bpbm5lciBpbmNyZW1lbnRTcGlubmVyLCBwYWdlSW5jcmVtZW50U3Bpbm5lciwgdGh1bWJTcGlubmVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlTbGlkZXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCQljcmVhdGVUaHVtYkdyb3VwICgpOwotCQljcmVhdGVJbmNyZW1lbnRHcm91cCAoKTsKLQkJY3JlYXRlUGFnZUluY3JlbWVudEdyb3VwICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHNsaWRlciAqLwotCQlzbGlkZXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNsaWRlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlzbGlkZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzbGlkZXJHcm91cC5zZXRUZXh0ICgiU2xpZGVyIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IT1JJWk9OVEFMOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVkVSVElDQUw7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlzbGlkZXIxID0gbmV3IFNsaWRlcihzbGlkZXJHcm91cCwgc3R5bGUpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVJbmNyZW1lbnRHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBpbmNyZW1lbnRHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5jcmVtZW50IikpOwotCQlpbmNyZW1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCWluY3JlbWVudFNwaW5uZXIgPSBuZXcgU3Bpbm5lciAoaW5jcmVtZW50R3JvdXAsIFNXVC5CT1JERVIpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0SW5jcmVtZW50KCkpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlpbmNyZW1lbnRTcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewkJCi0JCQkJc2V0V2lkZ2V0SW5jcmVtZW50ICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZ3JvdXAgb2Ygd2lkZ2V0cyB0byBjb250cm9sIHRoZSBwYWdlIGluY3JlbWVudAotCSAqIGF0dHJpYnV0ZSBvZiB0aGUgZXhhbXBsZSB3aWRnZXQuCi0JICovCi0Jdm9pZCBjcmVhdGVQYWdlSW5jcmVtZW50R3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgcGFnZUluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJcGFnZUluY3JlbWVudEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhZ2VfSW5jcmVtZW50IikpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyID0gbmV3IFNwaW5uZXIgKHBhZ2VJbmNyZW1lbnRHcm91cCwgU1dULkJPUkRFUik7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldFNlbGVjdGlvbiAoZ2V0RGVmYXVsdFBhZ2VJbmNyZW1lbnQoKSk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldEluY3JlbWVudCAoMSk7Ci0JCXBhZ2VJbmNyZW1lbnRTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIHRodW1iCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVRodW1iR3JvdXAoKSB7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJR3JvdXAgdGh1bWJHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXRodW1iR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRodW1iR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRodW1iIikpOwotCQl0aHVtYkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIFNwaW5uZXIgd2lkZ2V0ICovCi0JCXRodW1iU3Bpbm5lciA9IG5ldyBTcGlubmVyICh0aHVtYkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJdGh1bWJTcGlubmVyLnNldE1heGltdW0gKDEwMDAwMCk7Ci0JCXRodW1iU3Bpbm5lci5zZXRTZWxlY3Rpb24gKGdldERlZmF1bHRUaHVtYigpKTsKLQkJdGh1bWJTcGlubmVyLnNldFBhZ2VJbmNyZW1lbnQgKDEwMCk7Ci0JCXRodW1iU3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQl0aHVtYlNwaW5uZXIuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQl0aHVtYlNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFRodW1iICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7c2xpZGVyMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uIiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU2xpZGVyIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc3VwZXIuc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXNldFdpZGdldEluY3JlbWVudCAoKTsKLQkJCXNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCk7Ci0JCQlzZXRXaWRnZXRUaHVtYiAoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1heGltdW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0TWF4aW11bSAoKSB7Ci0JCXJldHVybiBzbGlkZXIxLmdldE1heGltdW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdE1pbmltdW0gKCkgewotCQlyZXR1cm4gc2xpZGVyMS5nZXRNaW5pbXVtKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFNlbGVjdGlvbiAoKSB7Ci0JCXJldHVybiBzbGlkZXIxLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdEluY3JlbWVudCAoKSB7Ci0JCXJldHVybiBzbGlkZXIxLmdldEluY3JlbWVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFBhZ2VJbmNyZW1lbnQgKCkgewotCQlyZXR1cm4gc2xpZGVyMS5nZXRQYWdlSW5jcmVtZW50KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgdGh1bWIgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0VGh1bWIgKCkgewotCQlyZXR1cm4gc2xpZGVyMS5nZXRUaHVtYigpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRJbmNyZW1lbnQgKCkgewotCQlzbGlkZXIxLnNldEluY3JlbWVudCAoaW5jcmVtZW50U3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtaW5pbWltIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldE1heGltdW0gKCkgewotCQlzbGlkZXIxLnNldE1heGltdW0gKG1heGltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWluaW11bSAoKSB7Ci0JCXNsaWRlcjEuc2V0TWluaW11bSAobWluaW11bVNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgcGFnZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKSB7Ci0JCXNsaWRlcjEuc2V0UGFnZUluY3JlbWVudCAocGFnZUluY3JlbWVudFNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNlbGVjdGlvbiAoKSB7Ci0JCXNsaWRlcjEuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb25TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHRodW1iIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFRodW1iICgpIHsKLQkJc2xpZGVyMS5zZXRUaHVtYiAodGh1bWJTcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3Bpbm5lclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3Bpbm5lclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjA4ZDViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1NwaW5uZXJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLWNsYXNzIFNwaW5uZXJUYWIgZXh0ZW5kcyBSYW5nZVRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVNwaW5uZXIgc3Bpbm5lcjE7Ci0JR3JvdXAgc3Bpbm5lckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gcmVhZE9ubHlCdXR0b24sIHdyYXBCdXR0b247Ci0JCi0JLyogU3Bpbm5lciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiQ29udHJvbCIgZ3JvdXAgKi8KLQlTcGlubmVyIGluY3JlbWVudFNwaW5uZXIsIHBhZ2VJbmNyZW1lbnRTcGlubmVyLCBkaWdpdHNTcGlubmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVNwaW5uZXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY3JlYXRlSW5jcmVtZW50R3JvdXAgKCk7Ci0JCWNyZWF0ZVBhZ2VJbmNyZW1lbnRHcm91cCAoKTsKLQkJY3JlYXRlRGlnaXRzR3JvdXAgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgc3Bpbm5lciAqLwotCQlzcGlubmVyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlzcGlubmVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNwaW5uZXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzcGlubmVyR3JvdXAuc2V0VGV4dCAoIlNwaW5uZXIiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChyZWFkT25seUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5SRUFEX09OTFk7Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAod3JhcEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5XUkFQOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJc3Bpbm5lcjEgPSBuZXcgU3Bpbm5lciAoc3Bpbm5lckdyb3VwLCBzdHlsZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgaW5jcmVtZW50Ci0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUluY3JlbWVudEdyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIGluY3JlbWVudEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJaW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbmNyZW1lbnQiKSk7Ci0JCWluY3JlbWVudEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgU3Bpbm5lciB3aWRnZXQgKi8KLQkJaW5jcmVtZW50U3Bpbm5lciA9IG5ldyBTcGlubmVyIChpbmNyZW1lbnRHcm91cCwgU1dULkJPUkRFUik7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRTZWxlY3Rpb24gKGdldERlZmF1bHRJbmNyZW1lbnQoKSk7Ci0JCWluY3JlbWVudFNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJaW5jcmVtZW50U3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQlpbmNyZW1lbnRTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWluY3JlbWVudFNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7CQkKLQkJCQlzZXRXaWRnZXRJbmNyZW1lbnQgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBncm91cCBvZiB3aWRnZXRzIHRvIGNvbnRyb2wgdGhlIHBhZ2UgaW5jcmVtZW50Ci0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVBhZ2VJbmNyZW1lbnRHcm91cCgpIHsKLQkKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlHcm91cCBwYWdlSW5jcmVtZW50R3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlwYWdlSW5jcmVtZW50R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFnZV9JbmNyZW1lbnQiKSk7Ci0JCXBhZ2VJbmNyZW1lbnRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCi0JCS8qIENyZWF0ZSB0aGUgU3Bpbm5lciB3aWRnZXQgKi8KLQkJcGFnZUluY3JlbWVudFNwaW5uZXIgPSBuZXcgU3Bpbm5lciAocGFnZUluY3JlbWVudEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0U2VsZWN0aW9uIChnZXREZWZhdWx0UGFnZUluY3JlbWVudCgpKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0SW5jcmVtZW50ICgxKTsKLQkJcGFnZUluY3JlbWVudFNwaW5uZXIuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlwYWdlSW5jcmVtZW50U3Bpbm5lci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0UGFnZUluY3JlbWVudCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGdyb3VwIG9mIHdpZGdldHMgdG8gY29udHJvbCB0aGUgZGlnaXRzCi0JICogYXR0cmlidXRlIG9mIHRoZSBleGFtcGxlIHdpZGdldC4KLQkgKi8KLQl2b2lkIGNyZWF0ZURpZ2l0c0dyb3VwKCkgewotCQotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCUdyb3VwIGRpZ2l0c0dyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJZGlnaXRzR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWRpZ2l0c0dyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEaWdpdHMiKSk7Ci0JCWRpZ2l0c0dyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgU3Bpbm5lciB3aWRnZXQgKi8KLQkJZGlnaXRzU3Bpbm5lciA9IG5ldyBTcGlubmVyIChkaWdpdHNHcm91cCwgU1dULkJPUkRFUik7Ci0JCWRpZ2l0c1NwaW5uZXIuc2V0TWF4aW11bSAoMTAwMDAwKTsKLQkJZGlnaXRzU3Bpbm5lci5zZXRTZWxlY3Rpb24gKGdldERlZmF1bHREaWdpdHMoKSk7Ci0JCWRpZ2l0c1NwaW5uZXIuc2V0UGFnZUluY3JlbWVudCAoMTAwKTsKLQkJZGlnaXRzU3Bpbm5lci5zZXRJbmNyZW1lbnQgKDEpOwotCQlkaWdpdHNTcGlubmVyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWRpZ2l0c1NwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7CQkKLQkJCQlzZXRXaWRnZXREaWdpdHMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJb3JpZW50YXRpb25CdXR0b25zID0gZmFsc2U7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQlyZWFkT25seUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVBRF9PTkxZIik7Ci0JCXdyYXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwQnV0dG9uLnNldFRleHQgKCJTV1QuV1JBUCIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtzcGlubmVyMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uIiwgIlRvb2xUaXBUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiU3Bpbm5lciI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0U2VsZWN0aW9uICgoc3Bpbm5lcjEuZ2V0U3R5bGUgKCkgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKTsKLQkJd3JhcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChzcGlubmVyMS5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlzZXRXaWRnZXRJbmNyZW1lbnQgKCk7Ci0JCQlzZXRXaWRnZXRQYWdlSW5jcmVtZW50ICgpOwotCQkJc2V0V2lkZ2V0RGlnaXRzICgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBtYXhpbXVtIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdE1heGltdW0gKCkgewotCQlyZXR1cm4gc3Bpbm5lcjEuZ2V0TWF4aW11bSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0TWluaW11bSAoKSB7Ci0JCXJldHVybiBzcGlubmVyMS5nZXRNaW5pbXVtKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdFNlbGVjdGlvbiAoKSB7Ci0JCXJldHVybiBzcGlubmVyMS5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGluY3JlbWVudCBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0JaW50IGdldERlZmF1bHRJbmNyZW1lbnQgKCkgewotCQlyZXR1cm4gc3Bpbm5lcjEuZ2V0SW5jcmVtZW50KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgcGFnZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCWludCBnZXREZWZhdWx0UGFnZUluY3JlbWVudCAoKSB7Ci0JCXJldHVybiBzcGlubmVyMS5nZXRQYWdlSW5jcmVtZW50KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZGlnaXRzIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQlpbnQgZ2V0RGVmYXVsdERpZ2l0cyAoKSB7Ci0JCXJldHVybiBzcGlubmVyMS5nZXREaWdpdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNyZW1lbnQgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SW5jcmVtZW50ICgpIHsKLQkJc3Bpbm5lcjEuc2V0SW5jcmVtZW50IChpbmNyZW1lbnRTcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWF4aW11bSAoKSB7Ci0JCXNwaW5uZXIxLnNldE1heGltdW0gKG1heGltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG1pbmltaW0gb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TWluaW11bSAoKSB7Ci0JCXNwaW5uZXIxLnNldE1pbmltdW0gKG1pbmltdW1TcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhZ2UgaW5jcmVtZW50IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFBhZ2VJbmNyZW1lbnQgKCkgewotCQlzcGlubmVyMS5zZXRQYWdlSW5jcmVtZW50IChwYWdlSW5jcmVtZW50U3Bpbm5lci5nZXRTZWxlY3Rpb24gKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBkaWdpdHMgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0RGlnaXRzICgpIHsKLQkJc3Bpbm5lcjEuc2V0RGlnaXRzIChkaWdpdHNTcGlubmVyLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRTZWxlY3Rpb24gKCkgewotCQlzcGlubmVyMS5zZXRTZWxlY3Rpb24gKHNlbGVjdGlvblNwaW5uZXIuZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TdHlsZWRUZXh0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9TdHlsZWRUZXh0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjJhNTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvU3R5bGVkVGV4dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1jbGFzcyBTdHlsZWRUZXh0VGFiIGV4dGVuZHMgU2Nyb2xsYWJsZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JR3JvdXAgc3R5bGVkVGV4dEdyb3VwLCBzdHlsZWRUZXh0U3R5bGVHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gd3JhcEJ1dHRvbiwgcmVhZE9ubHlCdXR0b24sIGZ1bGxTZWxlY3Rpb25CdXR0b247Ci0JCi0JLyogQnV0dG9ucyBmb3IgYWRkaW5nIFN0eWxlUmFuZ2VzIHRvIFN0eWxlZFRleHQgKi8KLQlCdXR0b24gYm9sZEJ1dHRvbiwgaXRhbGljQnV0dG9uLCByZWRCdXR0b24sIHllbGxvd0J1dHRvbiwgdW5kZXJsaW5lQnV0dG9uLCBzdHJpa2VvdXRCdXR0b247Ci0JSW1hZ2UgYm9sZEltYWdlLCBpdGFsaWNJbWFnZSwgcmVkSW1hZ2UsIHllbGxvd0ltYWdlLCB1bmRlcmxpbmVJbWFnZSwgc3RyaWtlb3V0SW1hZ2U7Ci0JCi0JLyogVmFyaWFibGVzIGZvciBzYXZpbmcgc3RhdGUuICovCi0JU3RyaW5nIHRleHQ7Ci0JU3R5bGVSYW5nZVtdIHN0eWxlUmFuZ2VzOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVN0eWxlZFRleHRUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgYml0bWFwIGltYWdlLiAKLQkgKi8KLQlJbWFnZSBjcmVhdGVCaXRtYXBJbWFnZSAoRGlzcGxheSBkaXNwbGF5LCBTdHJpbmcgbmFtZSkgewotCQlJbnB1dFN0cmVhbSBzb3VyY2VTdHJlYW0gPSBDb250cm9sRXhhbXBsZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChuYW1lICsgIi5ibXAiKTsKLQkJSW5wdXRTdHJlYW0gbWFza1N0cmVhbSA9IENvbnRyb2xFeGFtcGxlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0gKG5hbWUgKyAiX21hc2suYm1wIik7Ci0JCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhIChzb3VyY2VTdHJlYW0pOwotCQlJbWFnZURhdGEgbWFzayA9IG5ldyBJbWFnZURhdGEgKG1hc2tTdHJlYW0pOwotCQlJbWFnZSByZXN1bHQgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIHNvdXJjZSwgbWFzayk7Ci0JCXRyeSB7Ci0JCQlzb3VyY2VTdHJlYW0uY2xvc2UgKCk7Ci0JCQltYXNrU3RyZWFtLmNsb3NlICgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSAoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIEFkZCBhIGdyb3VwIGZvciBtb2RpZnlpbmcgdGhlIFN0eWxlZFRleHQgd2lkZ2V0ICovCi0JCWNyZWF0ZVN0eWxlZFRleHRTdHlsZUdyb3VwICgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgc3R5bGVkIHRleHQgd2lkZ2V0ICovCi0JCXN0eWxlZFRleHRHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlZFRleHRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc3R5bGVkVGV4dEdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXN0eWxlZFRleHRHcm91cC5zZXRUZXh0ICgiU3R5bGVkVGV4dCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuV1JBUDsKLQkJaWYgKHJlYWRPbmx5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0JCWlmIChmdWxsU2VsZWN0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkZVTExfU0VMRUNUSU9OOwotCQotCQkvKiBDcmVhdGUgdGhlIGV4YW1wbGUgd2lkZ2V0cyAqLwotCQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQgKHN0eWxlZFRleHRHcm91cCwgc3R5bGUpOwotCQlzdHlsZWRUZXh0LnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFeGFtcGxlX3N0cmluZyIpKTsKLQkJc3R5bGVkVGV4dC5hcHBlbmQgKCJcbiIpOwotCQlzdHlsZWRUZXh0LmFwcGVuZCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZV9Ud29fVGhyZWUiKSk7Ci0JCQotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JCQl0ZXh0ID0gbnVsbDsKLQkJfQotCQlpZiAoc3R5bGVSYW5nZXMgIT0gbnVsbCkgewotCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlcyhzdHlsZVJhbmdlcyk7Ci0JCQlzdHlsZVJhbmdlcyA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXdyYXBCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwQnV0dG9uLnNldFRleHQgKCJTV1QuV1JBUCIpOwotCQlyZWFkT25seUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlYWRPbmx5QnV0dG9uLnNldFRleHQgKCJTV1QuUkVBRF9PTkxZIik7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuRlVMTF9TRUxFQ1RJT04iKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlZFRleHQgU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVkVGV4dFN0eWxlR3JvdXAgKCkgewotCQlzdHlsZWRUZXh0U3R5bGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXN0eWxlZFRleHRTdHlsZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU3R5bGVkVGV4dF9TdHlsZXMiKSk7Ci0JCXN0eWxlZFRleHRTdHlsZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQoNiwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXN0eWxlZFRleHRTdHlsZUdyb3VwLnNldExheW91dERhdGEgKGRhdGEpOwotCQkKLQkJLyogR2V0IGltYWdlcyAqLwotCQlib2xkSW1hZ2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgImJvbGQiKTsKLQkJaXRhbGljSW1hZ2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgIml0YWxpYyIpOwotCQlyZWRJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAicmVkIik7Ci0JCXllbGxvd0ltYWdlID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJ5ZWxsb3ciKTsKLQkJdW5kZXJsaW5lSW1hZ2UgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgInVuZGVybGluZSIpOwotCQlzdHJpa2VvdXRJbWFnZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAic3RyaWtlb3V0Iik7Ci0JCQotCQkvKiBDcmVhdGUgY29udHJvbHMgdG8gbW9kaWZ5IHRoZSBTdHlsZWRUZXh0ICovCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlN0eWxlZFRleHRfU3R5bGVfSW5zdHJ1Y3Rpb25zIikpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCA2LCAxKSk7Ci0JCWxhYmVsID0gbmV3IExhYmVsIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJvbGQiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWJvbGRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQlib2xkQnV0dG9uLnNldEltYWdlIChib2xkSW1hZ2UpOwotCQlsYWJlbCA9IG5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJVbmRlcmxpbmUiKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXVuZGVybGluZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXVuZGVybGluZUJ1dHRvbi5zZXRJbWFnZSAodW5kZXJsaW5lSW1hZ2UpOwotCQlsYWJlbCA9IG5ldyBMYWJlbCAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJGb3JlZ3JvdW5kX1N0eWxlIikpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlyZWRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQlyZWRCdXR0b24uc2V0SW1hZ2UgKHJlZEltYWdlKTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRhbGljIikpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlpdGFsaWNCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQlpdGFsaWNCdXR0b24uc2V0SW1hZ2UgKGl0YWxpY0ltYWdlKTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU3RyaWtlb3V0IikpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlzdHJpa2VvdXRCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZWRUZXh0U3R5bGVHcm91cCwgU1dULlBVU0gpOwotCQlzdHJpa2VvdXRCdXR0b24uc2V0SW1hZ2UgKHN0cmlrZW91dEltYWdlKTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwgKHN0eWxlZFRleHRTdHlsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQmFja2dyb3VuZF9TdHlsZSIpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJeWVsbG93QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVkVGV4dFN0eWxlR3JvdXAsIFNXVC5QVVNIKTsKLQkJeWVsbG93QnV0dG9uLnNldEltYWdlICh5ZWxsb3dJbWFnZSk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHN0eWxlTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVBvaW50IHNlbCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQkJCQlpZiAoKHNlbCA9PSBudWxsKSB8fCAoc2VsLnkgPT0gMCkpIHJldHVybjsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlOwotCQkJCWZvciAoaW50IGkgPSBzZWwueDsgaTxzZWwueCtzZWwueTsgaSsrKSB7Ci0JCQkJCVN0eWxlUmFuZ2UgcmFuZ2UgPSBzdHlsZWRUZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJCQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpcmFuZ2UuY2xvbmUoKTsKLQkJCQkJCXN0eWxlLnN0YXJ0ID0gaTsKLQkJCQkJCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKGksIDEsIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpOwotCQkJCQl9Ci0JCQkJCWlmIChlLndpZGdldCA9PSBib2xkQnV0dG9uKSB7Ci0JCQkJCQlzdHlsZS5mb250U3R5bGUgXj0gU1dULkJPTEQ7Ci0JCQkJCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gaXRhbGljQnV0dG9uKSB7Ci0JCQkJCQlzdHlsZS5mb250U3R5bGUgXj0gU1dULklUQUxJQzsJCQkJCQkKLQkJCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSB1bmRlcmxpbmVCdXR0b24pIHsKLQkJCQkJCXN0eWxlLnVuZGVybGluZSA9ICFzdHlsZS51bmRlcmxpbmU7Ci0JCQkJCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gc3RyaWtlb3V0QnV0dG9uKSB7Ci0JCQkJCQlzdHlsZS5zdHJpa2VvdXQgPSAhc3R5bGUuc3RyaWtlb3V0OwotCQkJCQl9Ci0JCQkJCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JCQkJfQotCQkJCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsLnggKyBzZWwueSwgMCk7CQkJCi0JCQl9Ci0JCX07Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIGNvbG9yTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVBvaW50IHNlbCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQkJCQlpZiAoKHNlbCA9PSBudWxsKSB8fCAoc2VsLnkgPT0gMCkpIHJldHVybjsKLQkJCQlDb2xvciBmZyA9IG51bGwsIGJnID0gbnVsbDsKLQkJCQlpZiAoZS53aWRnZXQgPT0gcmVkQnV0dG9uKSB7Ci0JCQkJCWZnID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSB5ZWxsb3dCdXR0b24pIHsKLQkJCQkJYmcgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKTsKLQkJCQl9Ci0JCQkJU3R5bGVSYW5nZSBzdHlsZTsKLQkJCQlmb3IgKGludCBpID0gc2VsLng7IGk8c2VsLngrc2VsLnk7IGkrKykgewotCQkJCQlTdHlsZVJhbmdlIHJhbmdlID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSk7Ci0JCQkJCWlmIChyYW5nZSAhPSBudWxsKSB7Ci0JCQkJCQlzdHlsZSA9IChTdHlsZVJhbmdlKXJhbmdlLmNsb25lKCk7Ci0JCQkJCQlzdHlsZS5zdGFydCA9IGk7Ci0JCQkJCQlzdHlsZS5sZW5ndGggPSAxOwotCQkJCQkJc3R5bGUuZm9yZWdyb3VuZCA9IHN0eWxlLmZvcmVncm91bmQgIT0gbnVsbCA/IG51bGwgOiBmZzsKLQkJCQkJCXN0eWxlLmJhY2tncm91bmQgPSBzdHlsZS5iYWNrZ3JvdW5kICE9IG51bGwgPyBudWxsIDogYmc7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdHlsZSA9IG5ldyBTdHlsZVJhbmdlIChpLCAxLCBmZywgYmcsIFNXVC5OT1JNQUwpOwotCQkJCQl9Ci0JCQkJCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JCQkJfQotCQkJCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsLnggKyBzZWwueSwgMCk7Ci0JCQl9Ci0JCX07Ci0JCWJvbGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc3R5bGVMaXN0ZW5lcik7Ci0JCWl0YWxpY0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzdHlsZUxpc3RlbmVyKTsKLQkJdW5kZXJsaW5lQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHN0eWxlTGlzdGVuZXIpOwotCQlzdHJpa2VvdXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc3R5bGVMaXN0ZW5lcik7Ci0JCXJlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjb2xvckxpc3RlbmVyKTsKLQkJeWVsbG93QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbG9yTGlzdGVuZXIpOwotCQl5ZWxsb3dCdXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQgKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJYm9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpdGFsaWNJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJcmVkSW1hZ2UuZGlzcG9zZSgpOwotCQkJCXllbGxvd0ltYWdlLmRpc3Bvc2UoKTsKLQkJCQl1bmRlcmxpbmVJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJc3RyaWtlb3V0SW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQlzdXBlci5jcmVhdGVUYWJGb2xkZXJQYWdlICh0YWJGb2xkZXIpOwotCi0JCS8qCi0JCSAqIEFkZCBhIHJlc2l6ZSBsaXN0ZW5lciB0byB0aGUgdGFiRm9sZGVyUGFnZSBzbyB0aGF0Ci0JCSAqIGlmIHRoZSB1c2VyIHR5cGVzIGludG8gdGhlIGV4YW1wbGUgd2lkZ2V0IHRvIGNoYW5nZQotCQkgKiBpdHMgcHJlZmVycmVkIHNpemUsIGFuZCB0aGVuIHJlc2l6ZXMgdGhlIHNoZWxsLCB3ZQotCQkgKiByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUgY29ycmVjdGx5LgotCQkgKi8KLQkJdGFiRm9sZGVyUGFnZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gdGFiRm9sZGVyUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQkvKiBzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHN0eWxlZFRleHQgaWYgYXBwbGljYWJsZSAqLwotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdHlsZVJhbmdlcyA9IHN0eWxlZFRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQkJCXRleHQgPSBzdHlsZWRUZXh0LmdldFRleHQoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlRXhhbXBsZVdpZGdldHMoKTsJCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjdXN0b20gZXZlbnQgbmFtZXMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGN1c3RvbSBldmVudCBuYW1lcwotCSAqLwotCVN0cmluZyBbXSBnZXRDdXN0b21FdmVudE5hbWVzICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10gewotCQkJCSJFeHRlbmRlZE1vZGlmeUxpc3RlbmVyIiwgIkJpZGlTZWdtZW50TGlzdGVuZXIiLCAiTGluZUJhY2tncm91bmRMaXN0ZW5lciIsCi0JCQkJIkxpbmVTdHlsZUxpc3RlbmVyIiwgIlBhaW50T2JqZWN0TGlzdGVuZXIiLCAiVGV4dENoYW5nZUxpc3RlbmVyIiwKLQkJCQkiVmVyaWZ5S2V5TGlzdGVuZXIiLCAiV29yZE1vdmVtZW50TGlzdGVuZXIifTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHtzdHlsZWRUZXh0fTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJDYXJldE9mZnNldCIsICJEb3VibGVDbGlja0VuYWJsZWQiLCAiRWRpdGFibGUiLCAiSG9yaXpvbnRhbEluZGV4IiwgIkhvcml6b250YWxQaXhlbCIsICJPcmllbnRhdGlvbiIsICJTZWxlY3Rpb24iLCAiVGFicyIsICJUZXh0IiwgIlRleHRMaW1pdCIsICJUb29sVGlwVGV4dCIsICJUb3BJbmRleCIsICJUb3BQaXhlbCIsICJXb3JkV3JhcCJ9OwotCX0KLQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlN0eWxlZFRleHQiOwotCX0KLQkKLQkvKioKLQkgKiBIb29rcyB0aGUgY3VzdG9tIGxpc3RlbmVyIHNwZWNpZmllZCBieSBldmVudE5hbWUuCi0JICovCi0Jdm9pZCBob29rQ3VzdG9tTGlzdGVuZXIgKGZpbmFsIFN0cmluZyBldmVudE5hbWUpIHsKLQkJaWYgKGV2ZW50TmFtZSA9PSAiRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpIHsKLQkJCXN0eWxlZFRleHQuYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciAobmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiQmlkaVNlZ21lbnRMaXN0ZW5lciIpIHsKLQkJCXN0eWxlZFRleHQuYWRkQmlkaVNlZ21lbnRMaXN0ZW5lciAobmV3IEJpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGluZUdldFNlZ21lbnRzKEJpZGlTZWdtZW50RXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoZXZlbnROYW1lID09ICJMaW5lQmFja2dyb3VuZExpc3RlbmVyIikgewotCQkJc3R5bGVkVGV4dC5hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyIChuZXcgTGluZUJhY2tncm91bmRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaW5lR2V0QmFja2dyb3VuZChMaW5lQmFja2dyb3VuZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiTGluZVN0eWxlTGlzdGVuZXIiKSB7Ci0JCQlzdHlsZWRUZXh0LmFkZExpbmVTdHlsZUxpc3RlbmVyIChuZXcgTGluZVN0eWxlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGluZUdldFN0eWxlKExpbmVTdHlsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGV2ZW50TmFtZSA9PSAiUGFpbnRPYmplY3RMaXN0ZW5lciIpIHsKLQkJCXN0eWxlZFRleHQuYWRkUGFpbnRPYmplY3RMaXN0ZW5lciAobmV3IFBhaW50T2JqZWN0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRPYmplY3RFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmIChldmVudE5hbWUgPT0gIlRleHRDaGFuZ2VMaXN0ZW5lciIpIHsKLQkJCXN0eWxlZFRleHQuZ2V0Q29udGVudCgpLmFkZFRleHRDaGFuZ2VMaXN0ZW5lciAobmV3IFRleHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lICsgIi50ZXh0Q2hhbmdlZCIsIGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgdGV4dENoYW5naW5nKFRleHRDaGFuZ2luZ0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWxvZyAoZXZlbnROYW1lICsgIi50ZXh0Q2hhbmdpbmciLCBldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHRleHRTZXQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIudGV4dFNldCIsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoZXZlbnROYW1lID09ICJWZXJpZnlLZXlMaXN0ZW5lciIpIHsKLQkJCXN0eWxlZFRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIgKG5ldyBWZXJpZnlLZXlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudE5hbWUsIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlpZiAoZXZlbnROYW1lID09ICJXb3JkTW92ZW1lbnRMaXN0ZW5lciIpIHsKLQkJCXN0eWxlZFRleHQuYWRkV29yZE1vdmVtZW50TGlzdGVuZXIgKG5ldyBNb3ZlbWVudExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGdldE5leHRPZmZzZXQoTW92ZW1lbnRFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIuZ2V0TmV4dE9mZnNldCIsIGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgZ2V0UHJldmlvdXNPZmZzZXQoTW92ZW1lbnRFdmVudCBldmVudCkgewotCQkJCQlsb2cgKGV2ZW50TmFtZSArICIuZ2V0UHJldmlvdXNPZmZzZXQiLCBldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXdyYXBCdXR0b24uc2V0U2VsZWN0aW9uICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0U2VsZWN0aW9uICgoc3R5bGVkVGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApOwotCQlob3Jpem9udGFsQnV0dG9uLnNldEVuYWJsZWQgKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0RW5hYmxlZCAoKHN0eWxlZFRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldEVuYWJsZWQgKChzdHlsZWRUZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMDcxY2E2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLS8qKgotICogPGNvZGU+VGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBldmVyeSBwYWdlCi0gKiBpbiB0aGUgZXhhbXBsZSdzIHRhYiBmb2xkZXIuICBFYWNoIHBhZ2UgaW4gdGhlIHRhYiBmb2xkZXIKLSAqIGRlc2NyaWJlcyBhIGNvbnRyb2wuCi0gKgotICogQSBUYWIgaXRzZWxmIGlzIG5vdCBhIGNvbnRyb2wgYnV0IGluc3RlYWQgcHJvdmlkZXMgYQotICogaGllcmFyY2h5IHdpdGggd2hpY2ggdG8gc2hhcmUgY29kZSB0aGF0IGlzIGNvbW1vbiB0bwotICogZXZlcnkgcGFnZSBpbiB0aGUgZm9sZGVyLgotICoKLSAqIEEgdHlwaWNhbCBwYWdlIGluIGEgVGFiIGNvbnRhaW5zIGEgdHdvIGNvbHVtbiBjb21wb3NpdGUuCi0gKiBUaGUgbGVmdCBjb2x1bW4gY29udGFpbnMgdGhlICJFeGFtcGxlIiBncm91cC4gIFRoZSByaWdodAotICogY29sdW1uIGNvbnRhaW5zICJDb250cm9sIiBncm91cC4gIFRoZSAiQ29udHJvbCIgZ3JvdXAKLSAqIGNvbnRhaW5zIGNvbnRyb2xzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aAotICogdGhlIGV4YW1wbGUgY29udHJvbC4gIFRoZSAiQ29udHJvbCIgZ3JvdXAgdHlwaWNhbGx5Ci0gKiBjb250YWlucyBhICJTdHlsZSIsICJPdGhlciIgYW5kICJTaXplIiBncm91cC4gIFN1YmNsYXNzZXMKLSAqIGNhbiBvdmVycmlkZSB0aGVzZSBkZWZhdWx0cyB0byBhdWdtZW50IGEgZ3JvdXAgb3Igc3RvcAotICogYSBncm91cCBmcm9tIGJlaW5nIGNyZWF0ZWQuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRhYiB7Ci0JU2hlbGwgc2hlbGw7Ci0JRGlzcGxheSBkaXNwbGF5OwotCQotCS8qIENvbW1vbiBjb250cm9sIGJ1dHRvbnMgKi8KLQlCdXR0b24gYm9yZGVyQnV0dG9uLCBlbmFibGVkQnV0dG9uLCB2aXNpYmxlQnV0dG9uLCBiYWNrZ3JvdW5kSW1hZ2VCdXR0b24sIHBvcHVwTWVudUJ1dHRvbjsKLQlCdXR0b24gcHJlZmVycmVkQnV0dG9uLCB0b29TbWFsbEJ1dHRvbiwgc21hbGxCdXR0b24sIGxhcmdlQnV0dG9uLCBmaWxsSEJ1dHRvbiwgZmlsbFZCdXR0b247Ci0KLQkvKiBDb21tb24gZ3JvdXBzIGFuZCBjb21wb3NpdGVzICovCi0JQ29tcG9zaXRlIHRhYkZvbGRlclBhZ2U7Ci0JR3JvdXAgZXhhbXBsZUdyb3VwLCBjb250cm9sR3JvdXAsIGxpc3RlbmVyc0dyb3VwLCBvdGhlckdyb3VwLCBzaXplR3JvdXAsIHN0eWxlR3JvdXAsIGNvbG9yR3JvdXAsIGJhY2tncm91bmRNb2RlR3JvdXA7Ci0KLQkvKiBDb250cm9sbGluZyBpbnN0YW5jZSAqLwotCWZpbmFsIENvbnRyb2xFeGFtcGxlIGluc3RhbmNlOwotCi0JLyogU2l6aW5nIGNvbnN0YW50cyBmb3IgdGhlICJTaXplIiBncm91cCAqLwotCXN0YXRpYyBmaW5hbCBpbnQgVE9PX1NNQUxMX1NJWkUJPSAxMDsKLQlzdGF0aWMgZmluYWwgaW50IFNNQUxMX1NJWkUJCT0gNTA7Ci0Jc3RhdGljIGZpbmFsIGludCBMQVJHRV9TSVpFCQk9IDEwMDsKLQkKLQkvKiBSaWdodC10by1sZWZ0IHN1cHBvcnQgKi8KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBSVExfU1VQUE9SVF9FTkFCTEUgPSAid2luMzIiLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkgfHwgImd0ayIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKTsKLQlHcm91cCBvcmllbnRhdGlvbkdyb3VwOwotCUJ1dHRvbiBydGxCdXR0b24sIGx0ckJ1dHRvbiwgZGVmYXVsdE9yaWV0YXRpb25CdXR0b247Ci0KLQkvKiBDb250cm9scyBhbmQgcmVzb3VyY2VzIGZvciB0aGUgIkNvbG9ycyAmIEZvbnRzIiBncm91cCAqLwotCXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfU0laRSA9IDEyOwotCXN0YXRpYyBmaW5hbCBpbnQgRk9SRUdST1VORF9DT0xPUiA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBCQUNLR1JPVU5EX0NPTE9SID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IEZPTlQgPSAyOwotCVRhYmxlIGNvbG9yQW5kRm9udFRhYmxlOwotCUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nOwotCUZvbnREaWFsb2cgZm9udERpYWxvZzsKLQlDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQlGb250IGZvbnQ7Ci0JCi0JLyogQ29udHJvbHMgYW5kIHJlc291cmNlcyBmb3IgdGhlICJCYWNrZ3JvdW5kIE1vZGUiIGdyb3VwICovCi0JQ29tYm8gYmFja2dyb3VuZE1vZGVDb21ibzsKLQlCdXR0b24gYmFja2dyb3VuZE1vZGVJbWFnZUJ1dHRvbiwgYmFja2dyb3VuZE1vZGVDb2xvckJ1dHRvbjsKLQotCS8qIEV2ZW50IGxvZ2dpbmcgdmFyaWFibGVzIGFuZCBjb250cm9scyAqLwotCVRleHQgZXZlbnRDb25zb2xlOwotCWJvb2xlYW4gbG9nZ2luZyA9IGZhbHNlOwotCWJvb2xlYW4gW10gZXZlbnRzRmlsdGVyOwotCQotCS8qIFNldC9HZXQgQVBJIGNvbnRyb2xzICovCi0JQ29tYm8gbmFtZUNvbWJvOwotCUxhYmVsIHJldHVyblR5cGVMYWJlbDsKLQlCdXR0b24gZ2V0QnV0dG9uLCBzZXRCdXR0b247Ci0JVGV4dCBzZXRUZXh0LCBnZXRUZXh0OwotCi0Jc3RhdGljIGZpbmFsIE9iamVjdCBbXVtdIEVWRU5UX05BTUVTID0gewotCQl7IkFjdGl2YXRlIiwgbmV3IEludGVnZXIoU1dULkFjdGl2YXRlKX0sIAotCQl7IkFybSIsIG5ldyBJbnRlZ2VyKFNXVC5Bcm0pfSwgCi0JCXsiQ2xvc2UiLCBuZXcgSW50ZWdlcihTV1QuQ2xvc2UpfSwKLQkJeyJDb2xsYXBzZSIsIG5ldyBJbnRlZ2VyKFNXVC5Db2xsYXBzZSl9LAotCQl7IkRlYWN0aXZhdGUiLCBuZXcgSW50ZWdlcihTV1QuRGVhY3RpdmF0ZSl9LAotCQl7IkRlZmF1bHRTZWxlY3Rpb24iLCBuZXcgSW50ZWdlcihTV1QuRGVmYXVsdFNlbGVjdGlvbil9LAotCQl7IkRlaWNvbmlmeSIsIG5ldyBJbnRlZ2VyKFNXVC5EZWljb25pZnkpfSwgCi0JCXsiRGlzcG9zZSIsIG5ldyBJbnRlZ2VyKFNXVC5EaXNwb3NlKX0sCi0JCXsiRHJhZ0RldGVjdCIsIG5ldyBJbnRlZ2VyKFNXVC5EcmFnRGV0ZWN0KX0sIAotCQl7IkVyYXNlSXRlbSIsIG5ldyBJbnRlZ2VyKFNXVC5FcmFzZUl0ZW0pfSwKLQkJeyJFeHBhbmQiLCBuZXcgSW50ZWdlcihTV1QuRXhwYW5kKX0sIAotCQl7IkZvY3VzSW4iLCBuZXcgSW50ZWdlcihTV1QuRm9jdXNJbil9LCAKLQkJeyJGb2N1c091dCIsIG5ldyBJbnRlZ2VyKFNXVC5Gb2N1c091dCl9LAotCQl7IkhhcmRLZXlEb3duIiwgbmV3IEludGVnZXIoU1dULkhhcmRLZXlEb3duKX0sIAotCQl7IkhhcmRLZXlVcCIsIG5ldyBJbnRlZ2VyKFNXVC5IYXJkS2V5VXApfSwKLQkJeyJIZWxwIiwgbmV3IEludGVnZXIoU1dULkhlbHApfSwgCi0JCXsiSGlkZSIsIG5ldyBJbnRlZ2VyKFNXVC5IaWRlKX0sCi0JCXsiSWNvbmlmeSIsIG5ldyBJbnRlZ2VyKFNXVC5JY29uaWZ5KX0sIAotCQl7IktleURvd24iLCBuZXcgSW50ZWdlcihTV1QuS2V5RG93bil9LAotCQl7IktleVVwIiwgbmV3IEludGVnZXIoU1dULktleVVwKX0sCi0JCXsiTWVhc3VyZUl0ZW0iLCBuZXcgSW50ZWdlcihTV1QuTWVhc3VyZUl0ZW0pfSwKLQkJeyJNZW51RGV0ZWN0IiwgbmV3IEludGVnZXIoU1dULk1lbnVEZXRlY3QpfSwKLQkJeyJNb2RpZnkiLCBuZXcgSW50ZWdlcihTV1QuTW9kaWZ5KX0sIAotCQl7Ik1vdXNlRG91YmxlQ2xpY2siLCBuZXcgSW50ZWdlcihTV1QuTW91c2VEb3VibGVDbGljayl9LAotCQl7Ik1vdXNlRG93biIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZURvd24pfSwgCi0JCXsiTW91c2VFbnRlciIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUVudGVyKX0sIAotCQl7Ik1vdXNlRXhpdCIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUV4aXQpfSwgCi0JCXsiTW91c2VIb3ZlciIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUhvdmVyKX0sCi0JCXsiTW91c2VNb3ZlIiwgbmV3IEludGVnZXIoU1dULk1vdXNlTW92ZSl9LCAKLQkJeyJNb3VzZVVwIiwgbmV3IEludGVnZXIoU1dULk1vdXNlVXApfSwgCi0JCXsiTW91c2VXaGVlbCIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZVdoZWVsKX0sCi0JCXsiTW92ZSIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3ZlKX0sIAotCQl7IlBhaW50IiwgbmV3IEludGVnZXIoU1dULlBhaW50KX0sIAotCQl7IlBhaW50SXRlbSIsIG5ldyBJbnRlZ2VyKFNXVC5QYWludEl0ZW0pfSwKLQkJeyJSZXNpemUiLCBuZXcgSW50ZWdlcihTV1QuUmVzaXplKX0sIAotCQl7IlNlbGVjdGlvbiIsIG5ldyBJbnRlZ2VyKFNXVC5TZWxlY3Rpb24pfSwgCi0JCXsiU2V0RGF0YSIsIG5ldyBJbnRlZ2VyKFNXVC5TZXREYXRhKX0sCi0vLwkJeyJTZXR0aW5ncyIsIG5ldyBJbnRlZ2VyKFNXVC5TZXR0aW5ncyl9LCAgLy8gbm90ZTogdGhpcyBldmVudCBvbmx5IGdvZXMgdG8gRGlzcGxheQotCQl7IlNob3ciLCBuZXcgSW50ZWdlcihTV1QuU2hvdyl9LCAKLQkJeyJUcmF2ZXJzZSIsIG5ldyBJbnRlZ2VyKFNXVC5UcmF2ZXJzZSl9LCAKLQkJeyJWZXJpZnkiLCBuZXcgSW50ZWdlcihTV1QuVmVyaWZ5KX0sCi0JfTsKLQkKLQlib29sZWFuIHNhbXBsZVBvcHVwID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JVGFiKENvbnRyb2xFeGFtcGxlIGluc3RhbmNlKSB7Ci0JCXRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiQ29udHJvbCIgZ3JvdXAuICBUaGUgIkNvbnRyb2wiIGdyb3VwCi0JICogaXMgdHlwaWNhbGx5IHRoZSByaWdodCBoYW5kIGNvbHVtbiBpbiB0aGUgdGFiLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbEdyb3VwICgpIHsKLQkKLQkJLyoKLQkJICogQ3JlYXRlIHRoZSAiQ29udHJvbCIgZ3JvdXAuICBUaGlzIGlzIHRoZSBncm91cCBvbiB0aGUKLQkJICogcmlnaHQgaGFsZiBvZiBlYWNoIGV4YW1wbGUgdGFiLiAgSXQgY29uc2lzdHMgb2YgdGhlCi0JCSAqICJTdHlsZSIgZ3JvdXAsIHRoZSAiT3RoZXIiIGdyb3VwIGFuZCB0aGUgIlNpemUiIGdyb3VwLgotCQkgKi8JCi0JCWNvbnRyb2xHcm91cCA9IG5ldyBHcm91cCAodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSkpOwotCQljb250cm9sR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyYW1ldGVycyIpKTsKLQkKLQkJLyogQ3JlYXRlIGluZGl2aWR1YWwgZ3JvdXBzIGluc2lkZSB0aGUgIkNvbnRyb2wiIGdyb3VwICovCi0JCWNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCWNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCWNyZWF0ZVNldEdldEdyb3VwKCk7Ci0JCWNyZWF0ZVNpemVHcm91cCAoKTsKLQkJY3JlYXRlQ29sb3JBbmRGb250R3JvdXAgKCk7Ci0JCWlmIChydGxTdXBwb3J0KCkpIHsKLQkJCWNyZWF0ZU9yaWVudGF0aW9uR3JvdXAgKCk7Ci0JCX0KLQkKLQkJLyoKLQkJICogRm9yIGVhY2ggQnV0dG9uIGNoaWxkIGluIHRoZSBzdHlsZSBncm91cCwgYWRkIGEgc2VsZWN0aW9uCi0JCSAqIGxpc3RlbmVyIHRoYXQgd2lsbCByZWNyZWF0ZSB0aGUgZXhhbXBsZSBjb250cm9scy4gIElmIHRoZQotCQkgKiBzdHlsZSBncm91cCBidXR0b24gaXMgYSBSQURJTyBidXR0b24sIGVuc3VyZSB0aGF0IHRoZSByYWRpbwotCQkgKiBidXR0b24gaXMgc2VsZWN0ZWQgYmVmb3JlIHJlY3JlYXRpbmcgdGhlIGV4YW1wbGUgY29udHJvbHMuCi0JCSAqIFdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIFJBRElPIGJ1dHRvbiwgdGhlIGN1cnJlbnQgUkFESU8KLQkJICogYnV0dG9uIGluIHRoZSBncm91cCBpcyBkZXNlbGVjdGVkIGFuZCB0aGUgbmV3IFJBRElPIGJ1dHRvbgotCQkgKiBpcyBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5LiAgVGhlIGxpc3RlbmVycyBhcmUgbm90aWZpZWQgZm9yCi0JCSAqIGJvdGggdGhlc2Ugb3BlcmF0aW9ucyBidXQgdHlwaWNhbGx5IG9ubHkgZG8gd29yayB3aGVuIGEgUkFESU8KLQkJICogYnV0dG9uIGlzIHNlbGVjdGVkLgotCQkgKi8KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoKGV2ZW50LndpZGdldC5nZXRTdHlsZSAoKSAmIFNXVC5SQURJTykgIT0gMCkgewotCQkJCQlpZiAoISgoQnV0dG9uKSBldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbiAoKSkgcmV0dXJuOwotCQkJCX0KLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9OwotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gc3R5bGVHcm91cC5nZXRDaGlsZHJlbiAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4gW2ldIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0JCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGNoaWxkcmVuIFtpXTsKLQkJCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNoaWxkcmVuIFtpXSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJCQkvKiBMb29rIGRvd24gb25lIG1vcmUgbGV2ZWwgb2YgY2hpbGRyZW4gaW4gdGhlIHN0eWxlIGdyb3VwLiAqLwotCQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgY2hpbGRyZW4gW2ldOwotCQkJCQlDb250cm9sIFtdIGdyYW5kY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCQkJCWZvciAoaW50IGo9MDsgajxncmFuZGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAoZ3JhbmRjaGlsZHJlbiBbal0gaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQkJCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZ3JhbmRjaGlsZHJlbiBbal07Ci0JCQkJCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJ0bFN1cHBvcnQoKSkgewotCQkJcnRsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7IAotCQkJbHRyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7CQkKLQkJCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIHRoZSBTZXQvR2V0IEFQSSBjb250cm9scyB0byB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVNldEdldEdyb3VwKCkgewotCQkvKgotCQkgKiBDcmVhdGUgdGhlIGJ1dHRvbiB0byBhY2Nlc3Mgc2V0L2dldCBBUEkgZnVuY3Rpb25hbGl0eS4KLQkJICovCi0JCWZpbmFsIFN0cmluZyBbXSBtZXRob2ROYW1lcyA9IGdldE1ldGhvZE5hbWVzICgpOwotCQlpZiAobWV0aG9kTmFtZXMgIT0gbnVsbCkgewotCQkJQnV0dG9uIHNldEdldEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5QVVNIKTsKLQkJCXNldEdldEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNldF9HZXQiKSk7Ci0JCQlzZXRHZXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJc2V0R2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbillLndpZGdldDsKLQkJCQkJUG9pbnQgcHQgPSBidXR0b24uZ2V0TG9jYXRpb24oKTsKLQkJCQkJcHQgPSBlLmRpc3BsYXkubWFwKGJ1dHRvbiwgbnVsbCwgcHQpOwotCQkJCQlpZiAoZ2V0RXhhbXBsZVdpZGdldHMoKS5sZW5ndGggPiAgMCkgY3JlYXRlU2V0R2V0RGlhbG9nKHB0LngsIHB0LnksIG1ldGhvZE5hbWVzKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb250cm9sIiB3aWRnZXQgY2hpbGRyZW4uCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhdWdtZW50Ci0JICogdGhlIHN0YW5kYXJkIGNvbnRyb2xzIGNyZWF0ZWQgaW4gdGhlICJTdHlsZSIsCi0JICogIk90aGVyIiBhbmQgIlNpemUiIGdyb3Vwcy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkNvbG9ycyBhbmQgRm9udHMiIGdyb3VwLiBUaGlzIGlzIHR5cGljYWxseQotCSAqIGEgY2hpbGQgb2YgdGhlICJDb250cm9sIiBncm91cC4gU3ViY2xhc3NlcyBvdmVycmlkZQotCSAqIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBjb2xvciBhbmQgZm9udCBzZXR0aW5ncy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwICgpIHsKLQkJLyogQ3JlYXRlIHRoZSBncm91cC4gKi8KLQkJY29sb3JHcm91cCA9IG5ldyBHcm91cChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY29sb3JHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKSk7Ci0JCWNvbG9yR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQljb2xvckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ29sb3JzIikpOwotCQljb2xvckFuZEZvbnRUYWJsZSA9IG5ldyBUYWJsZShjb2xvckdyb3VwLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQkJY29sb3JBbmRGb250VGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJGb3JlZ3JvdW5kX0NvbG9yIikpOwotCQljb2xvckFuZEZvbnRUYWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJhY2tncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkZvbnQiKSk7Ci0JCUJ1dHRvbiBjaGFuZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChjb2xvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCWNoYW5nZUJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDaGFuZ2UiKSk7Ci0JCWNoYW5nZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCUJ1dHRvbiBkZWZhdWx0c0J1dHRvbiA9IG5ldyBCdXR0b24gKGNvbG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJZGVmYXVsdHNCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGVmYXVsdHMiKSk7Ci0JCWRlZmF1bHRzQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQotCQkvKiBBZGQgbGlzdGVuZXJzIHRvIHNldC9yZXNldCBjb2xvcnMgYW5kIGZvbnRzLiAqLwotCQljb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyAoc2hlbGwpOwotCQlmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2cgKHNoZWxsKTsKLQkJY29sb3JBbmRGb250VGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQljaGFuZ2VGb250T3JDb2xvciAoY29sb3JBbmRGb250VGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQl9Ci0JCX0pOwotCQljaGFuZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWNoYW5nZUZvbnRPckNvbG9yIChjb2xvckFuZEZvbnRUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCX0KLQkJfSk7Ci0JCWRlZmF1bHRzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVzZXRDb2xvcnNBbmRGb250cyAoKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGZvcmVncm91bmRDb2xvciAhPSBudWxsKSBmb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoZm9udCAhPSBudWxsKSBmb250LmRpc3Bvc2UoKTsKLQkJCQlmb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCQkJZm9udCA9IG51bGw7Ci0JCQkJaWYgKGNvbG9yQW5kRm9udFRhYmxlICE9IG51bGwgJiYgIWNvbG9yQW5kRm9udFRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IGl0ZW1zW2ldLmdldEltYWdlKCk7Ci0JCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0Jdm9pZCBjaGFuZ2VGb250T3JDb2xvcihpbnQgaW5kZXgpIHsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBGT1JFR1JPVU5EX0NPTE9SOiB7Ci0JCQkJQ29sb3Igb2xkQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJCQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA+IDApIG9sZENvbG9yID0gY29udHJvbHMgWzBdLmdldEZvcmVncm91bmQgKCk7Ci0JCQkJfQotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBjb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOyAvLyBzZWVkIGRpYWxvZyB3aXRoIGN1cnJlbnQgY29sb3IKLQkJCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJCW9sZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOyAvLyBzYXZlIG9sZCBmb3JlZ3JvdW5kIGNvbG9yIHRvIGRpc3Bvc2Ugd2hlbiBkb25lCi0JCQkJZm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yIChkaXNwbGF5LCByZ2IpOwotCQkJCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCQljYXNlIEJBQ0tHUk9VTkRfQ09MT1I6IHsKLQkJCQlDb2xvciBvbGRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkQ29sb3IgPSBjb250cm9scyBbMF0uZ2V0QmFja2dyb3VuZCAoKTsgLy8gc2VlZCBkaWFsb2cgd2l0aCBjdXJyZW50IGNvbG9yCi0JCQkJfQotCQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBjb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJb2xkQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7IC8vIHNhdmUgb2xkIGJhY2tncm91bmQgY29sb3IgdG8gZGlzcG9zZSB3aGVuIGRvbmUKLQkJCQliYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGRpc3BsYXksIHJnYik7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCWNhc2UgRk9OVDogewotCQkJCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCQkJaWYgKG9sZEZvbnQgPT0gbnVsbCkgewotCQkJCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotCQkJCQlpZiAoY29udHJvbHMubGVuZ3RoID4gMCkgb2xkRm9udCA9IGNvbnRyb2xzIFswXS5nZXRGb250ICgpOwotCQkJCX0KLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7IC8vIHNlZWQgZGlhbG9nIHdpdGggY3VycmVudCBmb250Ci0JCQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4gKCk7Ci0JCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCQlvbGRGb250ID0gZm9udDsgLy8gZGlzcG9zZSBvbGQgZm9udCB3aGVuIGRvbmUKLQkJCQlmb250ID0gbmV3IEZvbnQgKGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJPdGhlciIgZ3JvdXAuICBUaGlzIGlzIHR5cGljYWxseQotCSAqIGEgY2hpbGQgb2YgdGhlICJDb250cm9sIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCW90aGVyR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlvdGhlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlvdGhlckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJb3RoZXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3RoZXIiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgY29udHJvbHMgKi8KLQkJZW5hYmxlZEJ1dHRvbiA9IG5ldyBCdXR0b24ob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJZW5hYmxlZEJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJFbmFibGVkIikpOwotCQl2aXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbihvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQl2aXNpYmxlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlZpc2libGUiKSk7Ci0JCWJhY2tncm91bmRJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24ob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJYmFja2dyb3VuZEltYWdlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2tncm91bmRJbWFnZSIpKTsKLQkJcG9wdXBNZW51QnV0dG9uID0gbmV3IEJ1dHRvbihvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlwb3B1cE1lbnVCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUG9wdXBNZW51IikpOwotCQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJZW5hYmxlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEVuYWJsZWQgKCk7Ci0JCQl9Ci0JCX0pOwotCQl2aXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0VmlzaWJpbGl0eSAoKTsKLQkJCX0KLQkJfSk7Ci0JCWJhY2tncm91bmRJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmRJbWFnZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCXBvcHVwTWVudUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFBvcHVwTWVudSAoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQllbmFibGVkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdmlzaWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJhY2tncm91bmRJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlwb3B1cE1lbnVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkJhY2tncm91bmQgTW9kZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVCYWNrZ3JvdW5kTW9kZUdyb3VwICgpIHsKLQkJLy8gbm90ZSB0aGF0IHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGFmdGVyIGNyZWF0ZUV4YW1wbGVXaWRnZXRzCi0JCWlmIChnZXRFeGFtcGxlQ29udHJvbHMgKCkubGVuZ3RoID09IDApIHJldHVybjsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZ3JvdXAgKi8KLQkJYmFja2dyb3VuZE1vZGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWJhY2tncm91bmRNb2RlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWJhY2tncm91bmRNb2RlR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQliYWNrZ3JvdW5kTW9kZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCYWNrZ3JvdW5kX01vZGUiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgY29udHJvbHMgKi8KLQkJYmFja2dyb3VuZE1vZGVDb21ibyA9IG5ldyBDb21ibyhiYWNrZ3JvdW5kTW9kZUdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJYmFja2dyb3VuZE1vZGVDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyJTV1QuSU5IRVJJVF9OT05FIiwgIlNXVC5JTkhFUklUX0RFRkFVTFQiLCAiU1dULklOSEVSSVRfRk9SQ0UifSk7Ci0JCWJhY2tncm91bmRNb2RlSW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGJhY2tncm91bmRNb2RlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWJhY2tncm91bmRNb2RlSW1hZ2VCdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQmFja2dyb3VuZEltYWdlIikpOwotCQliYWNrZ3JvdW5kTW9kZUNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihiYWNrZ3JvdW5kTW9kZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQliYWNrZ3JvdW5kTW9kZUNvbG9yQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2tncm91bmRDb2xvciIpKTsKLQkKLQkJLyogQWRkIHRoZSBsaXN0ZW5lcnMgKi8KLQkJYmFja2dyb3VuZE1vZGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZUdyb3VwQmFja2dyb3VuZE1vZGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQliYWNrZ3JvdW5kTW9kZUltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kSW1hZ2UgKCk7Ci0JCQl9Ci0JCX0pOwotCQliYWNrZ3JvdW5kTW9kZUNvbG9yQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kQ29sb3IgKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQkvKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgKi8KLQkJYmFja2dyb3VuZE1vZGVDb21iby5zZXRUZXh0KGJhY2tncm91bmRNb2RlQ29tYm8uZ2V0SXRlbSgwKSk7Ci0JCWJhY2tncm91bmRNb2RlSW1hZ2VCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJYmFja2dyb3VuZE1vZGVDb2xvckJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV2ZW50IGNvbnNvbGUgcG9wdXAgbWVudS4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV2ZW50Q29uc29sZVBvcHVwICgpIHsKLQkJTWVudSBwb3B1cCA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JCWV2ZW50Q29uc29sZS5zZXRNZW51IChwb3B1cCk7Ci0KLQkJTWVudUl0ZW0gY3V0ID0gbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlBVU0gpOwotCQljdXQuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX0N1dCIpKTsKLQkJY3V0LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnRDb25zb2xlLmN1dCAoKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnVJdGVtIGNvcHkgPSBuZXcgTWVudUl0ZW0gKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCWNvcHkuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX0NvcHkiKSk7Ci0JCWNvcHkuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudENvbnNvbGUuY29weSAoKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnVJdGVtIHBhc3RlID0gbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlBVU0gpOwotCQlwYXN0ZS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWVudUl0ZW1fUGFzdGUiKSk7Ci0JCXBhc3RlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnRDb25zb2xlLnBhc3RlICgpOwotCQkJfQotCQl9KTsKLQkJbmV3IE1lbnVJdGVtIChwb3B1cCwgU1dULlNFUEFSQVRPUik7Ci0JCU1lbnVJdGVtIHNlbGVjdEFsbCA9IG5ldyBNZW51SXRlbSAocG9wdXAsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1lbnVJdGVtX1NlbGVjdEFsbCIpKTsKLQkJc2VsZWN0QWxsLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXZlbnRDb25zb2xlLnNlbGVjdEFsbCAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLiAgVGhlICJFeGFtcGxlIiBncm91cAotCSAqIGlzIHR5cGljYWxseSB0aGUgbGVmdCBoYW5kIGNvbHVtbiBpbiB0aGUgdGFiLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJZXhhbXBsZUdyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWV4YW1wbGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJZXhhbXBsZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4gb2YgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcGFydGljdWxhcgotCSAqIGV4YW1wbGUgY29udHJvbC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyogRG8gbm90aGluZyAqLwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgIkxpc3RlbmVyIHNlbGVjdGlvbiIgZGlhbG9nLgotCSAqLwotCXZvaWQgY3JlYXRlTGlzdGVuZXJTZWxlY3Rpb25EaWFsb2cgKCkgewotCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuUkVTSVpFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJZGlhbG9nLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0X0xpc3RlbmVycyIpKTsKLQkJZGlhbG9nLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKSk7Ci0JCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChkaWFsb2csIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9OQU1FUy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0ICgoU3RyaW5nKUVWRU5UX05BTUVTW2ldWzBdKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZCAoZXZlbnRzRmlsdGVyW2ldKTsKLQkJfQotCQlmaW5hbCBTdHJpbmcgW10gY3VzdG9tTmFtZXMgPSBnZXRDdXN0b21FdmVudE5hbWVzICgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKGN1c3RvbU5hbWVzW2ldKTsKLQkJCWl0ZW0uc2V0Q2hlY2tlZCAoZXZlbnRzRmlsdGVyW0VWRU5UX05BTUVTLmxlbmd0aCArIGldKTsKLQkJfQotCQlCdXR0b24gc2VsZWN0QWxsID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbC5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiU2VsZWN0X0FsbCIpKTsKLQkJc2VsZWN0QWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9OQU1FUy5sZW5ndGg7IGkrKykgewotCQkJCQlpdGVtc1tpXS5zZXRDaGVja2VkKHRydWUpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWl0ZW1zW0VWRU5UX05BTUVTLmxlbmd0aCArIGldLnNldENoZWNrZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJQnV0dG9uIGRlc2VsZWN0QWxsID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJEZXNlbGVjdF9BbGwiKSk7Ci0JCWRlc2VsZWN0QWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlkZXNlbGVjdEFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEVWRU5UX05BTUVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWl0ZW1zW2ldLnNldENoZWNrZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWl0ZW1zW0VWRU5UX05BTUVTLmxlbmd0aCArIGldLnNldENoZWNrZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCW5ldyBMYWJlbChkaWFsb2csIFNXVC5OT05FKTsgLyogRmlsbGVyICovCi0JCUJ1dHRvbiBvayA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCQlvay5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiT0siKSk7Ci0JCWRpYWxvZy5zZXREZWZhdWx0QnV0dG9uKG9rKTsKLQkJb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZXZlbnRzRmlsdGVyW2ldID0gaXRlbXNbaV0uZ2V0Q2hlY2tlZCgpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWV2ZW50c0ZpbHRlcltFVkVOVF9OQU1FUy5sZW5ndGggKyBpXSA9IGl0ZW1zW0VWRU5UX05BTUVTLmxlbmd0aCArIGldLmdldENoZWNrZWQoKTsKLQkJCQl9Ci0JCQkJZGlhbG9nLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5wYWNrICgpOwotCQkvKgotCQkgKiBJZiB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGRpYWxvZyBpcyB0b28gdGFsbCBmb3IgdGhlIHNjcmVlbiwKLQkJICogdGhlbiByZWR1Y2UgdGhlIGhlaWdodCwgc28gdGhhdCB0aGUgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYXBwZWFyLgotCQkgKi8KLQkJUG9pbnQgc2l6ZSA9IGRpYWxvZy5nZXRTaXplKCk7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCQlpZiAoc2l6ZS55ID4gYm91bmRzLmhlaWdodCkgewotCQkJZGlhbG9nLnNldFNpemUoc2l6ZS54LCBib3VuZHMuaGVpZ2h0KTsKLQkJfQotCQlkaWFsb2cub3BlbiAoKTsKLQkJd2hpbGUgKCEgZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkxpc3RlbmVycyIgZ3JvdXAuICBUaGUgIkxpc3RlbmVycyIgZ3JvdXAKLQkgKiBnb2VzIGJlbG93IHRoZSAiRXhhbXBsZSIgYW5kICJDb250cm9sIiBncm91cHMuCi0JICovCi0Jdm9pZCBjcmVhdGVMaXN0ZW5lcnNHcm91cCAoKSB7Ci0JCWxpc3RlbmVyc0dyb3VwID0gbmV3IEdyb3VwICh0YWJGb2xkZXJQYWdlLCBTV1QuTk9ORSk7Ci0JCWxpc3RlbmVyc0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDMsIGZhbHNlKSk7Ci0JCWxpc3RlbmVyc0dyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JCWxpc3RlbmVyc0dyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTGlzdGVuZXJzIikpOwotCi0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgYnV0dG9uIHRvIGFjY2VzcyB0aGUgJ0xpc3RlbmVycycgZGlhbG9nLgotCQkgKi8KLQkJQnV0dG9uIGxpc3RlbmVyc0J1dHRvbiA9IG5ldyBCdXR0b24gKGxpc3RlbmVyc0dyb3VwLCBTV1QuUFVTSCk7Ci0JCWxpc3RlbmVyc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlNlbGVjdF9MaXN0ZW5lcnMiKSk7Ci0JCWxpc3RlbmVyc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNyZWF0ZUxpc3RlbmVyU2VsZWN0aW9uRGlhbG9nICgpOwotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLyoKLQkJICogQ3JlYXRlIHRoZSBjaGVja2JveCB0byBhZGQvcmVtb3ZlIGxpc3RlbmVycyB0by9mcm9tIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JCSAqLwotCQlmaW5hbCBCdXR0b24gbGlzdGVuQ2hlY2tib3ggPSBuZXcgQnV0dG9uIChsaXN0ZW5lcnNHcm91cCwgU1dULkNIRUNLKTsKLQkJbGlzdGVuQ2hlY2tib3guc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJMaXN0ZW4iKSk7Ci0JCWxpc3RlbkNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbG9nZ2luZyA9IGxpc3RlbkNoZWNrYm94LmdldFNlbGVjdGlvbiAoKTsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQotCQkvKgotCQkgKiBDcmVhdGUgdGhlIGJ1dHRvbiB0byBjbGVhciB0aGUgdGV4dC4KLQkJICovCi0JCUJ1dHRvbiBjbGVhckJ1dHRvbiA9IG5ldyBCdXR0b24gKGxpc3RlbmVyc0dyb3VwLCBTV1QuUFVTSCk7Ci0JCWNsZWFyQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2xlYXIiKSk7Ci0JCWNsZWFyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWNsZWFyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXZlbnRDb25zb2xlLnNldFRleHQgKCIiKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvKiBJbml0aWFsaXplIHRoZSBldmVudHNGaWx0ZXIgdG8gbG9nIGFsbCBldmVudHMuICovCi0JCWludCBjdXN0b21FdmVudENvdW50ID0gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKS5sZW5ndGg7Ci0JCWV2ZW50c0ZpbHRlciA9IG5ldyBib29sZWFuIFtFVkVOVF9OQU1FUy5sZW5ndGggKyBjdXN0b21FdmVudENvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFVkVOVF9OQU1FUy5sZW5ndGggKyBjdXN0b21FdmVudENvdW50OyBpKyspIHsKLQkJCWV2ZW50c0ZpbHRlciBbaV0gPSB0cnVlOwotCQl9Ci0KLQkJLyogQ3JlYXRlIHRoZSBldmVudCBjb25zb2xlIFRleHQuICovCi0JCWV2ZW50Q29uc29sZSA9IG5ldyBUZXh0IChsaXN0ZW5lcnNHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJZXZlbnRDb25zb2xlLnNldExheW91dERhdGEgKGRhdGEpOwotCQljcmVhdGVFdmVudENvbnNvbGVQb3B1cCAoKTsKLQkJZXZlbnRDb25zb2xlLmFkZEtleUxpc3RlbmVyIChuZXcgS2V5QWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkIChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKChlLmtleUNvZGUgPT0gJ0EnIHx8IGUua2V5Q29kZSA9PSAnYScpICYmIChlLnN0YXRlTWFzayAmIFNXVC5NT0QxKSAhPSAwKSB7Ci0JCQkJCWV2ZW50Q29uc29sZS5zZWxlY3RBbGwgKCk7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQl2b2lkIGNyZWF0ZVNldEdldERpYWxvZyhpbnQgeCwgaW50IHksIFN0cmluZ1tdIG1ldGhvZE5hbWVzKSB7Ci0JCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5NT0RFTEVTUyk7Ci0JCWRpYWxvZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZGlhbG9nLnNldFRleHQoZ2V0VGFiVGV4dCgpICsgIiAiICsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJTZXRfR2V0IikpOwotCQluYW1lQ29tYm8gPSBuZXcgQ29tYm8oZGlhbG9nLCBTV1QuUkVBRF9PTkxZKTsKLQkJbmFtZUNvbWJvLnNldEl0ZW1zKG1ldGhvZE5hbWVzKTsKLQkJbmFtZUNvbWJvLnNldFRleHQobWV0aG9kTmFtZXNbMF0pOwotCQluYW1lQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudChtZXRob2ROYW1lcy5sZW5ndGgpOwotCQluYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQluYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVzZXRMYWJlbHMoKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVyblR5cGVMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2csIFNXVC5OT05FKTsKLQkJcmV0dXJuVHlwZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpKTsKLQkJc2V0QnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2csIFNXVC5QVVNIKTsKLQkJc2V0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpKTsKLQkJc2V0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldFZhbHVlKCk7Ci0JCQkJc2V0VGV4dC5zZWxlY3RBbGwoKTsKLQkJCQlzZXRUZXh0LnNldEZvY3VzKCk7Ci0JCQl9Ci0JCX0pOwotCQlzZXRUZXh0ID0gbmV3IFRleHQoZGlhbG9nLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXNldFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlnZXRCdXR0b24gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlBVU0gpOwotCQlnZXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSkpOwotCQlnZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfSk7Ci0JCWdldFRleHQgPSBuZXcgVGV4dChkaWFsb2csIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlkYXRhLndpZHRoSGludCA9IDI0MDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMjAwOwotCQlnZXRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJlc2V0TGFiZWxzKCk7Ci0JCWRpYWxvZy5zZXREZWZhdWx0QnV0dG9uKHNldEJ1dHRvbik7Ci0JCWRpYWxvZy5wYWNrKCk7Ci0JCWRpYWxvZy5zZXRMb2NhdGlvbih4LCB5KTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQl2b2lkIHJlc2V0TGFiZWxzKCkgewotCQlTdHJpbmcgbWV0aG9kUm9vdCA9IG5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCXJldHVyblR5cGVMYWJlbC5zZXRUZXh0KHBhcmFtZXRlckluZm8obWV0aG9kUm9vdCkpOwotCQlzZXRCdXR0b24uc2V0VGV4dChzZXRNZXRob2ROYW1lKG1ldGhvZFJvb3QpKTsKLQkJZ2V0QnV0dG9uLnNldFRleHQoImdldCIgKyBtZXRob2RSb290KTsKLQkJc2V0VGV4dC5zZXRUZXh0KCIiKTsKLQkJZ2V0VGV4dC5zZXRUZXh0KCIiKTsKLQkJZ2V0VmFsdWUoKTsKLQkJc2V0VGV4dC5zZXRGb2N1cygpOwotCX0KLQotCVN0cmluZyBzZXRNZXRob2ROYW1lKFN0cmluZyBtZXRob2RSb290KSB7Ci0JCXJldHVybiAic2V0IiArIG1ldGhvZFJvb3Q7Ci0JfQotCi0JU3RyaW5nIHBhcmFtZXRlckluZm8oU3RyaW5nIG1ldGhvZFJvb3QpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJQ2xhc3MgcmV0dXJuVHlwZSA9IGdldFJldHVyblR5cGUobWV0aG9kUm9vdCk7Ci0JCWJvb2xlYW4gaXNBcnJheSA9IHJldHVyblR5cGUuaXNBcnJheSgpOwotCQlpZiAoaXNBcnJheSkgewotCQkJdHlwZU5hbWUgPSByZXR1cm5UeXBlLmdldENvbXBvbmVudFR5cGUoKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlTmFtZSA9IHJldHVyblR5cGUuZ2V0TmFtZSgpOwotCQl9Ci0JCVN0cmluZyB0eXBlTmFtZVN0cmluZyA9IHR5cGVOYW1lOwotCQlpbnQgaW5kZXggPSB0eXBlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXgrMSA8IHR5cGVOYW1lLmxlbmd0aCgpKSB0eXBlTmFtZVN0cmluZyA9IHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKLQkJU3RyaW5nIGluZm8gPSBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5mb18iICsgdHlwZU5hbWVTdHJpbmcgKyAoaXNBcnJheSA/ICJBIiA6ICIiKSk7Ci0JCWlmIChpc0FycmF5KSB7Ci0JCQl0eXBlTmFtZVN0cmluZyArPSAiW10iOwotCQl9Ci0JCXJldHVybiBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGFyYW1ldGVyX0luZm8iLCBuZXcgT2JqZWN0W10ge3R5cGVOYW1lU3RyaW5nLCBpbmZvfSk7Ci0JfQotCi0Jdm9pZCBnZXRWYWx1ZSgpIHsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAiZ2V0IiArIG5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCWdldFRleHQuc2V0VGV4dCgiIik7Ci0JCVdpZGdldFtdIHdpZGdldHMgPSBnZXRFeGFtcGxlV2lkZ2V0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IHdpZGdldHNbaV0uZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbnVsbCk7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IG1ldGhvZC5pbnZva2Uod2lkZ2V0c1tpXSwgbnVsbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCWdldFRleHQuYXBwZW5kKCJudWxsIik7Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLQkJCQkJaW50IGxlbmd0aCA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5LmdldExlbmd0aChyZXN1bHQpOwotCQkJCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCQkJCWdldFRleHQuYXBwZW5kKHJlc3VsdC5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSArICJbMF0iKTsKLQkJCQkJfQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0JCQkJCQlnZXRUZXh0LmFwcGVuZChqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5nZXQocmVzdWx0LGopLnRvU3RyaW5nKCkgKyAiXG4iKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWdldFRleHQuYXBwZW5kKHJlc3VsdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWdldFRleHQuYXBwZW5kKGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoaSArIDEgPCB3aWRnZXRzLmxlbmd0aCkgewotCQkJCWdldFRleHQuYXBwZW5kKCJcblxuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlDbGFzcyBnZXRSZXR1cm5UeXBlKFN0cmluZyBtZXRob2RSb290KSB7Ci0JCUNsYXNzIHJldHVyblR5cGUgPSBudWxsOwotCQlTdHJpbmcgbWV0aG9kTmFtZSA9ICJnZXQiICsgbWV0aG9kUm9vdDsKLQkJV2lkZ2V0W10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzKCk7Ci0JCXRyeSB7Ci0JCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gd2lkZ2V0c1swXS5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBudWxsKTsKLQkJCXJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiByZXR1cm5UeXBlOwotCX0KLQkKLQl2b2lkIHNldFZhbHVlKCkgewotCQkvKiBUaGUgcGFyYW1ldGVyIHR5cGUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgZ2V0IG1ldGhvZCdzIHJldHVybiB0eXBlICovCi0JCVN0cmluZyBtZXRob2RSb290ID0gbmFtZUNvbWJvLmdldFRleHQoKTsKLQkJQ2xhc3MgcmV0dXJuVHlwZSA9IGdldFJldHVyblR5cGUobWV0aG9kUm9vdCk7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gc2V0TWV0aG9kTmFtZShtZXRob2RSb290KTsKLQkJU3RyaW5nIHZhbHVlID0gc2V0VGV4dC5nZXRUZXh0KCk7Ci0JCVdpZGdldFtdIHdpZGdldHMgPSBnZXRFeGFtcGxlV2lkZ2V0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IHdpZGdldHNbaV0uZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3JldHVyblR5cGV9KTsKLQkJCQlTdHJpbmcgdHlwZU5hbWUgPSByZXR1cm5UeXBlLmdldE5hbWUoKTsKLQkJCQlPYmplY3RbXSBwYXJhbWV0ZXIgPSBudWxsOwotCQkJCWlmICh2YWx1ZS5lcXVhbHMoIm51bGwiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge251bGx9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJpbnQiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKHZhbHVlKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImxvbmciKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBMb25nKHZhbHVlKX07Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoImNoYXIiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge3ZhbHVlLmxlbmd0aCgpID09IDEgPyBuZXcgQ2hhcmFjdGVyKHZhbHVlLmNoYXJBdCgwKSkgOiBuZXcgQ2hhcmFjdGVyKCdcMCcpfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7bmV3IEJvb2xlYW4odmFsdWUpfTsKLQkJCQl9IGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscygiamF2YS5sYW5nLlN0cmluZyIpKSB7Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7dmFsdWV9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQiKSkgewotCQkJCQlTdHJpbmcgeHlbXSA9IHNwbGl0KHZhbHVlLCAnLCcpOwotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge25ldyBQb2ludChuZXcgSW50ZWdlcih4eVswXSkuaW50VmFsdWUoKSxuZXcgSW50ZWdlcih4eVsxXSkuaW50VmFsdWUoKSl9OwotCQkJCX0gZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKCJbSSIpKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmdzW10gPSBzcGxpdCh2YWx1ZSwgJywnKTsKLQkJCQkJaW50W10gaW50cyA9IG5ldyBpbnRbc3RyaW5ncy5sZW5ndGhdOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0cmluZ3MubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWludHNbal0gPSBuZXcgSW50ZWdlcihzdHJpbmdzW2pdKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCXBhcmFtZXRlciA9IG5ldyBPYmplY3RbXSB7aW50c307Ci0JCQkJfSBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoIltMamF2YS5sYW5nLlN0cmluZzsiKSkgewotCQkJCQlwYXJhbWV0ZXIgPSBuZXcgT2JqZWN0W10ge3NwbGl0KHZhbHVlLCAnLCcpfTsKLQkJCQl9IGVsc2UgewotCQkJCQlwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgd2lkZ2V0c1tpXSk7Ci0JCQkJfQotCQkJCW1ldGhvZC5pbnZva2Uod2lkZ2V0c1tpXSwgcGFyYW1ldGVyKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOwotCQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJZ2V0VGV4dC5zZXRUZXh0KGUudG9TdHJpbmcoKSk7Ci0JCQkJaWYgKGNhdXNlICE9IG51bGwpIGdldFRleHQuYXBwZW5kKCIsIGNhdXNlPVxuIiArIGNhdXNlLnRvU3RyaW5nKCkpOwotCQkJCWlmIChtZXNzYWdlICE9IG51bGwpIGdldFRleHQuYXBwZW5kKCIsIG1lc3NhZ2U9XG4iICsgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlPYmplY3RbXSBwYXJhbWV0ZXJGb3JUeXBlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHZhbHVlLCBXaWRnZXQgd2lkZ2V0KSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10ge3ZhbHVlfTsKLQl9Ci0KLQl2b2lkIGNyZWF0ZU9yaWVudGF0aW9uR3JvdXAgKCkgewotCQkvKiBDcmVhdGUgT3JpZW50YXRpb24gZ3JvdXAqLwotCQlvcmllbnRhdGlvbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJb3JpZW50YXRpb25Hcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0KCkpOwotCQlvcmllbnRhdGlvbkdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJb3JpZW50YXRpb25Hcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3JpZW50YXRpb24iKSk7Ci0JCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAob3JpZW50YXRpb25Hcm91cCwgU1dULlJBRElPKTsKLQkJZGVmYXVsdE9yaWV0YXRpb25CdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlZmF1bHQiKSk7Ci0JCWRlZmF1bHRPcmlldGF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCWx0ckJ1dHRvbiA9IG5ldyBCdXR0b24gKG9yaWVudGF0aW9uR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWx0ckJ1dHRvbi5zZXRUZXh0ICgiU1dULkxFRlRfVE9fUklHSFQiKTsKLQkJcnRsQnV0dG9uID0gbmV3IEJ1dHRvbiAob3JpZW50YXRpb25Hcm91cCwgU1dULlJBRElPKTsKLQkJcnRsQnV0dG9uLnNldFRleHQgKCJTV1QuUklHSFRfVE9fTEVGVCIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU2l6ZSIgZ3JvdXAuICBUaGUgIlNpemUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHNpemUgb2YKLQkgKiB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsKLQkJLyogQ3JlYXRlIHRoZSBncm91cCAqLwotCQlzaXplR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlzaXplR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCgpKTsKLQkJc2l6ZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJc2l6ZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTaXplIikpOwotCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRyb2xzICovCi0JCi0JCS8qCi0JCSAqIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiBhIHdpZGdldCBpcyB0aGUgc2l6ZSByZXR1cm5lZAotCQkgKiBieSB3aWRnZXQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkuCi0JCSAqIFRoaXMgc2l6ZSBpcyBkZWZpbmVkIG9uIGEgd2lkZ2V0IGJ5IHdpZGdldCBiYXNpcy4KLQkJICogTWFueSB3aWRnZXRzIHdpbGwgYXR0ZW1wdCB0byBkaXNwbGF5IHRoZWlyIGNvbnRlbnRzLgotCQkgKi8KLQkJcHJlZmVycmVkQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuUkFESU8pOwotCQlwcmVmZXJyZWRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlByZWZlcnJlZCIpKTsKLQkJdG9vU21hbGxCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvb1NtYWxsQnV0dG9uLnNldFRleHQgKFRPT19TTUFMTF9TSVpFICsgIiBYICIgKyBUT09fU01BTExfU0laRSk7Ci0JCXNtYWxsQnV0dG9uID0gbmV3IEJ1dHRvbihzaXplR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNtYWxsQnV0dG9uLnNldFRleHQgKFNNQUxMX1NJWkUgKyAiIFggIiArIFNNQUxMX1NJWkUpOwotCQlsYXJnZUJ1dHRvbiA9IG5ldyBCdXR0b24gKHNpemVHcm91cCwgU1dULlJBRElPKTsKLQkJbGFyZ2VCdXR0b24uc2V0VGV4dCAoTEFSR0VfU0laRSArICIgWCAiICsgTEFSR0VfU0laRSk7Ci0JCWZpbGxIQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmaWxsSEJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsbF9YIikpOwotCQlmaWxsVkJ1dHRvbiA9IG5ldyBCdXR0b24gKHNpemVHcm91cCwgU1dULkNIRUNLKTsKLQkJZmlsbFZCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxfWSIpKTsKLQkJCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfTsKLQkJcHJlZmVycmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdG9vU21hbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzbWFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWxhcmdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZmlsbEhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlmaWxsVkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCi0JCS8qIFNldCB0aGUgZGVmYXVsdCBzdGF0ZSAqLwotCQlwcmVmZXJyZWRCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4gIFRoZSAiU3R5bGUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHN0eWxlIG9mCi0JICogdGhlIGV4YW1wbGUgd2lkZ2V0cy4gIENoYW5naW5nIGEgd2lkZ2V0ICJTdHlsZSIgY2F1c2VzCi0JICogdGhlIHdpZGdldCB0byBiZSBkZXN0cm95ZWQgYW5kIHJlY3JlYXRlZC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAgKCkgewotCQlzdHlsZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJc3R5bGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCXN0eWxlR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0eWxlcyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZSBmb3IgdGhlIHRhYiBmb2xkZXIKLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlVGFiRm9sZGVyUGFnZSAoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQkvKiBDYWNoZSB0aGUgc2hlbGwgYW5kIGRpc3BsYXkuICovCi0JCXNoZWxsID0gdGFiRm9sZGVyLmdldFNoZWxsICgpOwotCQlkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIHR3byBjb2x1bW4gcGFnZS4gKi8KLQkJdGFiRm9sZGVyUGFnZSA9IG5ldyBDb21wb3NpdGUgKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQl0YWJGb2xkZXJQYWdlLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgIkV4YW1wbGUiIGFuZCAiQ29udHJvbCIgZ3JvdXBzLiAqLwotCQljcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCWNyZWF0ZUNvbnRyb2xHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgIkxpc3RlbmVycyIgZ3JvdXAgdW5kZXIgdGhlICJDb250cm9sIiBncm91cC4gKi8KLQkJY3JlYXRlTGlzdGVuZXJzR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIGV4YW1wbGUgYW5kIGNvbnRyb2wgd2lkZ2V0cy4gKi8KLQkJY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCWhvb2tFeGFtcGxlV2lkZ2V0TGlzdGVuZXJzICgpOwotCQljcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY3JlYXRlQmFja2dyb3VuZE1vZGVHcm91cCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpOwotCQkKLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCQotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFBvcHVwTWVudSgpIHsKLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIENvbnRyb2wgY29udHJvbCA9IGNvbnRyb2xzIFtpXTsKLQkJCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULk1lbnVEZXRlY3QsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkgICAgICAgIAlNZW51IG1lbnUgPSBjb250cm9sLmdldE1lbnUoKTsKLQkJICAgICAgICAJaWYgKG1lbnUgIT0gbnVsbCAmJiBzYW1wbGVQb3B1cCkgewotCQkgICAgICAgIAkJbWVudS5kaXNwb3NlKCk7Ci0JCSAgICAgICAgCQltZW51ID0gbnVsbDsKLQkJICAgICAgICAJfQotCQkgICAgICAgIAlpZiAobWVudSA9PSBudWxsICYmIHBvcHVwTWVudUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJICAgICAgICAJbWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJCSAgICAgICAgCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJICAgICAgICAJaXRlbS5zZXRUZXh0KCJTYW1wbGUgcG9wdXAgbWVudSBpdGVtIik7Ci0JCQkgICAgICAgIAlzcGVjaWFsUG9wdXBNZW51SXRlbXMobWVudSwgZXZlbnQpOwotCQkJICAgICAgICAJY29udHJvbC5zZXRNZW51KG1lbnUpOwotCQkgICAgICAgIAkJc2FtcGxlUG9wdXAgPSB0cnVlOwotCQkgICAgICAgIAl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWFsUG9wdXBNZW51SXRlbXMoZmluYWwgTWVudSBtZW51LCBmaW5hbCBFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCVdpZGdldCBbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx3aWRnZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3aWRnZXRzIFtpXS5kaXNwb3NlICgpOwotCQl9Ci0JfQotCQotCUltYWdlIGNvbG9ySW1hZ2UgKENvbG9yIGNvbG9yKSB7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBJTUFHRV9TSVpFLCBJTUFHRV9TSVpFKTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGggLSAxLCBib3VuZHMuaGVpZ2h0IC0gMSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQlJbWFnZSBmb250SW1hZ2UgKEZvbnQgZm9udCkgewotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgSU1BR0VfU0laRSwgSU1BR0VfU0laRSk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCAtIDEsIGJvdW5kcy5oZWlnaHQgLSAxKTsKLQkJRm9udERhdGEgZGF0YVtdID0gZm9udC5nZXRGb250RGF0YSgpOwotCQlpbnQgc3R5bGUgPSBkYXRhWzBdLmdldFN0eWxlKCk7Ci0JCXN3aXRjaCAoc3R5bGUpIHsKLQkJY2FzZSBTV1QuTk9STUFMOgotCQkJZ2MuZHJhd0xpbmUoMywgMywgMywgOCk7Ci0JCQlnYy5kcmF3TGluZSg0LCAzLCA3LCA4KTsKLQkJCWdjLmRyYXdMaW5lKDgsIDMsIDgsIDgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1dULkJPTEQ6Ci0JCQlnYy5kcmF3TGluZSgzLCAyLCAzLCA5KTsKLQkJCWdjLmRyYXdMaW5lKDQsIDIsIDQsIDkpOwotCQkJZ2MuZHJhd0xpbmUoNSwgMiwgNywgMik7Ci0JCQlnYy5kcmF3TGluZSg1LCAzLCA4LCAzKTsKLQkJCWdjLmRyYXdMaW5lKDUsIDUsIDcsIDUpOwotCQkJZ2MuZHJhd0xpbmUoNSwgNiwgNywgNik7Ci0JCQlnYy5kcmF3TGluZSg1LCA4LCA4LCA4KTsKLQkJCWdjLmRyYXdMaW5lKDUsIDksIDcsIDkpOwotCQkJZ2MuZHJhd0xpbmUoNywgNCwgOCwgNCk7Ci0JCQlnYy5kcmF3TGluZSg3LCA3LCA4LCA3KTsKLQkJCWJyZWFrOwotCQljYXNlIFNXVC5JVEFMSUM6Ci0JCQlnYy5kcmF3TGluZSg2LCAyLCA4LCAyKTsKLQkJCWdjLmRyYXdMaW5lKDcsIDMsIDQsIDgpOwotCQkJZ2MuZHJhd0xpbmUoMywgOSwgNSwgOSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1QuQk9MRCB8IFNXVC5JVEFMSUM6Ci0JCQlnYy5kcmF3TGluZSg1LCAyLCA4LCAyKTsKLQkJCWdjLmRyYXdMaW5lKDUsIDMsIDgsIDMpOwotCQkJZ2MuZHJhd0xpbmUoNiwgNCwgNCwgNyk7Ci0JCQlnYy5kcmF3TGluZSg3LCA0LCA1LCA3KTsKLQkJCWdjLmRyYXdMaW5lKDMsIDgsIDYsIDgpOwotCQkJZ2MuZHJhd0xpbmUoMywgOSwgNiwgOSk7Ci0JCQlicmVhazsKLQkJfQotCQlnYy5kaXNwb3NlKCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBjdXN0b20gZXZlbnQgbmFtZXMuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhbGxvdyBhZGRpbmcgb2YgY3VzdG9tIGV2ZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgY3VzdG9tIGV2ZW50IG5hbWVzCi0JICogQHNlZSBob29rQ3VzdG9tTGlzdGVuZXIKLQkgKi8KLQlTdHJpbmcgW10gZ2V0Q3VzdG9tRXZlbnROYW1lcyAoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFswXTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgYSB3aWRnZXQKLQkgKgotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3R5bGUgYml0Ci0JICovCi0JaW50IGdldERlZmF1bHRTdHlsZSAoKSB7Ci0JCWlmIChsdHJCdXR0b24gIT0gbnVsbCAmJiBsdHJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJldHVybiBTV1QuTEVGVF9UT19SSUdIVDsKLQkJfQotCQlpZiAocnRsQnV0dG9uICE9IG51bGwgJiYgcnRsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXR1cm4gU1dULlJJR0hUX1RPX0xFRlQ7Ci0JCX0KLQkJcmV0dXJuIFNXVC5OT05FOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXRzCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgWzBdOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgY29udHJvbHMuCi0JICogVGhpcyBpcyB0aGUgc3Vic2V0IG9mICJFeGFtcGxlIiB3aWRnZXRzIHRoYXQgYXJlIGNvbnRyb2xzLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIGNvbnRyb2xzCi0JICovCi0JQ29udHJvbCBbXSBnZXRFeGFtcGxlQ29udHJvbHMgKCkgewotCQlXaWRnZXQgW10gd2lkZ2V0cyA9IGdldEV4YW1wbGVXaWRnZXRzICgpOwotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gbmV3IENvbnRyb2wgWzBdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh3aWRnZXRzW2ldIGluc3RhbmNlb2YgQ29udHJvbCkgewotCQkJCUNvbnRyb2xbXSBuZXdDb250cm9scyA9IG5ldyBDb250cm9sW2NvbnRyb2xzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoY29udHJvbHMsIDAsIG5ld0NvbnRyb2xzLCAwLCBjb250cm9scy5sZW5ndGgpOwotCQkJCWNvbnRyb2xzID0gbmV3Q29udHJvbHM7Ci0JCQkJY29udHJvbHNbY29udHJvbHMubGVuZ3RoIC0gMV0gPSAoQ29udHJvbCl3aWRnZXRzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250cm9sczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCdzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0J3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCXJldHVybiBuZXcgSXRlbSBbMF07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHNob3J0IHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaG9ydCB0ZXh0IGZvciB0aGUgdGFiIGl0ZW0KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnRUYWJUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGFiVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGl0ZW0KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoqCi0JICogSG9va3MgYWxsIGxpc3RlbmVycyB0byBhbGwgZXhhbXBsZSBjb250cm9scwotCSAqIGFuZCBleGFtcGxlIGNvbnRyb2wgaXRlbXMuCi0JICovCi0Jdm9pZCBob29rRXhhbXBsZVdpZGdldExpc3RlbmVycyAoKSB7Ci0JCWlmIChsb2dnaW5nKSB7Ci0JCQlXaWRnZXRbXSB3aWRnZXRzID0gZ2V0RXhhbXBsZVdpZGdldHMgKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyBpKyspIHsKLQkJCQlob29rTGlzdGVuZXJzICh3aWRnZXRzIFtpXSk7Ci0JCQl9Ci0JCQlJdGVtW10gZXhhbXBsZUl0ZW1zID0gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGFtcGxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlob29rTGlzdGVuZXJzIChleGFtcGxlSXRlbXMgW2ldKTsKLQkJCX0KLQkJCVN0cmluZyBbXSBjdXN0b21OYW1lcyA9IGdldEN1c3RvbUV2ZW50TmFtZXMgKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGV2ZW50c0ZpbHRlciBbRVZFTlRfTkFNRVMubGVuZ3RoICsgaV0pIGhvb2tDdXN0b21MaXN0ZW5lciAoY3VzdG9tTmFtZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhvb2tzIHRoZSBjdXN0b20gbGlzdGVuZXIgc3BlY2lmaWVkIGJ5IGV2ZW50TmFtZS4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBjdXN0b20gbGlzdGVuZXJzLgotCSAqIEBzZWUgZ2V0Q3VzdG9tRXZlbnROYW1lcwotCSAqLwotCXZvaWQgaG9va0N1c3RvbUxpc3RlbmVyIChTdHJpbmcgZXZlbnROYW1lKSB7Ci0JfQotCQotCS8qKgotCSAqIEhvb2tzIGFsbCBsaXN0ZW5lcnMgdG8gdGhlIHNwZWNpZmllZCB3aWRnZXQuCi0JICovCi0Jdm9pZCBob29rTGlzdGVuZXJzIChXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmIChsb2dnaW5nKSB7Ci0JCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQkJbG9nIChldmVudCk7Ci0JCQkJfQotCQkJfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRVZFTlRfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZXZlbnRzRmlsdGVyIFtpXSkgd2lkZ2V0LmFkZExpc3RlbmVyICgoKEludGVnZXIpRVZFTlRfTkFNRVNbaV1bMV0pLmludFZhbHVlKCksIGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2dzIGFuIHVudHlwZWQgZXZlbnQgdG8gdGhlIGV2ZW50IGNvbnNvbGUuCi0JICovCi0Jdm9pZCBsb2coRXZlbnQgZXZlbnQpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IEVWRU5UX05BTUVTLmxlbmd0aCkgewotCQkJaWYgKCgoSW50ZWdlcilFVkVOVF9OQU1FU1tpXVsxXSkuaW50VmFsdWUoKSA9PSBldmVudC50eXBlKSBicmVhazsKLQkJCWkrKzsKLQkJfQotCQlTdHJpbmcgdG9TdHJpbmcgPSAoU3RyaW5nKUVWRU5UX05BTUVTW2ldWzBdICsgIiBbIitldmVudC50eXBlKyJdOiAiOwotCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCWNhc2UgU1dULktleURvd246Ci0JCQljYXNlIFNXVC5LZXlVcDogdG9TdHJpbmcgKz0gbmV3IEtleUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJY2FzZSBTV1QuTW91c2VVcDoKLQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCWNhc2UgU1dULk1vdXNlRW50ZXI6Ci0JCQljYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0JCQljYXNlIFNXVC5Nb3VzZURvdWJsZUNsaWNrOgotCQkJY2FzZSBTV1QuTW91c2VXaGVlbDogCi0JCQljYXNlIFNXVC5Nb3VzZUhvdmVyOiB0b1N0cmluZyArPSBuZXcgTW91c2VFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlBhaW50OiB0b1N0cmluZyArPSBuZXcgUGFpbnRFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULk1vdmU6Ci0JCQljYXNlIFNXVC5SZXNpemU6IHRvU3RyaW5nICs9IG5ldyBDb250cm9sRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5EaXNwb3NlOiB0b1N0cmluZyArPSBuZXcgRGlzcG9zZUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuU2VsZWN0aW9uOgotCQkJY2FzZSBTV1QuRGVmYXVsdFNlbGVjdGlvbjogdG9TdHJpbmcgKz0gbmV3IFNlbGVjdGlvbkV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuRm9jdXNJbjoKLQkJCWNhc2UgU1dULkZvY3VzT3V0OiB0b1N0cmluZyArPSBuZXcgRm9jdXNFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULkV4cGFuZDoKLQkJCWNhc2UgU1dULkNvbGxhcHNlOiB0b1N0cmluZyArPSBuZXcgVHJlZUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuSWNvbmlmeToKLQkJCWNhc2UgU1dULkRlaWNvbmlmeToKLQkJCWNhc2UgU1dULkNsb3NlOgotCQkJY2FzZSBTV1QuQWN0aXZhdGU6Ci0JCQljYXNlIFNXVC5EZWFjdGl2YXRlOiB0b1N0cmluZyArPSBuZXcgU2hlbGxFdmVudCAoZXZlbnQpLnRvU3RyaW5nICgpOyBicmVhazsKLQkJCWNhc2UgU1dULlNob3c6Ci0JCQljYXNlIFNXVC5IaWRlOiB0b1N0cmluZyArPSAoZXZlbnQud2lkZ2V0IGluc3RhbmNlb2YgTWVudSkgPyBuZXcgTWVudUV2ZW50IChldmVudCkudG9TdHJpbmcgKCkgOiBldmVudC50b1N0cmluZygpOyBicmVhazsKLQkJCWNhc2UgU1dULk1vZGlmeTogdG9TdHJpbmcgKz0gbmV3IE1vZGlmeUV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuVmVyaWZ5OiB0b1N0cmluZyArPSBuZXcgVmVyaWZ5RXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5IZWxwOiB0b1N0cmluZyArPSBuZXcgSGVscEV2ZW50IChldmVudCkudG9TdHJpbmcgKCk7IGJyZWFrOwotCQkJY2FzZSBTV1QuQXJtOiB0b1N0cmluZyArPSBuZXcgQXJtRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5UcmF2ZXJzZTogdG9TdHJpbmcgKz0gbmV3IFRyYXZlcnNlRXZlbnQgKGV2ZW50KS50b1N0cmluZyAoKTsgYnJlYWs7Ci0JCQljYXNlIFNXVC5IYXJkS2V5RG93bjoKLQkJCWNhc2UgU1dULkhhcmRLZXlVcDoKLQkJCWNhc2UgU1dULkRyYWdEZXRlY3Q6Ci0JCQljYXNlIFNXVC5NZW51RGV0ZWN0OgotCQkJY2FzZSBTV1QuU2V0RGF0YToKLQkJCWRlZmF1bHQ6IHRvU3RyaW5nICs9IGV2ZW50LnRvU3RyaW5nICgpOwotCQl9Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKHRvU3RyaW5nKTsKLQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoIlxuIik7Ci0JfQotCQotCS8qKgotCSAqIExvZ3MgYSBzdHJpbmcgdG8gdGhlIGV2ZW50IGNvbnNvbGUuCi0JICovCi0Jdm9pZCBsb2cgKFN0cmluZyBzdHJpbmcpIHsKLQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoc3RyaW5nKTsKLQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoIlxuIik7Ci0JfQotCi0JLyoqCi0JICogTG9ncyBhIHR5cGVkIGV2ZW50IHRvIHRoZSBldmVudCBjb25zb2xlLgotCSAqLwotCXZvaWQgbG9nIChTdHJpbmcgZXZlbnROYW1lLCBUeXBlZEV2ZW50IGV2ZW50KSB7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKGV2ZW50TmFtZSArICI6ICIpOwotCQlldmVudENvbnNvbGUuYXBwZW5kIChldmVudC50b1N0cmluZyAoKSk7Ci0JCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJcbiIpOwotCX0KLQkKLQkvKioKLQkgKiBSZWNyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCWRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCWhvb2tFeGFtcGxlV2lkZ2V0TGlzdGVuZXJzICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBmb250Ci0JICogb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzIHRvIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MuCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIGluIG9yZGVyIHRvIHJlc2V0IG90aGVyIGNvbG9ycwotCSAqIGFuZCBmb250cyB0byBkZWZhdWx0IHNldHRpbmdzIGFzIHdlbGwuCi0JICovCi0Jdm9pZCByZXNldENvbG9yc0FuZEZvbnRzICgpIHsKLQkJQ29sb3Igb2xkQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCWZvcmVncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJYmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCWZvbnQgPSBudWxsOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSgpOwotCX0KLQkKLQlib29sZWFuIHJ0bFN1cHBvcnQoKSB7Ci0JCXJldHVybiBSVExfU1VQUE9SVF9FTkFCTEU7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzJyBwYXJlbnQuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kQ29sb3IgKCkgewotCQlpZiAoYmFja2dyb3VuZE1vZGVHcm91cCA9PSBudWxsKSByZXR1cm47Ci0JCWV4YW1wbGVHcm91cC5zZXRCYWNrZ3JvdW5kIChiYWNrZ3JvdW5kTW9kZUNvbG9yQnV0dG9uLmdldFNlbGVjdGlvbiAoKSA/IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpIDogbnVsbCk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgaW1hZ2Ugb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzJyBwYXJlbnQuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kSW1hZ2UgKCkgewotCQlpZiAoYmFja2dyb3VuZE1vZGVHcm91cCA9PSBudWxsKSByZXR1cm47Ci0JCWV4YW1wbGVHcm91cC5zZXRCYWNrZ3JvdW5kSW1hZ2UgKGJhY2tncm91bmRNb2RlSW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpID8gaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpUGFyZW50QmFja2dyb3VuZF0gOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIG1vZGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzJyBwYXJlbnQuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kTW9kZSAoKSB7Ci0JCWlmIChiYWNrZ3JvdW5kTW9kZUdyb3VwID09IG51bGwpIHJldHVybjsKLQkJU3RyaW5nIG1vZGVTdHJpbmcgPSBiYWNrZ3JvdW5kTW9kZUNvbWJvLmdldFRleHQgKCk7Ci0JCWludCBtb2RlID0gU1dULklOSEVSSVRfTk9ORTsKLQkJaWYgKG1vZGVTdHJpbmcuZXF1YWxzKCJTV1QuSU5IRVJJVF9ERUZBVUxUIikpIG1vZGUgPSBTV1QuSU5IRVJJVF9ERUZBVUxUOwotCQlpZiAobW9kZVN0cmluZy5lcXVhbHMoIlNXVC5JTkhFUklUX0ZPUkNFIikpIG1vZGUgPSBTV1QuSU5IRVJJVF9GT1JDRTsKLQkJZXhhbXBsZUdyb3VwLnNldEJhY2tncm91bmRNb2RlIChtb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRCYWNrZ3JvdW5kICgpIHsKLQkJaWYgKGNvbG9yQW5kRm9udFRhYmxlID09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5ub3QgY2hhbmdlIGNvbG9yL2ZvbnQgb24gdGhpcyB0YWIKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY29udHJvbHNbaV0uc2V0QmFja2dyb3VuZCAoYmFja2dyb3VuZENvbG9yKTsKLQkJCX0KLQkJfQotCQkvLyBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBleGFtcGxlIHdpZGdldChzKS4KLQkJQ29sb3IgY29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb250cm9scy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSBjb250cm9scyBbMF0uZ2V0QmFja2dyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKEJBQ0tHUk9VTkRfQ09MT1IpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoY29sb3JJbWFnZSAoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0RW5hYmxlZCAoKSB7Ci0JCUNvbnRyb2wgW10gY29udHJvbHMgPSBnZXRFeGFtcGxlQ29udHJvbHMgKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJY29udHJvbHMgW2ldLnNldEVuYWJsZWQgKGVuYWJsZWRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRGb250ICgpIHsKLQkJaWYgKGNvbG9yQW5kRm9udFRhYmxlID09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5ub3QgY2hhbmdlIGNvbG9yL2ZvbnQgb24gdGhpcyB0YWIKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY29udHJvbHNbaV0uc2V0Rm9udChmb250KTsKLQkJCX0KLQkJfQotCQkvKiBTZXQgdGhlIGZvbnQgaXRlbSdzIGltYWdlIGFuZCBmb250IHRvIG1hdGNoIHRoZSBmb250IG9mIHRoZSBleGFtcGxlIHdpZGdldChzKS4gKi8KLQkJRm9udCBmdCA9IGZvbnQ7Ci0JCWlmIChjb250cm9scy5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlpZiAoZnQgPT0gbnVsbCkgZnQgPSBjb250cm9scyBbMF0uZ2V0Rm9udCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKEZPTlQpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoZm9udEltYWdlIChmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEZvcmVncm91bmQgKCkgewotCQlpZiAoY29sb3JBbmRGb250VGFibGUgPT0gbnVsbCkgcmV0dXJuOyAvLyB1c2VyIGNhbm5vdCBjaGFuZ2UgY29sb3IvZm9udCBvbiB0aGlzIHRhYgotCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCQljb250cm9sc1tpXS5zZXRGb3JlZ3JvdW5kIChmb3JlZ3JvdW5kQ29sb3IpOwotCQkJfQotCQl9Ci0JCS8qIFNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIGV4YW1wbGUgd2lkZ2V0KHMpLiAqLwotCQlDb2xvciBjb2xvciA9IGZvcmVncm91bmRDb2xvcjsKLQkJaWYgKGNvbnRyb2xzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IGNvbnRyb2xzIFswXS5nZXRGb3JlZ3JvdW5kICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oRk9SRUdST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNpemUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFNpemUgKCkgewotCQlpbnQgc2l6ZSA9IFNXVC5ERUZBVUxUOwotCQlpZiAocHJlZmVycmVkQnV0dG9uID09IG51bGwpIHJldHVybjsKLQkJaWYgKHByZWZlcnJlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgc2l6ZSA9IFNXVC5ERUZBVUxUOwotCQlpZiAodG9vU21hbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHNpemUgPSBUT09fU01BTExfU0laRTsKLQkJaWYgKHNtYWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzaXplID0gU01BTExfU0laRTsKLQkJaWYgKGxhcmdlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzaXplID0gTEFSR0VfU0laRTsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShzaXplLCBzaXplKTsgCi0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmlsbEhCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZpbGxWQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IGZpbGxIQnV0dG9uLmdldFNlbGVjdGlvbigpID8gU1dULkZJTEwgOiBTV1QuTEVGVDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gZmlsbFZCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPyBTV1QuRklMTCA6IFNXVC5UT1A7Ci0JCQljb250cm9scyBbaV0uc2V0TGF5b3V0RGF0YSAoZ3JpZERhdGEpOwotCQl9Ci0JCXRhYkZvbGRlclBhZ2UubGF5b3V0IChjb250cm9scyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4gIFN1YmNsYXNzZXMKLQkgKiBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHNldCAiRXhhbXBsZSIgd2lkZ2V0IHN0YXRlCi0JICogdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgd2lkZ2V0LgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldFN0YXRlICgpIHsKLQkJc2V0RXhhbXBsZVdpZGdldEJhY2tncm91bmQgKCk7Ci0JCXNldEV4YW1wbGVXaWRnZXRGb3JlZ3JvdW5kICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0Rm9udCAoKTsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQlzZXRFeGFtcGxlV2lkZ2V0RW5hYmxlZCAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpOwotCQkJc2V0RXhhbXBsZUdyb3VwQmFja2dyb3VuZE1vZGUgKCk7Ci0JCQlzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kQ29sb3IgKCk7Ci0JCQlzZXRFeGFtcGxlR3JvdXBCYWNrZ3JvdW5kSW1hZ2UgKCk7Ci0JCQlzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZEltYWdlICgpOwotCQkJc2V0RXhhbXBsZVdpZGdldFBvcHVwTWVudSAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQl9Ci0JCS8vVEVNUE9SQVJZIENPREUKLS8vCQlDb250cm9sIFtdIGNvbnRyb2xzID0gZ2V0RXhhbXBsZUNvbnRyb2xzICgpOwotLy8JCWZvciAoaW50IGk9MDsgaTxjb250cm9scy5sZW5ndGg7IGkrKykgewotLy8JCQlsb2cgKCJDb250cm9sPSIgKyBjb250cm9scyBbaV0gKyAiLCBib3JkZXIgd2lkdGg9IiArIGNvbnRyb2xzIFtpXS5nZXRCb3JkZXJXaWR0aCAoKSk7Ci0vLwkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRWaXNpYmlsaXR5ICgpIHsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9scyBbaV0uc2V0VmlzaWJsZSAodmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBpbWFnZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0QmFja2dyb3VuZEltYWdlICgpIHsKLQkJaWYgKGJhY2tncm91bmRJbWFnZUJ1dHRvbiAhPSBudWxsICYmIGJhY2tncm91bmRJbWFnZUJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJQ29udHJvbCBbXSBjb250cm9scyA9IGdldEV4YW1wbGVDb250cm9scyAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cm9scyBbaV0uc2V0QmFja2dyb3VuZEltYWdlIChiYWNrZ3JvdW5kSW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uICgpID8gaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQmFja2dyb3VuZF0gOiBudWxsKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTcGxpdHMgdGhlIGdpdmVuIHN0cmluZyBhcm91bmQgbWF0Y2hlcyBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyLgotCSAqIAotCSAqIFRoaXMgc3Vic2V0IG9mIGphdmEubGFuZy5TdHJpbmcuc3BsaXQoU3RyaW5nIHJlZ2V4KQotCSAqIHVzZXMgb25seSBjb2RlIHRoYXQgY2FuIGJlIHJ1biBvbiBDTERDIHBsYXRmb3Jtcy4KLQkgKi8KLQlTdHJpbmcgW10gc3BsaXQgKFN0cmluZyBzdHJpbmcsIGNoYXIgY2gpIHsKLQkJU3RyaW5nIFtdIHJlc3VsdCA9IG5ldyBTdHJpbmdbMF07Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCXdoaWxlIChzdGFydCA8IGxlbmd0aCkgewotCQkJaW50IGVuZCA9IHN0cmluZy5pbmRleE9mKGNoLCBzdGFydCk7Ci0JCQlpZiAoZW5kID09IC0xKSBlbmQgPSBsZW5ndGg7Ci0JCQlTdHJpbmcgc3Vic3RyID0gc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCVN0cmluZyBbXSBuZXdSZXN1bHQgPSBuZXcgU3RyaW5nW3Jlc3VsdC5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCBuZXdSZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOwotCQkJbmV3UmVzdWx0IFtyZXN1bHQubGVuZ3RoXSA9IHN1YnN0cjsKLQkJCXJlc3VsdCA9IG5ld1Jlc3VsdDsKLQkJCXN0YXJ0ID0gZW5kICsgMTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYkZvbGRlclRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjE3N2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFiRm9sZGVyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFRhYkZvbGRlclRhYiBleHRlbmRzIFRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlUYWJGb2xkZXIgdGFiRm9sZGVyMTsKLQlHcm91cCB0YWJGb2xkZXJHcm91cDsKLQkKLQkvKiBTdHlsZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU3R5bGUiIGdyb3VwICovCi0JQnV0dG9uIHRvcEJ1dHRvbiwgYm90dG9tQnV0dG9uOwotCi0Jc3RhdGljIFN0cmluZyBbXSBUYWJJdGVtczEgPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYkl0ZW0xXzAiKSwKLQkJCQkJCQkJICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFiSXRlbTFfMSIpLAotCQkJCQkJCQkgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJJdGVtMV8yIil9OwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRhYkZvbGRlclRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgVGFiRm9sZGVyICovCi0JCXRhYkZvbGRlckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRhYkZvbGRlckdyb3VwLnNldFRleHQgKCJUYWJGb2xkZXIiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmICh0b3BCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVE9QOwotCQlpZiAoYm90dG9tQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPVFRPTTsKLQkJaWYgKGJvcmRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CT1JERVI7Ci0KLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJdGFiRm9sZGVyMSA9IG5ldyBUYWJGb2xkZXIgKHRhYkZvbGRlckdyb3VwLCBzdHlsZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVGFiSXRlbXMxLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIxLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoVGFiSXRlbXMxW2ldKTsKLQkJCWl0ZW0uc2V0VG9vbFRpcFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2x0aXAiLCBuZXcgU3RyaW5nIFtdIHtUYWJJdGVtczFbaV19KSk7Ci0JCQlUZXh0IGNvbnRlbnQgPSBuZXcgVGV4dCh0YWJGb2xkZXIxLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSk7Ci0JCQljb250ZW50LnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYkl0ZW1fY29udGVudCIpICsgIjogIiArIGkpOwotCQkJaXRlbS5zZXRDb250cm9sKGNvbnRlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCXRvcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXRvcEJ1dHRvbi5zZXRUZXh0ICgiU1dULlRPUCIpOwotCQl0b3BCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlib3R0b21CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlib3R0b21CdXR0b24uc2V0VGV4dCAoIlNXVC5CT1RUT00iKTsKLQkJYm9yZGVyQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJYm9yZGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQk9SREVSIik7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlyZXR1cm4gdGFiRm9sZGVyMS5nZXRJdGVtcygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuLgotCSAqLwotCVdpZGdldCBbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHt0YWJGb2xkZXIxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJTZWxlY3Rpb24iLCAiU2VsZWN0aW9uSW5kZXgifTsKLQl9Ci0KLQlTdHJpbmcgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kUm9vdCkgewotCQkvKiBPdmVycmlkZSB0byBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGludCBnZXRTZWxlY3Rpb25JbmRleCgpL3NldFNlbGVjdGlvbihpbnQpICovCi0JCXJldHVybiAobWV0aG9kUm9vdC5lcXVhbHMoIlNlbGVjdGlvbkluZGV4IikpID8gInNldFNlbGVjdGlvbiIgOiAic2V0IiArIG1ldGhvZFJvb3Q7Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgV2lkZ2V0IHdpZGdldCkgewotCQlpZiAodmFsdWUuZXF1YWxzKCIiKSkgcmV0dXJuIG5ldyBPYmplY3RbXSB7bmV3IFRhYkl0ZW1bMF19OwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtIikpIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IGZpbmRJdGVtKHZhbHVlLCAoKFRhYkZvbGRlcikgd2lkZ2V0KS5nZXRJdGVtcygpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBuZXcgT2JqZWN0W10ge2l0ZW19OwotCQl9Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIltMb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsiKSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gc3BsaXQodmFsdWUsICcsJyk7Ci0JCQlUYWJJdGVtW10gaXRlbXMgPSBuZXcgVGFiSXRlbVt2YWx1ZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaXRlbXNbaV0gPSBmaW5kSXRlbSh2YWx1ZXNbaV0sICgoVGFiRm9sZGVyKSB3aWRnZXQpLmdldEl0ZW1zKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7aXRlbXN9OwotCQl9Ci0JCXJldHVybiBzdXBlci5wYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgd2lkZ2V0KTsKLQl9Ci0KLQlUYWJJdGVtIGZpbmRJdGVtKFN0cmluZyB2YWx1ZSwgVGFiSXRlbVtdIGl0ZW1zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJaWYgKGl0ZW0uZ2V0VGV4dCgpLmVxdWFscyh2YWx1ZSkpIHJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNob3J0IHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFNob3J0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJURiI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVGFiRm9sZGVyIjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXRvcEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJGb2xkZXIxLmdldFN0eWxlICgpICYgU1dULlRPUCkgIT0gMCk7Ci0JCWJvdHRvbUJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJGb2xkZXIxLmdldFN0eWxlICgpICYgU1dULkJPVFRPTSkgIT0gMCk7Ci0JCWJvcmRlckJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJGb2xkZXIxLmdldFN0eWxlICgpICYgU1dULkJPUkRFUikgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFibGVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RhYmxlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5NmJmNDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGFibGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFRhYmxlVGFiIGV4dGVuZHMgU2Nyb2xsYWJsZVRhYiB7Ci0JLyogRXhhbXBsZSB3aWRnZXRzIGFuZCBncm91cHMgdGhhdCBjb250YWluIHRoZW0gKi8KLQlUYWJsZSB0YWJsZTE7Ci0JR3JvdXAgdGFibGVHcm91cDsKLQotCS8qIFNpemUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlNpemUiIGdyb3VwICovCi0JQnV0dG9uIHBhY2tDb2x1bW5zQnV0dG9uOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gY2hlY2tCdXR0b24sIGZ1bGxTZWxlY3Rpb25CdXR0b24sIGhpZGVTZWxlY3Rpb25CdXR0b247Ci0KLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIG11bHRpcGxlQ29sdW1ucywgbW92ZWFibGVDb2x1bW5zLCByZXNpemFibGVDb2x1bW5zLCBoZWFkZXJWaXNpYmxlQnV0dG9uLCBzb3J0SW5kaWNhdG9yQnV0dG9uLCBoZWFkZXJJbWFnZXNCdXR0b24sIGxpbmVzVmlzaWJsZUJ1dHRvbiwgc3ViSW1hZ2VzQnV0dG9uOwotCQotCS8qIENvbnRyb2xzIGFuZCByZXNvdXJjZXMgYWRkZWQgdG8gdGhlICJDb2xvcnMgYW5kIEZvbnRzIiBncm91cCAqLwotCXN0YXRpYyBmaW5hbCBpbnQgSVRFTV9GT1JFR1JPVU5EX0NPTE9SID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IElURU1fQkFDS0dST1VORF9DT0xPUiA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBJVEVNX0ZPTlQgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9GT1JFR1JPVU5EX0NPTE9SID0gNjsKLQlzdGF0aWMgZmluYWwgaW50IENFTExfQkFDS0dST1VORF9DT0xPUiA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBDRUxMX0ZPTlQgPSA4OwotCUNvbG9yIGl0ZW1Gb3JlZ3JvdW5kQ29sb3IsIGl0ZW1CYWNrZ3JvdW5kQ29sb3IsIGNlbGxGb3JlZ3JvdW5kQ29sb3IsIGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JRm9udCBpdGVtRm9udCwgY2VsbEZvbnQ7Ci0JCi0Jc3RhdGljIFN0cmluZyBbXSBjb2x1bW5UaXRsZXMJPSB7Q29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMCIpLAotCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMSIpLAotCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMiIpLAotCQkJCQkJCQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMyIpfTsKLQkJCQkJCQkJCSAgIAotCXN0YXRpYyBTdHJpbmdbXVtdIHRhYmxlRGF0YSA9IHsKLQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8wIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMSIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzIiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8zIikgfSwKLQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8wIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMSIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzIiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8zIikgfSwKLQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8wIiksCi0JCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMSIpLAotCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzIiKSwKLQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8zIikgfSB9OwotCi0JUG9pbnQgbWVudU1vdXNlQ29vcmRzOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBDb250cm9sRXhhbXBsZS4KLQkgKi8KLQlUYWJsZVRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMgYW5kIEZvbnRzIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29sb3JBbmRGb250R3JvdXAoKTsKLQkJCi0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtX0ZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW1fQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbV9Gb250IikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDZWxsX0ZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNlbGxfQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2VsbF9Gb250IikpOwotCi0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb250ICE9IG51bGwpIGl0ZW1Gb250LmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEJhY2tncm91bmRDb2xvciAhPSBudWxsKSBjZWxsQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEZvcmVncm91bmRDb2xvciAhPSBudWxsKSBjZWxsRm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEZvbnQgIT0gbnVsbCkgY2VsbEZvbnQuZGlzcG9zZSgpOwotCQkJCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwkJCQotCQkJCWl0ZW1Gb250ID0gbnVsbDsKLQkJCQljZWxsQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJCQljZWxsRm9yZWdyb3VuZENvbG9yID0gbnVsbDsJCQkKLQkJCQljZWxsRm9udCA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgY2hhbmdlRm9udE9yQ29sb3IoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJY2FzZSBJVEVNX0ZPUkVHUk9VTkRfQ09MT1I6IHsKLQkJCUNvbG9yIG9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRGb3JlZ3JvdW5kICgpOwotCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCW9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGRpc3BsYXksIHJnYik7Ci0JCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQljYXNlIElURU1fQkFDS0dST1VORF9DT0xPUjogewotCQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGFibGUxLmdldEl0ZW0gKDApLmdldEJhY2tncm91bmQgKCk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgSVRFTV9GT05UOiB7Ci0JCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9udCAoKTsKLQkJCWZvbnREaWFsb2cuc2V0Rm9udExpc3Qob2xkRm9udC5nZXRGb250RGF0YSgpKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCW9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCWl0ZW1Gb250ID0gbmV3IEZvbnQgKGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCXNldEl0ZW1Gb250ICgpOwotCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9GT1JFR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9yZWdyb3VuZCAoMSk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBjZWxsRm9yZWdyb3VuZENvbG9yOwotCQkJY2VsbEZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldENlbGxGb3JlZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9CQUNLR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0QmFja2dyb3VuZCAoMSk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBjZWxsQmFja2dyb3VuZENvbG9yOwotCQkJY2VsbEJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldENlbGxCYWNrZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9GT05UOiB7Ci0JCQlGb250IG9sZEZvbnQgPSBjZWxsRm9udDsKLQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9udCAoMSk7Ci0JCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbiAoKTsKLQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQlvbGRGb250ID0gY2VsbEZvbnQ7Ci0JCQljZWxsRm9udCA9IG5ldyBGb250IChkaXNwbGF5LCBmb250RGF0YSk7Ci0JCQlzZXRDZWxsRm9udCAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3VwZXIuY2hhbmdlRm9udE9yQ29sb3IoaW5kZXgpOwotCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiT3RoZXIiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlT3RoZXJHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZU90aGVyR3JvdXAgKCk7Ci0JCi0JCS8qIENyZWF0ZSBkaXNwbGF5IGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoaXMgZXhhbXBsZSAqLwotCQlsaW5lc1Zpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlsaW5lc1Zpc2libGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzX1Zpc2libGUiKSk7Ci0JCW11bHRpcGxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW11bHRpcGxlQ29sdW1ucy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTXVsdGlwbGVfQ29sdW1ucyIpKTsKLQkJbXVsdGlwbGVDb2x1bW5zLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhlYWRlclZpc2libGVCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkhlYWRlcl9WaXNpYmxlIikpOwotCQlzb3J0SW5kaWNhdG9yQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJc29ydEluZGljYXRvckJ1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU29ydF9JbmRpY2F0b3IiKSk7Ci0JCW1vdmVhYmxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1vdmVhYmxlQ29sdW1ucy5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTW92ZWFibGVfQ29sdW1ucyIpKTsKLQkJcmVzaXphYmxlQ29sdW1ucyA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXJlc2l6YWJsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlc2l6YWJsZV9Db2x1bW5zIikpOwotCQloZWFkZXJJbWFnZXNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQloZWFkZXJJbWFnZXNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkhlYWRlcl9JbWFnZXMiKSk7Ci0JCXN1YkltYWdlc0J1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXN1YkltYWdlc0J1dHRvbi5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3ViX0ltYWdlcyIpKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlsaW5lc1Zpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCW11bHRpcGxlQ29sdW1ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKTsKLQkJCX0KLQkJfSk7Ci0JCWhlYWRlclZpc2libGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldEhlYWRlclZpc2libGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzb3J0SW5kaWNhdG9yQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRXaWRnZXRTb3J0SW5kaWNhdG9yICgpOwotCQkJfQotCQl9KTsKLQkJbW92ZWFibGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDb2x1bW5zTW92ZWFibGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXNpemFibGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRDb2x1bW5zUmVzaXphYmxlICgpOwotCQkJfQotCQl9KTsKLQkJaGVhZGVySW1hZ2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQkJc3ViSW1hZ2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB0YWJsZSAqLwotCQl0YWJsZUdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGFibGVHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGFibGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0YWJsZUdyb3VwLnNldFRleHQgKCJUYWJsZSIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsJCi0JCS8qIENvbXB1dGUgdGhlIHdpZGdldCBzdHlsZSAqLwotCQlpbnQgc3R5bGUgPSBnZXREZWZhdWx0U3R5bGUoKTsKLQkJaWYgKHNpbmdsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TSU5HTEU7Ci0JCWlmIChtdWx0aUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULlZfU0NST0xMOwotCQlpZiAoaG9yaXpvbnRhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5IX1NDUk9MTDsKLQkJaWYgKGNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkNIRUNLOwotCQlpZiAoZnVsbFNlbGVjdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5GVUxMX1NFTEVDVElPTjsKLQkJaWYgKGhpZGVTZWxlY3Rpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSElERV9TRUxFQ1RJT047Ci0JCWlmIChib3JkZXJCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIHRhYmxlIHdpZGdldCAqLwotCQl0YWJsZTEgPSBuZXcgVGFibGUgKHRhYmxlR3JvdXAsIHN0eWxlKTsKLQkKLQkJLyogRmlsbCB0aGUgdGFibGUgd2l0aCBkYXRhICovCi0JCWJvb2xlYW4gbXVsdGlDb2x1bW4gPSBtdWx0aXBsZUNvbHVtbnMuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChtdWx0aUNvbHVtbikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZTEsIFNXVC5OT05FKTsKLQkJCQl0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtblRpdGxlc1tpXSk7Ci0JCQkJdGFibGVDb2x1bW4uc2V0VG9vbFRpcFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2x0aXAiLCBuZXcgU3RyaW5nIFtdIHtjb2x1bW5UaXRsZXNbaV19KSk7Ci0JCQkJaWYgKGhlYWRlckltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgdGFibGVDb2x1bW4uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzIFtpICUgM10pOwotCQkJfQotCQkJdGFibGUxLnNldFNvcnRDb2x1bW4odGFibGUxLmdldENvbHVtbigwKSk7Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUxLCBTV1QuTk9ORSk7Ci0JCQlpZiAobXVsdGlDb2x1bW4gJiYgc3ViSW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaXRlbS5zZXRJbWFnZShqLCBpbnN0YW5jZS5pbWFnZXMgW2kgJSAzXSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpdGVtLnNldEltYWdlKGluc3RhbmNlLmltYWdlcyBbaSAlIDNdKTsKLQkJCX0KLQkJCXNldEl0ZW1UZXh0IChpdGVtLCBpLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW5kZXgiKSArIGkpOwotCQl9Ci0JCXBhY2tDb2x1bW5zKCk7Ci0JfQotCQotCXZvaWQgc2V0SXRlbVRleHQoVGFibGVJdGVtIGl0ZW0sIGludCBpLCBTdHJpbmcgbm9kZSkgewotCQlpbnQgaW5kZXggPSBpICUgMzsKLQkJaWYgKG11bHRpcGxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKSkgewotCQkJdGFibGVEYXRhIFtpbmRleF1bMF0gPSBub2RlOwotCQkJaXRlbS5zZXRUZXh0ICh0YWJsZURhdGEgW2luZGV4XSk7Ci0JCX0gZWxzZSB7Ci0JCQlpdGVtLnNldFRleHQgKG5vZGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTaXplIiBncm91cC4gIFRoZSAiU2l6ZSIgZ3JvdXAgY29udGFpbnMKLQkgKiBjb250cm9scyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZgotCSAqIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVTaXplR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVTaXplR3JvdXAoKTsKLQkKLQkJcGFja0NvbHVtbnNCdXR0b24gPSBuZXcgQnV0dG9uIChzaXplR3JvdXAsIFNXVC5QVVNIKTsKLQkJcGFja0NvbHVtbnNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhY2tfQ29sdW1ucyIpKTsKLQkJcGFja0NvbHVtbnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcGFja0NvbHVtbnMgKCk7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU3R5bGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlU3R5bGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuRlVMTF9TRUxFQ1RJT04iKTsKLQkJaGlkZVNlbGVjdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWhpZGVTZWxlY3Rpb25CdXR0b24uc2V0VGV4dCAoIlNXVC5ISURFX1NFTEVDVElPTiIpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMsIGlmIGFueS4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZXhhbXBsZSB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcwotCSAqLwotCUl0ZW0gW10gZ2V0RXhhbXBsZVdpZGdldEl0ZW1zICgpIHsKLQkJSXRlbSBbXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJSXRlbSBbXSBpdGVtcyA9IHRhYmxlMS5nZXRJdGVtcygpOwotCQlJdGVtIFtdIGFsbEl0ZW1zID0gbmV3IEl0ZW0gW2NvbHVtbnMubGVuZ3RoICsgaXRlbXMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShjb2x1bW5zLCAwLCBhbGxJdGVtcywgMCwgY29sdW1ucy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGl0ZW1zLCAwLCBhbGxJdGVtcywgY29sdW1ucy5sZW5ndGgsIGl0ZW1zLmxlbmd0aCk7Ci0JCXJldHVybiBhbGxJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7dGFibGUxfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Ygc2V0L2dldCBBUEkgbWV0aG9kIG5hbWVzICh3aXRob3V0IHRoZSBzZXQvZ2V0IHByZWZpeCkKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGluIHRoZSBleGFtcGxlIGNvbnRyb2wocykuCi0JICovCi0JU3RyaW5nW10gZ2V0TWV0aG9kTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJDb2x1bW5PcmRlciIsICJJdGVtQ291bnQiLCAiU2VsZWN0aW9uIiwgIlNlbGVjdGlvbkluZGV4IiwgIlRvb2xUaXBUZXh0IiwgIlRvcEluZGV4In07Ci0JfQotCi0JU3RyaW5nIHNldE1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZFJvb3QpIHsKLQkJLyogT3ZlcnJpZGUgdG8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKS9zZXRTZWxlY3Rpb24oaW50KSAqLwotCQlyZXR1cm4gKG1ldGhvZFJvb3QuZXF1YWxzKCJTZWxlY3Rpb25JbmRleCIpKSA/ICJzZXRTZWxlY3Rpb24iIDogInNldCIgKyBtZXRob2RSb290OwotCX0KLQotCXZvaWQgcGFja0NvbHVtbnMgKCkgewotCQlpbnQgY29sdW1uQ291bnQgPSB0YWJsZTEuZ2V0Q29sdW1uQ291bnQoKTsgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZTEuZ2V0Q29sdW1uKGkpOwotCQkJdGFibGVDb2x1bW4ucGFjaygpOwotCQl9Ci0JfQotCi0JT2JqZWN0W10gcGFyYW1ldGVyRm9yVHlwZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyB2YWx1ZSwgV2lkZ2V0IHdpZGdldCkgewotCQlpZiAodmFsdWUuZXF1YWxzKCIiKSkgcmV0dXJuIG5ldyBPYmplY3RbXSB7bmV3IFRhYmxlSXRlbVswXX07IC8vIGJ1ZyBpbiBUYWJsZT8KLQkJaWYgKHR5cGVOYW1lLmVxdWFscygib3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtIikpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gZmluZEl0ZW0odmFsdWUsICgoVGFibGUpIHdpZGdldCkuZ2V0SXRlbXMoKSk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSByZXR1cm4gbmV3IE9iamVjdFtdIHtpdGVtfTsKLQkJfQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJbTG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsiKSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gc3BsaXQodmFsdWUsICcsJyk7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bdmFsdWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCWl0ZW1zW2ldID0gZmluZEl0ZW0odmFsdWVzW2ldLCAoKFRhYmxlKSB3aWRnZXQpLmdldEl0ZW1zKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7aXRlbXN9OwotCQl9Ci0JCXJldHVybiBzdXBlci5wYXJhbWV0ZXJGb3JUeXBlKHR5cGVOYW1lLCB2YWx1ZSwgd2lkZ2V0KTsKLQl9Ci0KLQlUYWJsZUl0ZW0gZmluZEl0ZW0oU3RyaW5nIHZhbHVlLCBUYWJsZUl0ZW1bXSBpdGVtcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJaWYgKGl0ZW0uZ2V0VGV4dCgpLmVxdWFscyh2YWx1ZSkpIHJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlRhYmxlIjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciwgYmFja2dyb3VuZCBjb2xvciwgYW5kIGZvbnQKLQkgKiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMgdG8gdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKiBBbHNvIHNldHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvciBvZiBUYWJsZUl0ZW0gWzBdCi0JICogdG8gZGVmYXVsdCBzZXR0aW5ncy4KLQkgKi8KLQl2b2lkIHJlc2V0Q29sb3JzQW5kRm9udHMgKCkgewotCQlzdXBlci5yZXNldENvbG9yc0FuZEZvbnRzICgpOwotCQlDb2xvciBvbGRDb2xvciA9IGl0ZW1Gb3JlZ3JvdW5kQ29sb3I7Ci0JCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQlpdGVtQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0SXRlbUJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCUZvbnQgb2xkRm9udCA9IGZvbnQ7Ci0JCWl0ZW1Gb250ID0gbnVsbDsKLQkJc2V0SXRlbUZvbnQgKCk7Ci0JCWlmIChvbGRGb250ICE9IG51bGwpIG9sZEZvbnQuZGlzcG9zZSgpOwotCQlvbGRDb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCWNlbGxGb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwotCQlzZXRDZWxsRm9yZWdyb3VuZCAoKTsKLQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBjZWxsQmFja2dyb3VuZENvbG9yOwotCQljZWxsQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0Q2VsbEJhY2tncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCW9sZEZvbnQgPSBmb250OwotCQljZWxsRm9udCA9IG51bGw7Ci0JCXNldENlbGxGb250ICgpOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgUm93IDAgVGFibGVJdGVtIGluIGNvbHVtbiAxLgotCSAqLwotCXZvaWQgc2V0Q2VsbEJhY2tncm91bmQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRhYmxlMS5nZXRJdGVtICgwKS5zZXRCYWNrZ3JvdW5kICgxLCBjZWxsQmFja2dyb3VuZENvbG9yKTsKLQkJfQotCQkvKiBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjZWxsLiAqLwotCQlDb2xvciBjb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRCYWNrZ3JvdW5kICgxKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKENFTExfQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIFJvdyAwIFRhYmxlSXRlbSBpbiBjb2x1bW4gMS4KLQkgKi8KLQl2b2lkIHNldENlbGxGb3JlZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0Rm9yZWdyb3VuZCAoMSwgY2VsbEZvcmVncm91bmRDb2xvcik7Ci0JCX0KLQkJLyogU2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yIGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgY2VsbC4gKi8KLQkJQ29sb3IgY29sb3IgPSBjZWxsRm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9yZWdyb3VuZCAoMSk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShDRUxMX0ZPUkVHUk9VTkRfQ09MT1IpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoY29sb3JJbWFnZShjb2xvcikpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmb250IG9mIHRoZSBSb3cgMCBUYWJsZUl0ZW0gaW4gY29sdW1uIDEuCi0JICovCi0Jdm9pZCBzZXRDZWxsRm9udCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGFibGUxLmdldEl0ZW0gKDApLnNldEZvbnQgKDEsIGNlbGxGb250KTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvbnQgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb250IG9mIHRoZSBpdGVtLiAqLwotCQlGb250IGZ0ID0gY2VsbEZvbnQ7Ci0JCWlmIChmdCA9PSBudWxsKSBmdCA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRGb250ICgxKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKENFTExfRk9OVCk7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChmb250SW1hZ2UoZnQpKTsKLQkJaXRlbS5zZXRGb250KGZ0KTsKLQkJY29sb3JBbmRGb250VGFibGUubGF5b3V0ICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgVGFibGVJdGVtIFswXS4KLQkgKi8KLQl2b2lkIHNldEl0ZW1CYWNrZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0QmFja2dyb3VuZCAoaXRlbUJhY2tncm91bmRDb2xvcik7Ci0JCX0KLQkJLyogU2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaXRlbS4gKi8KLQkJQ29sb3IgY29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0QmFja2dyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKElURU1fQkFDS0dST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgVGFibGVJdGVtIFswXS4KLQkgKi8KLQl2b2lkIHNldEl0ZW1Gb3JlZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0YWJsZTEuZ2V0SXRlbSAoMCkuc2V0Rm9yZWdyb3VuZCAoaXRlbUZvcmVncm91bmRDb2xvcik7Ci0JCX0KLQkJLyogU2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yIGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgaXRlbS4gKi8KLQkJQ29sb3IgY29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0YWJsZTEuZ2V0SXRlbSAoMCkuZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKElURU1fRk9SRUdST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgVGFibGVJdGVtIDAuCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9udCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGFibGUxLmdldEl0ZW0gKDApLnNldEZvbnQgKGl0ZW1Gb250KTsKLQkJfQotCQkvKiBTZXQgdGhlIGZvbnQgaXRlbSdzIGltYWdlIHRvIG1hdGNoIHRoZSBmb250IG9mIHRoZSBpdGVtLiAqLwotCQlGb250IGZ0ID0gaXRlbUZvbnQ7Ci0JCWlmIChmdCA9PSBudWxsKSBmdCA9IHRhYmxlMS5nZXRJdGVtICgwKS5nZXRGb250ICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oSVRFTV9GT05UKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGZvbnRJbWFnZShmdCkpOwotCQlpdGVtLnNldEZvbnQoZnQpOwotCQljb2xvckFuZEZvbnRUYWJsZS5sYXlvdXQgKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW92ZWFibGUgY29sdW1ucyBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRDb2x1bW5zTW92ZWFibGUgKCkgewotCQlib29sZWFuIHNlbGVjdGlvbiA9IG1vdmVhYmxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKTsKLQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zW2ldLnNldE1vdmVhYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZXNpemFibGUgY29sdW1ucyBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRDb2x1bW5zUmVzaXphYmxlICgpIHsKLQkJYm9vbGVhbiBzZWxlY3Rpb24gPSByZXNpemFibGVDb2x1bW5zLmdldFNlbGVjdGlvbigpOwotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZTEuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnNbaV0uc2V0UmVzaXphYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzZXRJdGVtQmFja2dyb3VuZCAoKTsKLQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlzZXRDZWxsQmFja2dyb3VuZCAoKTsKLQkJc2V0Q2VsbEZvcmVncm91bmQgKCk7Ci0JCXNldENlbGxGb250ICgpOwotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXNldENvbHVtbnNNb3ZlYWJsZSAoKTsKLQkJCXNldENvbHVtbnNSZXNpemFibGUgKCk7Ci0JCQlzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpOwotCQkJc2V0V2lkZ2V0U29ydEluZGljYXRvciAoKTsKLQkJCXNldFdpZGdldExpbmVzVmlzaWJsZSAoKTsKLQkJfQotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCWNoZWNrQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRhYmxlMS5nZXRTdHlsZSAoKSAmIFNXVC5DSEVDSykgIT0gMCk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0U2VsZWN0aW9uICgodGFibGUxLmdldFN0eWxlICgpICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKTsKLQkJaGlkZVNlbGVjdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0YWJsZTEuZ2V0U3R5bGUgKCkgJiBTV1QuSElERV9TRUxFQ1RJT04pICE9IDApOwotCQl0cnkgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gdGFibGUxLmdldENvbHVtbigwKTsKLQkJCW1vdmVhYmxlQ29sdW1ucy5zZXRTZWxlY3Rpb24gKGNvbHVtbi5nZXRNb3ZlYWJsZSgpKTsKLQkJCXJlc2l6YWJsZUNvbHVtbnMuc2V0U2VsZWN0aW9uIChjb2x1bW4uZ2V0UmVzaXphYmxlKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JCWhlYWRlclZpc2libGVCdXR0b24uc2V0U2VsZWN0aW9uICh0YWJsZTEuZ2V0SGVhZGVyVmlzaWJsZSgpKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uLnNldFNlbGVjdGlvbiAodGFibGUxLmdldExpbmVzVmlzaWJsZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaGVhZGVyIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0SGVhZGVyVmlzaWJsZSAoKSB7Ci0JCXRhYmxlMS5zZXRIZWFkZXJWaXNpYmxlIChoZWFkZXJWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNvcnQgaW5kaWNhdG9yIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNvcnRJbmRpY2F0b3IgKCkgewotCQlUYWJsZUNvbHVtbiBbXSBjb2x1bW5zID0gdGFibGUxLmdldENvbHVtbnMoKTsKLQkJaWYgKHNvcnRJbmRpY2F0b3JCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQkvKiBSZXNldCB0byBrbm93biBzdGF0ZTogJ2Rvd24nIG9uIGNvbHVtbiAwLiAqLwotCQkJdGFibGUxLnNldFNvcnREaXJlY3Rpb24gKFNXVC5ET1dOKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnNbaV07Ci0JCQkJaWYgKGkgPT0gMCkgdGFibGUxLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKLQkJCQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlpbnQgc29ydERpcmVjdGlvbiA9IFNXVC5ET1dOOwotCQkJCQkJaWYgKGUud2lkZ2V0ID09IHRhYmxlMS5nZXRTb3J0Q29sdW1uKCkpIHsKLQkJCQkJCQkvKiBJZiB0aGUgc29ydCBjb2x1bW4gaGFzbid0IGNoYW5nZWQsIGN5Y2xlIGRvd24gLT4gdXAgLT4gbm9uZS4gKi8KLQkJCQkJCQlzd2l0Y2ggKHRhYmxlMS5nZXRTb3J0RGlyZWN0aW9uICgpKSB7Ci0JCQkJCQkJY2FzZSBTV1QuRE9XTjogc29ydERpcmVjdGlvbiA9IFNXVC5VUDsgYnJlYWs7Ci0JCQkJCQkJY2FzZSBTV1QuVVA6IHNvcnREaXJlY3Rpb24gPSBTV1QuTk9ORTsgYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0YWJsZTEuc2V0U29ydENvbHVtbigoVGFibGVDb2x1bW4pZS53aWRnZXQpOwotCQkJCQkJfQotCQkJCQkJdGFibGUxLnNldFNvcnREaXJlY3Rpb24gKHNvcnREaXJlY3Rpb24pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJCWNvbHVtbi5zZXREYXRhKCJTb3J0TGlzdGVuZXIiLCBsaXN0ZW5lcik7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRhYmxlMS5zZXRTb3J0RGlyZWN0aW9uIChTV1QuTk9ORSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbnMubGVuZ3RoOyBqKyspIHsKLQkJCQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IChTZWxlY3Rpb25MaXN0ZW5lciljb2x1bW5zW2pdLmdldERhdGEoIlNvcnRMaXN0ZW5lciIpOwkvLyROT04tTkxTLTEkCi0JCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIGNvbHVtbnNbal0ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxpbmVzIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpIHsKLQkJdGFibGUxLnNldExpbmVzVmlzaWJsZSAobGluZXNWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNwZWNpYWxQb3B1cE1lbnVJdGVtcyhNZW51IG1lbnUsIEV2ZW50IGV2ZW50KSB7Ci0gICAgCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotICAgIAlpdGVtLnNldFRleHQoImdldEl0ZW0oUG9pbnQpIG9uIG1vdXNlIGNvb3JkaW5hdGVzIik7Ci0gICAgCW1lbnVNb3VzZUNvb3JkcyA9IHRhYmxlMS50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAJCQlldmVudENvbnNvbGUuYXBwZW5kICgiZ2V0SXRlbShQb2ludCgiICsgbWVudU1vdXNlQ29vcmRzICsgIikpIHJldHVybmVkOiAiICsgdGFibGUxLmdldEl0ZW0obWVudU1vdXNlQ29vcmRzKSk7Ci0gICAgCQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoIlxuIik7Ci0gICAgCQl9OwotICAgIAl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UZXh0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9UZXh0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkNDljMWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVGV4dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgVGV4dFRhYiBleHRlbmRzIFNjcm9sbGFibGVUYWIgewotCS8qIEV4YW1wbGUgd2lkZ2V0cyBhbmQgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGVtICovCi0JVGV4dCB0ZXh0OwotCUdyb3VwIHRleHRHcm91cDsKLQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gd3JhcEJ1dHRvbiwgcmVhZE9ubHlCdXR0b24sIHBhc3N3b3JkQnV0dG9uLCBzZWFyY2hCdXR0b24sIGNhbmNlbEJ1dHRvbjsKLQlCdXR0b24gbGVmdEJ1dHRvbiwgY2VudGVyQnV0dG9uLCByaWdodEJ1dHRvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgQ29udHJvbEV4YW1wbGUuCi0JICovCi0JVGV4dFRhYihDb250cm9sRXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlRXhhbXBsZUdyb3VwICgpOwotCQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB0ZXh0IHdpZGdldCAqLwotCQl0ZXh0R3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQl0ZXh0R3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRleHRHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0ZXh0R3JvdXAuc2V0VGV4dCAoIlRleHQiKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChzaW5nbGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuU0lOR0xFOwotCQlpZiAobXVsdGlCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTVVMVEk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkhfU0NST0xMOwotCQlpZiAodmVydGljYWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuVl9TQ1JPTEw7Ci0JCWlmICh3cmFwQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULldSQVA7Ci0JCWlmIChyZWFkT25seUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5SRUFEX09OTFk7Ci0JCWlmIChwYXNzd29yZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5QQVNTV09SRDsKLQkJaWYgKHNlYXJjaEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5TRUFSQ0g7Ci0JCWlmIChjYW5jZWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuQ0FOQ0VMOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkJPUkRFUjsKLQkJaWYgKGxlZnRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuTEVGVDsKLQkJaWYgKGNlbnRlckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5DRU5URVI7Ci0JCWlmIChyaWdodEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5SSUdIVDsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMgKi8KLQkJdGV4dCA9IG5ldyBUZXh0ICh0ZXh0R3JvdXAsIHN0eWxlKTsKLQkJdGV4dC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRXhhbXBsZV9zdHJpbmciKSArIFRleHQuREVMSU1JVEVSICsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9uZV9Ud29fVGhyZWUiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgZXh0cmEgd2lkZ2V0cyAqLwotCQl3cmFwQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJd3JhcEJ1dHRvbi5zZXRUZXh0ICgiU1dULldSQVAiKTsKLQkJcmVhZE9ubHlCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZWFkT25seUJ1dHRvbi5zZXRUZXh0ICgiU1dULlJFQURfT05MWSIpOwotCQlwYXNzd29yZEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXBhc3N3b3JkQnV0dG9uLnNldFRleHQgKCJTV1QuUEFTU1dPUkQiKTsKLQkJc2VhcmNoQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJc2VhcmNoQnV0dG9uLnNldFRleHQgKCJTV1QuU0VBUkNIIik7Ci0JCWNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRUZXh0ICgiU1dULkNBTkNFTCIpOwotCi0JCUNvbXBvc2l0ZSBhbGlnbm1lbnRHcm91cCA9IG5ldyBDb21wb3NpdGUgKHN0eWxlR3JvdXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWFsaWdubWVudEdyb3VwLnNldExheW91dCAobGF5b3V0KTsKLQkJYWxpZ25tZW50R3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbGVmdEJ1dHRvbiA9IG5ldyBCdXR0b24gKGFsaWdubWVudEdyb3VwLCBTV1QuUkFESU8pOwotCQlsZWZ0QnV0dG9uLnNldFRleHQgKCJTV1QuTEVGVCIpOwotCQljZW50ZXJCdXR0b24gPSBuZXcgQnV0dG9uIChhbGlnbm1lbnRHcm91cCwgU1dULlJBRElPKTsKLQkJY2VudGVyQnV0dG9uLnNldFRleHQgKCJTV1QuQ0VOVEVSIik7Ci0JCXJpZ2h0QnV0dG9uID0gbmV3IEJ1dHRvbiAoYWxpZ25tZW50R3JvdXAsIFNXVC5SQURJTyk7Ci0JCXJpZ2h0QnV0dG9uLnNldFRleHQgKCJTV1QuUklHSFQiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3RleHR9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXQvZ2V0IEFQSSBtZXRob2QgbmFtZXMgKHdpdGhvdXQgdGhlIHNldC9nZXQgcHJlZml4KQotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgaW4gdGhlIGV4YW1wbGUgY29udHJvbChzKS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRNZXRob2ROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkRvdWJsZUNsaWNrRW5hYmxlZCIsICJFY2hvQ2hhciIsICJFZGl0YWJsZSIsICJPcmllbnRhdGlvbiIsICJTZWxlY3Rpb24iLCAiVGFicyIsICJUZXh0IiwgIlRleHRMaW1pdCIsICJUb29sVGlwVGV4dCIsICJUb3BJbmRleCJ9OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlRleHQiOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCkgewotCQlzdXBlci5zZXRFeGFtcGxlV2lkZ2V0U3RhdGUgKCk7Ci0JCXdyYXBCdXR0b24uc2V0U2VsZWN0aW9uICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJcmVhZE9ubHlCdXR0b24uc2V0U2VsZWN0aW9uICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5SRUFEX09OTFkpICE9IDApOwotCQlwYXNzd29yZEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULlBBU1NXT1JEKSAhPSAwKTsKLQkJc2VhcmNoQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuU0VBUkNIKSAhPSAwKTsKLQkJbGVmdEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULkxFRlQpICE9IDApOwotCQljZW50ZXJCdXR0b24uc2V0U2VsZWN0aW9uICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5DRU5URVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULlJJR0hUKSAhPSAwKTsKLQkJCi0JCS8qIFNwZWNpYWwgY2FzZTogQ0FOQ0VMIGFuZCBIX1NDUk9MTCBoYXZlIHRoZSBzYW1lIHZhbHVlLAotCQkgKiBzbyB0byBhdm9pZCBjb25mdXNpb24sIG9ubHkgc2V0IENBTkNFTCBpZiBTRUFSQ0ggaXMgc2V0LiAqLwotCQlpZiAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuU0VBUkNIKSAhPSAwKSB7Ci0JCQljYW5jZWxCdXR0b24uc2V0U2VsZWN0aW9uICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5DQU5DRUwpICE9IDApOwotCQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWNhbmNlbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCWhvcml6b250YWxCdXR0b24uc2V0U2VsZWN0aW9uICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5IX1NDUk9MTCkgIT0gMCk7Ci0JCX0KLQotCQlwYXNzd29yZEJ1dHRvbi5zZXRFbmFibGVkICgodGV4dC5nZXRTdHlsZSAoKSAmIFNXVC5TSU5HTEUpICE9IDApOwotCQlzZWFyY2hCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuU0lOR0xFKSAhPSAwKTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQgKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULlNFQVJDSCkgIT0gMCk7Ci0JCXdyYXBCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCQlob3Jpem9udGFsQnV0dG9uLnNldEVuYWJsZWQgKCh0ZXh0LmdldFN0eWxlICgpICYgU1dULk1VTFRJKSAhPSAwKTsKLQkJdmVydGljYWxCdXR0b24uc2V0RW5hYmxlZCAoKHRleHQuZ2V0U3R5bGUgKCkgJiBTV1QuTVVMVEkpICE9IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xCYXJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1Rvb2xCYXJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTQzZDEyNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Ub29sQmFyVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1jbGFzcyBUb29sQmFyVGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRvb2xCYXIgaW1hZ2VUb29sQmFyLCB0ZXh0VG9vbEJhciwgaW1hZ2VUZXh0VG9vbEJhcjsKLQlHcm91cCBpbWFnZVRvb2xCYXJHcm91cCwgdGV4dFRvb2xCYXJHcm91cCwgaW1hZ2VUZXh0VG9vbEJhckdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gaG9yaXpvbnRhbEJ1dHRvbiwgdmVydGljYWxCdXR0b24sIGZsYXRCdXR0b24sIHNoYWRvd091dEJ1dHRvbiwgd3JhcEJ1dHRvbiwgcmlnaHRCdXR0b247Ci0KLQkvKiBPdGhlciB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiT3RoZXIiIGdyb3VwICovCi0JQnV0dG9uIGNvbWJvQ2hpbGRCdXR0b247Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRvb2xCYXJUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVHcm91cCAoKSB7Ci0JCXN1cGVyLmNyZWF0ZUV4YW1wbGVHcm91cCAoKTsKLQkJCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgaW1hZ2UgdG9vbCBiYXIgKi8KLQkJaW1hZ2VUb29sQmFyR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQlpbWFnZVRvb2xCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW1hZ2VUb29sQmFyR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJaW1hZ2VUb29sQmFyR3JvdXAuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlX1Rvb2xCYXIiKSk7Ci0JCi0JCS8qIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgdGV4dCB0b29sIGJhciAqLwotCQl0ZXh0VG9vbEJhckdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdGV4dFRvb2xCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJdGV4dFRvb2xCYXJHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0ZXh0VG9vbEJhckdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUZXh0X1Rvb2xCYXIiKSk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGltYWdlIGFuZCB0ZXh0IHRvb2wgYmFyICovCi0JCWltYWdlVGV4dFRvb2xCYXJHcm91cCA9IG5ldyBHcm91cCAoZXhhbXBsZUdyb3VwLCBTV1QuTk9ORSk7Ci0JCWltYWdlVGV4dFRvb2xCYXJHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJaW1hZ2VUZXh0VG9vbEJhckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlVGV4dFRvb2xCYXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2VUZXh0X1Rvb2xCYXIiKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQotCQkvKiBDb21wdXRlIHRoZSB3aWRnZXQgc3R5bGUgKi8KLQkJaW50IHN0eWxlID0gZ2V0RGVmYXVsdFN0eWxlKCk7Ci0JCWlmIChob3Jpem9udGFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuSE9SSVpPTlRBTDsKLQkJaWYgKHZlcnRpY2FsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuVkVSVElDQUw7Ci0JCWlmIChmbGF0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuRkxBVDsKLQkJaWYgKHdyYXBCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5XUkFQOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQlpZiAoc2hhZG93T3V0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU0hBRE9XX09VVDsKLQkJaWYgKHJpZ2h0QnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuUklHSFQ7Ci0JCi0JCS8qCi0JCSogQ3JlYXRlIHRoZSBleGFtcGxlIHdpZGdldHMuCi0JCSoKLQkJKiBBIHRvb2wgYmFyIG11c3QgY29uc2lzdCBvZiBhbGwgaW1hZ2UgdG9vbAotCQkqIGl0ZW1zIG9yIGFsbCB0ZXh0IHRvb2wgaXRlbXMgYnV0IG5vdCBib3RoLgotCQkqLwotCQotCQkvKiBDcmVhdGUgdGhlIGltYWdlIHRvb2wgYmFyICovCi0JCWltYWdlVG9vbEJhciA9IG5ldyBUb29sQmFyIChpbWFnZVRvb2xCYXJHcm91cCwgc3R5bGUpOwotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5QVVNIIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULkNIRUNLKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQgKCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaUNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0ICgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5TRVBBUkFUT1IiKTsKLQkJaWYgKGNvbWJvQ2hpbGRCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoaW1hZ2VUb29sQmFyLCBTV1QuTk9ORSk7Ci0JCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjI1MCIsICI1MDAiLCAiNzUwIn0pOwotCQkJY29tYm8uc2V0VGV4dCAoY29tYm8uZ2V0SXRlbSAoMCkpOwotCQkJY29tYm8ucGFjayAoKTsKLQkJCWl0ZW0uc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0JCQlpdGVtLnNldENvbnRyb2wgKGNvbWJvKTsKLQkJfQotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCAoIlNXVC5EUk9QX0RPV04iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSB0ZXh0IHRvb2wgYmFyICovCi0JCXRleHRUb29sQmFyID0gbmV3IFRvb2xCYXIgKHRleHRUb29sQmFyR3JvdXAsIHN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNoZWNrIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuQ0hFQ0siKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJhZGlvIikpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuUkFESU8iKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAodGV4dFRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QuU0VQQVJBVE9SIik7Ci0JCWlmIChjb21ib0NoaWxkQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHRleHRUb29sQmFyLCBTV1QuTk9ORSk7Ci0JCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjI1MCIsICI1MDAiLCAiNzUwIn0pOwotCQkJY29tYm8uc2V0VGV4dCAoY29tYm8uZ2V0SXRlbSAoMCkpOwotCQkJY29tYm8ucGFjayAoKTsKLQkJCWl0ZW0uc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0JCQlpdGVtLnNldENvbnRyb2wgKGNvbWJvKTsKLQkJfQotCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0ZXh0VG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BfRG93biIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULkRST1BfRE9XTiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCS8qIENyZWF0ZSB0aGUgaW1hZ2UgYW5kIHRleHQgdG9vbCBiYXIgKi8KLQkJaW1hZ2VUZXh0VG9vbEJhciA9IG5ldyBUb29sQmFyIChpbWFnZVRleHRUb29sQmFyR3JvdXAsIHN0eWxlKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUHVzaCIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlBVU0giKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSAoaW1hZ2VUZXh0VG9vbEJhciwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSYWRpbyIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlJBRElPIik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGltYWdlVGV4dFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGluc3RhbmNlLmltYWdlc1tDb250cm9sRXhhbXBsZS5jaU9wZW5Gb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuQ0hFQ0spOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lUYXJnZXRdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2hlY2siKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5DSEVDSyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuUkFESU8pOwotCQlpdGVtLnNldEltYWdlIChpbnN0YW5jZS5pbWFnZXNbQ29udHJvbEV4YW1wbGUuY2lDbG9zZWRGb2xkZXJdKTsKLQkJaXRlbS5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmFkaW8iKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlNXVC5SQURJTyIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULlNFUEFSQVRPUiIpOwotCQlpZiAoY29tYm9DaGlsZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChpbWFnZVRleHRUb29sQmFyLCBTV1QuTk9ORSk7Ci0JCQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IjI1MCIsICI1MDAiLCAiNzUwIn0pOwotCQkJY29tYm8uc2V0VGV4dCAoY29tYm8uZ2V0SXRlbSAoMCkpOwotCQkJY29tYm8ucGFjayAoKTsKLQkJCWl0ZW0uc2V0V2lkdGggKGNvbWJvLmdldFNpemUgKCkueCk7Ci0JCQlpdGVtLnNldENvbnRyb2wgKGNvbWJvKTsKLQkJfQotCQlpdGVtID0gbmV3IFRvb2xJdGVtIChpbWFnZVRleHRUb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCWl0ZW0uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BfRG93biIpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dULkRST1BfRE9XTiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCS8qCi0JCSogRG8gbm90IGFkZCB0aGUgc2VsZWN0aW9uIGV2ZW50IGZvciB0aGlzIGRyb3AgZG93bgotCQkqIHRvb2wgaXRlbS4gIFdpdGhvdXQgaG9va2luZyB0aGUgZXZlbnQsIHRoZSBkcm9wIGRvd24KLQkJKiB3aWRnZXQgZG9lcyBub3RoaW5nIHNwZWNpYWwgd2hlbiB0aGUgZHJvcCBkb3duIGFyZWEKLQkJKiBpcyBzZWxlY3RlZC4KLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJY29tYm9DaGlsZEJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNvbWJvQ2hpbGRCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbWJvX2NoaWxkIikpOwotCQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQljb21ib0NoaWxkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIlN0eWxlIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZVN0eWxlR3JvdXAoKSB7Ci0JCXN1cGVyLmNyZWF0ZVN0eWxlR3JvdXAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWhvcml6b250YWxCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlob3Jpem9udGFsQnV0dG9uLnNldFRleHQgKCJTV1QuSE9SSVpPTlRBTCIpOwotCQl2ZXJ0aWNhbEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFRleHQgKCJTV1QuVkVSVElDQUwiKTsKLQkJZmxhdEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWZsYXRCdXR0b24uc2V0VGV4dCAoIlNXVC5GTEFUIik7Ci0JCXNoYWRvd091dEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNoYWRvd091dEJ1dHRvbi5zZXRUZXh0ICgiU1dULlNIQURPV19PVVQiKTsKLQkJd3JhcEJ1dHRvbiA9IG5ldyBCdXR0b24gKHN0eWxlR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXdyYXBCdXR0b24uc2V0VGV4dCAoIlNXVC5XUkFQIik7Ci0JCXJpZ2h0QnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULkNIRUNLKTsKLQkJcmlnaHRCdXR0b24uc2V0VGV4dCAoIlNXVC5SSUdIVCIpOwotCQlib3JkZXJCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlib3JkZXJCdXR0b24uc2V0VGV4dCAoIlNXVC5CT1JERVIiKTsKLQl9Ci0JCi0Jdm9pZCBkaXNwb3NlRXhhbXBsZVdpZGdldHMgKCkgewotCQlzdXBlci5kaXNwb3NlRXhhbXBsZVdpZGdldHMgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4ncyBpdGVtcywgaWYgYW55LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBleGFtcGxlIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zCi0JICovCi0JSXRlbSBbXSBnZXRFeGFtcGxlV2lkZ2V0SXRlbXMgKCkgewotCQlJdGVtIFtdIGltYWdlVG9vbEJhckl0ZW1zID0gaW1hZ2VUb29sQmFyLmdldEl0ZW1zKCk7Ci0JCUl0ZW0gW10gdGV4dFRvb2xCYXJJdGVtcyA9IHRleHRUb29sQmFyLmdldEl0ZW1zKCk7Ci0JCUl0ZW0gW10gaW1hZ2VUZXh0VG9vbEJhckl0ZW1zID0gaW1hZ2VUZXh0VG9vbEJhci5nZXRJdGVtcygpOwotCQlJdGVtIFtdIGFsbEl0ZW1zID0gbmV3IEl0ZW0gW2ltYWdlVG9vbEJhckl0ZW1zLmxlbmd0aCArIHRleHRUb29sQmFySXRlbXMubGVuZ3RoICsgaW1hZ2VUZXh0VG9vbEJhckl0ZW1zLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VUb29sQmFySXRlbXMsIDAsIGFsbEl0ZW1zLCAwLCBpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRleHRUb29sQmFySXRlbXMsIDAsIGFsbEl0ZW1zLCBpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGgsIHRleHRUb29sQmFySXRlbXMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShpbWFnZVRleHRUb29sQmFySXRlbXMsIDAsIGFsbEl0ZW1zLCBpbWFnZVRvb2xCYXJJdGVtcy5sZW5ndGggKyB0ZXh0VG9vbEJhckl0ZW1zLmxlbmd0aCwgaW1hZ2VUZXh0VG9vbEJhckl0ZW1zLmxlbmd0aCk7Ci0JCXJldHVybiBhbGxJdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQlXaWRnZXQgW10gZ2V0RXhhbXBsZVdpZGdldHMgKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldCBbXSB7aW1hZ2VUb29sQmFyLCB0ZXh0VG9vbEJhciwgaW1hZ2VUZXh0VG9vbEJhcn07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHNob3J0IHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFNob3J0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJUQiI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVG9vbEJhciI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJaG9yaXpvbnRhbEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChpbWFnZVRvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuSE9SSVpPTlRBTCkgIT0gMCk7Ci0JCXZlcnRpY2FsQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5WRVJUSUNBTCkgIT0gMCk7Ci0JCWZsYXRCdXR0b24uc2V0U2VsZWN0aW9uICgoaW1hZ2VUb29sQmFyLmdldFN0eWxlICgpICYgU1dULkZMQVQpICE9IDApOwotCQl3cmFwQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5XUkFQKSAhPSAwKTsKLQkJc2hhZG93T3V0QnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5TSEFET1dfT1VUKSAhPSAwKTsKLQkJYm9yZGVyQnV0dG9uLnNldFNlbGVjdGlvbiAoKGltYWdlVG9vbEJhci5nZXRTdHlsZSAoKSAmIFNXVC5CT1JERVIpICE9IDApOwotCQlyaWdodEJ1dHRvbi5zZXRTZWxlY3Rpb24gKChpbWFnZVRvb2xCYXIuZ2V0U3R5bGUgKCkgJiBTV1QuUklHSFQpICE9IDApOwotCX0KLQkKLQkvKioKLQkgKiBMaXN0ZW5zIHRvIHdpZGdldFNlbGVjdGVkKCkgZXZlbnRzIG9uIFNXVC5EUk9QX0RPV04gdHlwZSBUb29sSXRlbXMKLQkgKiBhbmQgb3BlbnMvY2xvc2VzIGEgbWVudSB3aGVuIGFwcHJvcHJpYXRlLgotCSAqLwotCWNsYXNzIERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51ICAgIG1lbnUgPSBudWxsOwotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCS8vIENyZWF0ZSB0aGUgbWVudSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjcmVhdGVkCi0JCQlpZiAobWVudSA9PSBudWxsKSB7Ci0JCQkJLy8gTGF6eSBjcmVhdGUgdGhlIG1lbnUuCi0JCQkJVG9vbEJhciB0b29sYmFyID0gKChUb29sSXRlbSkgZXZlbnQud2lkZ2V0KS5nZXRQYXJlbnQoKTsKLQkJCQlpbnQgc3R5bGUgPSB0b29sYmFyLmdldFN0eWxlKCkgJiAoU1dULlJJR0hUX1RPX0xFRlQgfCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCQkJbWVudSA9IG5ldyBNZW51KHNoZWxsLCBzdHlsZSB8IFNXVC5QT1BfVVApOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgOTsgKytpKSB7Ci0JCQkJCWZpbmFsIFN0cmluZyB0ZXh0ID0gQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyb3BEb3duRGF0YV8iICsgaSk7Ci0JCQkJCWlmICh0ZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJCQkJCW1lbnVJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogQSBzZWxlY3Rpb24gZXZlbnQgd2lsbCBiZSBmaXJlZCB3aGVuIGEgZHJvcCBkb3duIHRvb2wKLQkJCSAqIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIG1haW4gYXJlYSBhbmQgaW4gdGhlIGRyb3AKLQkJCSAqIGRvd24gYXJyb3cuICBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwgdG8gZGV0ZXJtaW5lCi0JCQkgKiB3aGVyZSB0aGUgd2lkZ2V0IHdhcyBzZWxlY3RlZC4KLQkJCSAqLwkJCi0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCS8qCi0JCQkJICogVGhlIGRyb3AgZG93biBhcnJvdyB3YXMgc2VsZWN0ZWQuCi0JCQkJICovCi0JCQkJLy8gUG9zaXRpb24gdGhlIG1lbnUgYmVsb3cgYW5kIHZlcnRpY2FsbHkgYWxpZ25lZCB3aXRoIHRoZSB0aGUgZHJvcCBkb3duIHRvb2wgYnV0dG9uLgotCQkJCWZpbmFsIFRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJZmluYWwgVG9vbEJhciAgdG9vbEJhciA9IHRvb2xJdGVtLmdldFBhcmVudCgpOwotCQkJCQotCQkJCVBvaW50IHBvaW50ID0gdG9vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkpOwotCQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0gCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Ub29sVGlwVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9Ub29sVGlwVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDJhODIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVG9vbFRpcFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotY2xhc3MgVG9vbFRpcFRhYiBleHRlbmRzIFRhYiB7Ci0KLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRvb2xUaXAgdG9vbFRpcDE7Ci0JR3JvdXAgdG9vbFRpcEdyb3VwOwotCQotCS8qIFN0eWxlIHdpZGdldHMgYWRkZWQgdG8gdGhlICJTdHlsZSIgZ3JvdXAgKi8KLQlCdXR0b24gYmFsbG9vbkJ1dHRvbiwgaWNvbkVycm9yQnV0dG9uLCBpY29uSW5mb3JtYXRpb25CdXR0b24sIGljb25XYXJuaW5nQnV0dG9uLCBub0ljb25CdXR0b247Ci0JCi0JLyogT3RoZXIgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIk90aGVyIiBncm91cCAqLwotCUJ1dHRvbiBhdXRvSGlkZUJ1dHRvbiwgc2hvd0luVHJheUJ1dHRvbjsKLQkKLQlUcmF5IHRyYXk7Ci0JVHJheUl0ZW0gdHJheUl0ZW07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRvb2xUaXBUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRvb2x0aXAgdmlzaWJpbGl0eSBjaGVjayBib3ggKi8KLQkJdG9vbFRpcEdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJdG9vbFRpcEdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0b29sVGlwR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdG9vbFRpcEdyb3VwLnNldFRleHQgKCJUb29sVGlwIik7Ci0JCXZpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uKHRvb2xUaXBHcm91cCwgU1dULkNIRUNLKTsKLQkJdmlzaWJsZUJ1dHRvbi5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJWaXNpYmxlIikpOwotCQl2aXNpYmxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0VmlzaWJpbGl0eSAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlRXhhbXBsZVdpZGdldHMgKCkgewotCQkKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoYmFsbG9vbkJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5CQUxMT09OOwotCQlpZiAoaWNvbkVycm9yQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fRVJST1I7Ci0JCWlmIChpY29uSW5mb3JtYXRpb25CdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSUNPTl9JTkZPUk1BVElPTjsKLQkJaWYgKGljb25XYXJuaW5nQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULklDT05fV0FSTklORzsKLQkJCi0JCS8qIENyZWF0ZSB0aGUgZXhhbXBsZSB3aWRnZXRzICovCi0JCXRvb2xUaXAxID0gbmV3IFRvb2xUaXAgKHNoZWxsLCBzdHlsZSk7Ci0JCXRvb2xUaXAxLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2xUaXBfVGl0bGUiKSk7Ci0JCXRvb2xUaXAxLnNldE1lc3NhZ2UoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4YW1wbGVfc3RyaW5nIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcik7Ci0KLQkJLyoKLQkJICogQWRkIGEgcmVzaXplIGxpc3RlbmVyIHRvIHRoZSB0YWJGb2xkZXJQYWdlIHNvIHRoYXQKLQkJICogaWYgdGhlIHVzZXIgdHlwZXMgaW50byB0aGUgZXhhbXBsZSB3aWRnZXQgdG8gY2hhbmdlCi0JCSAqIGl0cyBwcmVmZXJyZWQgc2l6ZSwgYW5kIHRoZW4gcmVzaXplcyB0aGUgc2hlbGwsIHdlCi0JCSAqIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZSBjb3JyZWN0bHkuCi0JCSAqLwotCQl0YWJGb2xkZXJQYWdlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU3R5bGVHcm91cCAoKTsKLQkKLQkJLyogQ3JlYXRlIHRoZSBleHRyYSB3aWRnZXRzICovCi0JCWJhbGxvb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQliYWxsb29uQnV0dG9uLnNldFRleHQgKCJTV1QuQkFMTE9PTiIpOwotCQlpY29uRXJyb3JCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpY29uRXJyb3JCdXR0b24uc2V0VGV4dCgiU1dULklDT05fRVJST1IiKTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbkluZm9ybWF0aW9uQnV0dG9uLnNldFRleHQoIlNXVC5JQ09OX0lORk9STUFUSU9OIik7Ci0JCWljb25XYXJuaW5nQnV0dG9uID0gbmV3IEJ1dHRvbiAoc3R5bGVHcm91cCwgU1dULlJBRElPKTsKLQkJaWNvbldhcm5pbmdCdXR0b24uc2V0VGV4dCgiU1dULklDT05fV0FSTklORyIpOwotCQlub0ljb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlub0ljb25CdXR0b24uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9fSWNvbiIpKTsKLQl9Ci0JCi0Jdm9pZCBjcmVhdGVDb2xvckFuZEZvbnRHcm91cCAoKSB7Ci0JCS8vIFRvb2xUaXAgZG9lcyBub3QgbmVlZCBhIGNvbG9yIGFuZCBmb250IGdyb3VwLgotCX0KLQkKLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQkvKiBDcmVhdGUgdGhlIGdyb3VwICovCi0JCW90aGVyR3JvdXAgPSBuZXcgR3JvdXAgKGNvbnRyb2xHcm91cCwgU1dULk5PTkUpOwotCQlvdGhlckdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQlvdGhlckdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJb3RoZXJHcm91cC5zZXRUZXh0IChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiT3RoZXIiKSk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgY29udHJvbHMgKi8KLQkJYXV0b0hpZGVCdXR0b24gPSBuZXcgQnV0dG9uKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWF1dG9IaWRlQnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkF1dG9IaWRlIikpOwotCQlzaG93SW5UcmF5QnV0dG9uID0gbmV3IEJ1dHRvbihvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzaG93SW5UcmF5QnV0dG9uLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNob3dfSW5fVHJheSIpKTsKLQkJdHJheSA9IGRpc3BsYXkuZ2V0U3lzdGVtVHJheSgpOwotCQlzaG93SW5UcmF5QnV0dG9uLnNldEVuYWJsZWQodHJheSAhPSBudWxsKTsKLQotCQkvKiBBZGQgdGhlIGxpc3RlbmVycyAqLwotCQlhdXRvSGlkZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0RXhhbXBsZVdpZGdldEF1dG9IaWRlICgpOwotCQkJfQotCQl9KTsKLQkJc2hvd0luVHJheUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2hvd0V4YW1wbGVXaWRnZXRJblRyYXkgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWRpc3Bvc2VUcmF5SXRlbSgpOwotCQkJfQotCQl9KTsKLQotCQkvKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgKi8KLQkJYXV0b0hpZGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQkKLQl2b2lkIGNyZWF0ZVNpemVHcm91cCAoKSB7Ci0JCS8vIFRvb2xUaXAgZG9lcyBub3QgbmVlZCBhIHNpemUgZ3JvdXAuCi0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCWRpc3Bvc2VUcmF5SXRlbSgpOwotCQlzdXBlci5kaXNwb3NlRXhhbXBsZVdpZGdldHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbi4KLQkgKi8KLQkvLyBUYWIgdXNlcyB0aGlzIGZvciBtYW55IHRoaW5ncyAtIHdpZGdldHMgd291bGQgb25seSBnZXQgc2V0L2dldCwgbGlzdGVuZXJzLCBhbmQgZGlzcG9zZS4KLQlXaWRnZXRbXSBnZXRFeGFtcGxlV2lkZ2V0cyAoKSB7Ci0JCXJldHVybiBuZXcgV2lkZ2V0IFtdIHt0b29sVGlwMX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiTWVzc2FnZSIsICJUZXh0In07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiVG9vbFRpcCI7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXNob3dFeGFtcGxlV2lkZ2V0SW5UcmF5ICgpOwotCQlzZXRFeGFtcGxlV2lkZ2V0QXV0b0hpZGUgKCk7Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJYmFsbG9vbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0b29sVGlwMS5nZXRTdHlsZSAoKSAmIFNXVC5CQUxMT09OKSAhPSAwKTsKLQkJaWNvbkVycm9yQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRvb2xUaXAxLmdldFN0eWxlICgpICYgU1dULklDT05fRVJST1IpICE9IDApOwotCQlpY29uSW5mb3JtYXRpb25CdXR0b24uc2V0U2VsZWN0aW9uICgodG9vbFRpcDEuZ2V0U3R5bGUgKCkgJiBTV1QuSUNPTl9JTkZPUk1BVElPTikgIT0gMCk7Ci0JCWljb25XYXJuaW5nQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRvb2xUaXAxLmdldFN0eWxlICgpICYgU1dULklDT05fV0FSTklORykgIT0gMCk7Ci0JCW5vSWNvbkJ1dHRvbi5zZXRTZWxlY3Rpb24gKCh0b29sVGlwMS5nZXRTdHlsZSAoKSAmIChTV1QuSUNPTl9FUlJPUiB8IFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULklDT05fV0FSTklORykpID09IDApOwotCQlhdXRvSGlkZUJ1dHRvbi5zZXRTZWxlY3Rpb24odG9vbFRpcDEuZ2V0QXV0b0hpZGUoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRFeGFtcGxlV2lkZ2V0VmlzaWJpbGl0eSAoKSB7Ci0JCXRvb2xUaXAxLnNldFZpc2libGUgKHZpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYXV0b0hpZGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0RXhhbXBsZVdpZGdldEF1dG9IaWRlICgpIHsKLQkJdG9vbFRpcDEuc2V0QXV0b0hpZGUoYXV0b0hpZGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0JCi0Jdm9pZCBzaG93RXhhbXBsZVdpZGdldEluVHJheSAoKSB7Ci0JCWlmIChzaG93SW5UcmF5QnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgewotCQkJY3JlYXRlVHJheUl0ZW0oKTsKLQkJCXRyYXlJdGVtLnNldFRvb2xUaXAodG9vbFRpcDEpOwotCQl9IGVsc2UgewotCQkJZGlzcG9zZVRyYXlJdGVtKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNyZWF0ZVRyYXlJdGVtKCkgewotCQlpZiAodHJheUl0ZW0gPT0gbnVsbCkgewotCQkJdHJheUl0ZW0gPSBuZXcgVHJheUl0ZW0odHJheSwgU1dULk5PTkUpOwotCQkJdHJheUl0ZW0uc2V0SW1hZ2UoaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpVGFyZ2V0XSk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBkaXNwb3NlVHJheUl0ZW0oKSB7Ci0JCWlmICh0cmF5SXRlbSAhPSBudWxsKSB7Ci0JCQl0cmF5SXRlbS5zZXRUb29sVGlwKG51bGwpOwotCQkJdHJheUl0ZW0uZGlzcG9zZSgpOwotCQkJdHJheUl0ZW0gPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVHJlZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvVHJlZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDEzNzgyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL1RyZWVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLWNsYXNzIFRyZWVUYWIgZXh0ZW5kcyBTY3JvbGxhYmxlVGFiIHsKLQkvKiBFeGFtcGxlIHdpZGdldHMgYW5kIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlbSAqLwotCVRyZWUgdHJlZTEsIHRyZWUyOwotCVRyZWVJdGVtIHRleHROb2RlMSwgaW1hZ2VOb2RlMTsKLQlHcm91cCB0cmVlR3JvdXAsIGltYWdlVHJlZUdyb3VwLCBpdGVtR3JvdXA7Ci0JCi0JLyogU2l6ZSB3aWRnZXRzIGFkZGVkIHRvIHRoZSAiU2l6ZSIgZ3JvdXAgKi8KLQlCdXR0b24gcGFja0NvbHVtbnNCdXR0b247Ci0JCi0JLyogU3R5bGUgd2lkZ2V0cyBhZGRlZCB0byB0aGUgIlN0eWxlIiBncm91cCAqLwotCUJ1dHRvbiBjaGVja0J1dHRvbiwgZnVsbFNlbGVjdGlvbkJ1dHRvbjsKLQotCS8qIE90aGVyIHdpZGdldHMgYWRkZWQgdG8gdGhlICJPdGhlciIgZ3JvdXAgKi8KLQlCdXR0b24gbXVsdGlwbGVDb2x1bW5zLCBtb3ZlYWJsZUNvbHVtbnMsIHJlc2l6YWJsZUNvbHVtbnMsIGhlYWRlclZpc2libGVCdXR0b24sIHNvcnRJbmRpY2F0b3JCdXR0b24sIGhlYWRlckltYWdlc0J1dHRvbiwgc3ViSW1hZ2VzQnV0dG9uLCBsaW5lc1Zpc2libGVCdXR0b247Ci0JCi0JLyogQ29udHJvbHMgYW5kIHJlc291cmNlcyBhZGRlZCB0byB0aGUgIkNvbG9ycyBhbmQgRm9udHMiIGdyb3VwICovCi0Jc3RhdGljIGZpbmFsIGludCBJVEVNX0ZPUkVHUk9VTkRfQ09MT1IgPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgSVRFTV9CQUNLR1JPVU5EX0NPTE9SID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IElURU1fRk9OVCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBDRUxMX0ZPUkVHUk9VTkRfQ09MT1IgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9CQUNLR1JPVU5EX0NPTE9SID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IENFTExfRk9OVCA9IDg7Ci0JQ29sb3IgaXRlbUZvcmVncm91bmRDb2xvciwgaXRlbUJhY2tncm91bmRDb2xvciwgY2VsbEZvcmVncm91bmRDb2xvciwgY2VsbEJhY2tncm91bmRDb2xvcjsKLQlGb250IGl0ZW1Gb250LCBjZWxsRm9udDsKLQotCXN0YXRpYyBTdHJpbmcgW10gY29sdW1uVGl0bGVzCT0ge0NvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzAiKSwKLQkJICAgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlVGl0bGVfMSIpLAotCQkgICBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVUaXRsZV8yIiksCi0JCSAgIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZVRpdGxlXzMiKX07Ci0JCSAgIAotCXN0YXRpYyBTdHJpbmdbXVtdIHRhYmxlRGF0YSA9IHsKLQkJCXsgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMCIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMF8xIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUwXzIiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTBfMyIpIH0sCi0JCQl7IENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzAiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTFfMSIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMV8yIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUxXzMiKSB9LAotCQkJeyBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8wIiksCi0JCQkJCUNvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYWJsZUxpbmUyXzEiKSwKLQkJCQkJQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlTGluZTJfMiIpLAotCQkJCQlDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGFibGVMaW5lMl8zIikgfSB9OwotCi0JUG9pbnQgbWVudU1vdXNlQ29vcmRzOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIENvbnRyb2xFeGFtcGxlLgotCSAqLwotCVRyZWVUYWIoQ29udHJvbEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJDb2xvcnMgYW5kIEZvbnRzIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbG9yQW5kRm9udEdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlQ29sb3JBbmRGb250R3JvdXAoKTsKLQkJCi0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtX0ZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW1fQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbV9Gb250IikpOwotCQlpdGVtID0gbmV3IFRhYmxlSXRlbShjb2xvckFuZEZvbnRUYWJsZSwgU1dULk5vbmUpOwotCQlpdGVtLnNldFRleHQoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDZWxsX0ZvcmVncm91bmRfQ29sb3IiKSk7Ci0JCWl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbG9yQW5kRm9udFRhYmxlLCBTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNlbGxfQmFja2dyb3VuZF9Db2xvciIpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29sb3JBbmRGb250VGFibGUsIFNXVC5Ob25lKTsKLQkJaXRlbS5zZXRUZXh0KENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ2VsbF9Gb250IikpOwotCi0JCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGl0ZW1CYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgaXRlbUZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJaWYgKGl0ZW1Gb250ICE9IG51bGwpIGl0ZW1Gb250LmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEJhY2tncm91bmRDb2xvciAhPSBudWxsKSBjZWxsQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEZvcmVncm91bmRDb2xvciAhPSBudWxsKSBjZWxsRm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY2VsbEZvbnQgIT0gbnVsbCkgY2VsbEZvbnQuZGlzcG9zZSgpOwotCQkJCWl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotCQkJCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBudWxsOwkJCQotCQkJCWl0ZW1Gb250ID0gbnVsbDsKLQkJCQljZWxsQmFja2dyb3VuZENvbG9yID0gbnVsbDsKLQkJCQljZWxsRm9yZWdyb3VuZENvbG9yID0gbnVsbDsJCQkKLQkJCQljZWxsRm9udCA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgY2hhbmdlRm9udE9yQ29sb3IoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJY2FzZSBJVEVNX0ZPUkVHUk9VTkRfQ09MT1I6IHsKLQkJCUNvbG9yIG9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCWlmIChvbGRDb2xvciA9PSBudWxsKSBvbGRDb2xvciA9IHRleHROb2RlMS5nZXRGb3JlZ3JvdW5kICgpOwotCQkJY29sb3JEaWFsb2cuc2V0UkdCKG9sZENvbG9yLmdldFJHQigpKTsKLQkJCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJCW9sZENvbG9yID0gaXRlbUZvcmVncm91bmRDb2xvcjsKLQkJCWl0ZW1Gb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IgKGRpc3BsYXksIHJnYik7Ci0JCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQljYXNlIElURU1fQkFDS0dST1VORF9DT0xPUjogewotCQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJaWYgKG9sZENvbG9yID09IG51bGwpIG9sZENvbG9yID0gdGV4dE5vZGUxLmdldEJhY2tncm91bmQgKCk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBpdGVtQmFja2dyb3VuZENvbG9yOwotCQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgSVRFTV9GT05UOiB7Ci0JCQlGb250IG9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0ZXh0Tm9kZTEuZ2V0Rm9udCAoKTsKLQkJCWZvbnREaWFsb2cuc2V0Rm9udExpc3Qob2xkRm9udC5nZXRGb250RGF0YSgpKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuICgpOwotCQkJaWYgKGZvbnREYXRhID09IG51bGwpIHJldHVybjsKLQkJCW9sZEZvbnQgPSBpdGVtRm9udDsKLQkJCWl0ZW1Gb250ID0gbmV3IEZvbnQgKGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCXNldEl0ZW1Gb250ICgpOwotCQkJc2V0RXhhbXBsZVdpZGdldFNpemUgKCk7Ci0JCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9GT1JFR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNlbGxGb3JlZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0ZXh0Tm9kZTEuZ2V0Rm9yZWdyb3VuZCAoMSk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBjZWxsRm9yZWdyb3VuZENvbG9yOwotCQkJY2VsbEZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldENlbGxGb3JlZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9CQUNLR1JPVU5EX0NPTE9SOiB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNlbGxCYWNrZ3JvdW5kQ29sb3I7Ci0JCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgb2xkQ29sb3IgPSB0ZXh0Tm9kZTEuZ2V0QmFja2dyb3VuZCAoMSk7Ci0JCQljb2xvckRpYWxvZy5zZXRSR0Iob2xkQ29sb3IuZ2V0UkdCKCkpOwotCQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZ2IgPT0gbnVsbCkgcmV0dXJuOwotCQkJb2xkQ29sb3IgPSBjZWxsQmFja2dyb3VuZENvbG9yOwotCQkJY2VsbEJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvciAoZGlzcGxheSwgcmdiKTsKLQkJCXNldENlbGxCYWNrZ3JvdW5kICgpOwotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIG9sZENvbG9yLmRpc3Bvc2UgKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgQ0VMTF9GT05UOiB7Ci0JCQlGb250IG9sZEZvbnQgPSBjZWxsRm9udDsKLQkJCWlmIChvbGRGb250ID09IG51bGwpIG9sZEZvbnQgPSB0ZXh0Tm9kZTEuZ2V0Rm9udCAoMSk7Ci0JCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KG9sZEZvbnQuZ2V0Rm9udERhdGEoKSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbiAoKTsKLQkJCWlmIChmb250RGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCQlvbGRGb250ID0gY2VsbEZvbnQ7Ci0JCQljZWxsRm9udCA9IG5ldyBGb250IChkaXNwbGF5LCBmb250RGF0YSk7Ci0JCQlzZXRDZWxsRm9udCAoKTsKLQkJCXNldEV4YW1wbGVXaWRnZXRTaXplICgpOwotCQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlICgpOwotCQl9Ci0JCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3VwZXIuY2hhbmdlRm9udE9yQ29sb3IoaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgIk90aGVyIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZU90aGVyR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVPdGhlckdyb3VwICgpOwotCQotCQkvKiBDcmVhdGUgZGlzcGxheSBjb250cm9scyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUgKi8KLQkJbGluZXNWaXNpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJbGluZXNWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lc19WaXNpYmxlIikpOwotCQltdWx0aXBsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQltdWx0aXBsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk11bHRpcGxlX0NvbHVtbnMiKSk7Ci0JCWhlYWRlclZpc2libGVCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQloZWFkZXJWaXNpYmxlQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJIZWFkZXJfVmlzaWJsZSIpKTsKLQkJc29ydEluZGljYXRvckJ1dHRvbiA9IG5ldyBCdXR0b24gKG90aGVyR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXNvcnRJbmRpY2F0b3JCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNvcnRfSW5kaWNhdG9yIikpOwotCQltb3ZlYWJsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQltb3ZlYWJsZUNvbHVtbnMuc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1vdmVhYmxlX0NvbHVtbnMiKSk7Ci0JCXJlc2l6YWJsZUNvbHVtbnMgPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlyZXNpemFibGVDb2x1bW5zLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZXNpemFibGVfQ29sdW1ucyIpKTsKLQkJaGVhZGVySW1hZ2VzQnV0dG9uID0gbmV3IEJ1dHRvbiAob3RoZXJHcm91cCwgU1dULkNIRUNLKTsKLQkJaGVhZGVySW1hZ2VzQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJIZWFkZXJfSW1hZ2VzIikpOwotCQlzdWJJbWFnZXNCdXR0b24gPSBuZXcgQnV0dG9uIChvdGhlckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlzdWJJbWFnZXNCdXR0b24uc2V0VGV4dCAoQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN1Yl9JbWFnZXMiKSk7Ci0JCi0JCS8qIEFkZCB0aGUgbGlzdGVuZXJzICovCi0JCWxpbmVzVmlzaWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpOwotCQkJfQotCQl9KTsKLQkJbXVsdGlwbGVDb2x1bW5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZWNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpOwotCQkJfQotCQl9KTsKLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0V2lkZ2V0SGVhZGVyVmlzaWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCXNvcnRJbmRpY2F0b3JCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFdpZGdldFNvcnRJbmRpY2F0b3IgKCk7Ci0JCQl9Ci0JCX0pOwotCQltb3ZlYWJsZUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldENvbHVtbnNNb3ZlYWJsZSAoKTsKLQkJCX0KLQkJfSk7Ci0JCXJlc2l6YWJsZUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldENvbHVtbnNSZXNpemFibGUgKCk7Ci0JCQl9Ci0JCX0pOwotCQloZWFkZXJJbWFnZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCQlzdWJJbWFnZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlY3JlYXRlRXhhbXBsZVdpZGdldHMgKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVFeGFtcGxlR3JvdXAgKCkgewotCQlzdXBlci5jcmVhdGVFeGFtcGxlR3JvdXAgKCk7Ci0JCQotCQkvKiBDcmVhdGUgYSBncm91cCBmb3IgdGhlIHRleHQgdHJlZSAqLwotCQl0cmVlR3JvdXAgPSBuZXcgR3JvdXAgKGV4YW1wbGVHcm91cCwgU1dULk5PTkUpOwotCQl0cmVlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXRyZWVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0cmVlR3JvdXAuc2V0VGV4dCAoIlRyZWUiKTsKLQkKLQkJLyogQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBpbWFnZSB0cmVlICovCi0JCWltYWdlVHJlZUdyb3VwID0gbmV3IEdyb3VwIChleGFtcGxlR3JvdXAsIFNXVC5OT05FKTsKLQkJaW1hZ2VUcmVlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCWltYWdlVHJlZUdyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWltYWdlVHJlZUdyb3VwLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUcmVlX1dpdGhfSW1hZ2VzIikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUV4YW1wbGVXaWRnZXRzICgpIHsKLQkJLyogQ29tcHV0ZSB0aGUgd2lkZ2V0IHN0eWxlICovCi0JCWludCBzdHlsZSA9IGdldERlZmF1bHRTdHlsZSgpOwotCQlpZiAoc2luZ2xlQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuU0lOR0xFOwotCQlpZiAobXVsdGlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlIHw9IFNXVC5NVUxUSTsKLQkJaWYgKGhvcml6b250YWxCdXR0b24uZ2V0U2VsZWN0aW9uICgpKSBzdHlsZSB8PSBTV1QuSF9TQ1JPTEw7Ci0JCWlmICh2ZXJ0aWNhbEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHN0eWxlIHw9IFNXVC5WX1NDUk9MTDsKLQkJaWYgKGNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQ0hFQ0s7Ci0JCWlmIChmdWxsU2VsZWN0aW9uQnV0dG9uLmdldFNlbGVjdGlvbiAoKSkgc3R5bGUgfD0gU1dULkZVTExfU0VMRUNUSU9OOwotCQlpZiAoYm9yZGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZSB8PSBTV1QuQk9SREVSOwotCQotCQkvKiBDcmVhdGUgdGhlIHRleHQgdHJlZSAqLwotCQl0cmVlMSA9IG5ldyBUcmVlICh0cmVlR3JvdXAsIHN0eWxlKTsKLQkJYm9vbGVhbiBtdWx0aUNvbHVtbiA9IG11bHRpcGxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKG11bHRpQ29sdW1uKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblRpdGxlcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVDb2x1bW4gdHJlZUNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUxLCBTV1QuTk9ORSk7Ci0JCQkJdHJlZUNvbHVtbi5zZXRUZXh0KGNvbHVtblRpdGxlc1tpXSk7Ci0JCQkJdHJlZUNvbHVtbi5zZXRUb29sVGlwVGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVG9vbHRpcCIsIG5ldyBTdHJpbmcgW10ge2NvbHVtblRpdGxlc1tpXX0pKTsKLQkJCX0KLQkJCXRyZWUxLnNldFNvcnRDb2x1bW4odHJlZTEuZ2V0Q29sdW1uKDApKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZTEsIFNXVC5OT05FKTsKLQkJCXNldEl0ZW1UZXh0KGl0ZW0sIGksIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXyIgKyAoaSArIDEpKSk7Ci0JCQlpZiAoaSA8IDMpIHsKLQkJCQlUcmVlSXRlbSBzdWJpdGVtID0gbmV3IFRyZWVJdGVtIChpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc2V0SXRlbVRleHQoc3ViaXRlbSwgaSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfIiArIChpICsgMSkgKyAiXzEiKSk7Ci0JCQl9Ci0JCX0KLQkJVHJlZUl0ZW0gdHJlZVJvb3RzW10gPSB0cmVlMS5nZXRJdGVtcyAoKTsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZVJvb3RzWzFdLCBTV1QuTk9ORSk7Ci0JCXNldEl0ZW1UZXh0KGl0ZW0sIDEsIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXzJfMiIpKTsKLQkJaXRlbSA9IG5ldyBUcmVlSXRlbSAoaXRlbSwgU1dULk5PTkUpOwotCQlzZXRJdGVtVGV4dChpdGVtLCAxLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8yXzJfMSIpKTsJCQkJCQotCQl0ZXh0Tm9kZTEgPSB0cmVlUm9vdHNbMF07Ci0JCXBhY2tDb2x1bW5zKHRyZWUxKTsKLQkJdHJ5IHsKLQkJCVRyZWVDb2x1bW4gY29sdW1uID0gdHJlZTEuZ2V0Q29sdW1uKDApOwotCQkJcmVzaXphYmxlQ29sdW1ucy5zZXRTZWxlY3Rpb24gKGNvbHVtbi5nZXRSZXNpemFibGUoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQotCQkvKiBDcmVhdGUgdGhlIGltYWdlIHRyZWUgKi8JCi0JCXRyZWUyID0gbmV3IFRyZWUgKGltYWdlVHJlZUdyb3VwLCBzdHlsZSk7Ci0JCUltYWdlIGltYWdlID0gaW5zdGFuY2UuaW1hZ2VzW0NvbnRyb2xFeGFtcGxlLmNpQ2xvc2VkRm9sZGVyXTsKLQkJaWYgKG11bHRpQ29sdW1uKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblRpdGxlcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVDb2x1bW4gdHJlZUNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCQkJdHJlZUNvbHVtbi5zZXRUZXh0KGNvbHVtblRpdGxlc1tpXSk7Ci0JCQkJdHJlZUNvbHVtbi5zZXRUb29sVGlwVGV4dChDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVG9vbHRpcCIsIG5ldyBTdHJpbmcgW10ge2NvbHVtblRpdGxlc1tpXX0pKTsKLQkJCQlpZiAoaGVhZGVySW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB0cmVlQ29sdW1uLnNldEltYWdlKGluc3RhbmNlLmltYWdlcyBbaSAlIDNdKTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZTIsIFNXVC5OT05FKTsKLQkJCXNldEl0ZW1UZXh0KGl0ZW0sIGksIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXyIgKyAoaSArIDEpKSk7Ci0JCQlpZiAobXVsdGlDb2x1bW4gJiYgc3ViSW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaXRlbS5zZXRJbWFnZShqLCBpbWFnZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJCX0KLQkJCWlmIChpIDwgMykgewotCQkJCVRyZWVJdGVtIHN1Yml0ZW0gPSBuZXcgVHJlZUl0ZW0gKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzZXRJdGVtVGV4dChzdWJpdGVtLCBpLCBDb250cm9sRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTm9kZV8iICsgKGkgKyAxKSArICJfMSIpKTsKLQkJCQlpZiAobXVsdGlDb2x1bW4gJiYgc3ViSW1hZ2VzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlzdWJpdGVtLnNldEltYWdlKGosIGltYWdlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXN1Yml0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cmVlUm9vdHMgPSB0cmVlMi5nZXRJdGVtcyAoKTsKLQkJaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZVJvb3RzWzFdLCBTV1QuTk9ORSk7Ci0JCXNldEl0ZW1UZXh0KGl0ZW0sIDEsIENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb2RlXzJfMiIpKTsKLQkJaWYgKG11bHRpQ29sdW1uICYmIHN1YkltYWdlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5UaXRsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlpdGVtLnNldEltYWdlKGosIGltYWdlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQl9Ci0JCWl0ZW0gPSBuZXcgVHJlZUl0ZW0gKGl0ZW0sIFNXVC5OT05FKTsKLQkJc2V0SXRlbVRleHQoaXRlbSwgMSwgQ29udHJvbEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vZGVfMl8yXzEiKSk7Ci0JCWlmIChtdWx0aUNvbHVtbiAmJiBzdWJJbWFnZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaXRlbS5zZXRJbWFnZShqLCBpbWFnZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJfQotCQlpbWFnZU5vZGUxID0gdHJlZVJvb3RzWzBdOwotCQlwYWNrQ29sdW1ucyh0cmVlMik7Ci0JfQotCQotCXZvaWQgc2V0SXRlbVRleHQoVHJlZUl0ZW0gaXRlbSwgaW50IGksIFN0cmluZyBub2RlKSB7Ci0JCWludCBpbmRleCA9IGkgJSAzOwotCQlpZiAobXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpKSB7Ci0JCQl0YWJsZURhdGEgW2luZGV4XVswXSA9IG5vZGU7Ci0JCQlpdGVtLnNldFRleHQgKHRhYmxlRGF0YSBbaW5kZXhdKTsKLQkJfSBlbHNlIHsKLQkJCWl0ZW0uc2V0VGV4dCAobm9kZSk7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSAiU2l6ZSIgZ3JvdXAuICBUaGUgIlNpemUiIGdyb3VwIGNvbnRhaW5zCi0JICogY29udHJvbHMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHNpemUgb2YKLQkgKiB0aGUgZXhhbXBsZSB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlU2l6ZUdyb3VwICgpIHsKLQkJc3VwZXIuY3JlYXRlU2l6ZUdyb3VwKCk7Ci0JCi0JCXBhY2tDb2x1bW5zQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2l6ZUdyb3VwLCBTV1QuUFVTSCk7Ci0JCXBhY2tDb2x1bW5zQnV0dG9uLnNldFRleHQgKENvbnRyb2xFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYWNrX0NvbHVtbnMiKSk7Ci0JCXBhY2tDb2x1bW5zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXBhY2tDb2x1bW5zICh0cmVlMSk7Ci0JCQkJcGFja0NvbHVtbnMgKHRyZWUyKTsKLQkJCQlzZXRFeGFtcGxlV2lkZ2V0U2l6ZSAoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJTdHlsZSIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVTdHlsZUdyb3VwKCkgewotCQlzdXBlci5jcmVhdGVTdHlsZUdyb3VwKCk7Ci0JCQotCQkvKiBDcmVhdGUgdGhlIGV4dHJhIHdpZGdldHMgKi8KLQkJY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQljaGVja0J1dHRvbi5zZXRUZXh0ICgiU1dULkNIRUNLIik7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24gPSBuZXcgQnV0dG9uIChzdHlsZUdyb3VwLCBTV1QuQ0hFQ0spOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFRleHQgKCJTV1QuRlVMTF9TRUxFQ1RJT04iKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgIkV4YW1wbGUiIHdpZGdldCBjaGlsZHJlbidzIGl0ZW1zLCBpZiBhbnkuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGV4YW1wbGUgd2lkZ2V0IGNoaWxkcmVuJ3MgaXRlbXMKLQkgKi8KLQlJdGVtIFtdIGdldEV4YW1wbGVXaWRnZXRJdGVtcyAoKSB7Ci0JCS8qIE5vdGU6IFdlIGRvIG5vdCBib3RoZXIgY29sbGVjdGluZyB0aGUgdHJlZSBpdGVtcwotCQkgKiBiZWNhdXNlIHRyZWUgaXRlbXMgZG9uJ3QgaGF2ZSBhbnkgZXZlbnRzLiBJZiBldmVudHMKLQkJICogYXJlIGV2ZXIgYWRkZWQgdG8gVHJlZUl0ZW0sIHRoZW4gdGhpcyBuZWVkcyB0byBjaGFuZ2UuCi0JCSAqLwotCQlJdGVtIFtdIGNvbHVtbnMxID0gdHJlZTEuZ2V0Q29sdW1ucygpOwotCQlJdGVtIFtdIGNvbHVtbnMyID0gdHJlZTIuZ2V0Q29sdW1ucygpOwotCQlJdGVtIFtdIGFsbEl0ZW1zID0gbmV3IEl0ZW0gW2NvbHVtbnMxLmxlbmd0aCArIGNvbHVtbnMyLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY29sdW1uczEsIDAsIGFsbEl0ZW1zLCAwLCBjb2x1bW5zMS5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbHVtbnMyLCAwLCBhbGxJdGVtcywgY29sdW1uczEubGVuZ3RoLCBjb2x1bW5zMi5sZW5ndGgpOwotCQlyZXR1cm4gYWxsSXRlbXM7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlICJFeGFtcGxlIiB3aWRnZXQgY2hpbGRyZW4uCi0JICovCi0JV2lkZ2V0IFtdIGdldEV4YW1wbGVXaWRnZXRzICgpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXQgW10ge3RyZWUxLCB0cmVlMn07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHNldC9nZXQgQVBJIG1ldGhvZCBuYW1lcyAod2l0aG91dCB0aGUgc2V0L2dldCBwcmVmaXgpCi0JICogdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQvZ2V0IHZhbHVlcyBpbiB0aGUgZXhhbXBsZSBjb250cm9sKHMpLgotCSAqLwotCVN0cmluZ1tdIGdldE1ldGhvZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsiQ29sdW1uT3JkZXIiLCAiU2VsZWN0aW9uIiwgIlRvb2xUaXBUZXh0IiwgIlRvcEl0ZW0ifTsKLQl9Ci0KLQlPYmplY3RbXSBwYXJhbWV0ZXJGb3JUeXBlKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHZhbHVlLCBXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoIm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtIikpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBmaW5kSXRlbSh2YWx1ZSwgKChUcmVlKSB3aWRnZXQpLmdldEl0ZW1zKCkpOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgcmV0dXJuIG5ldyBPYmplY3RbXSB7aXRlbX07Ci0JCX0KLQkJaWYgKHR5cGVOYW1lLmVxdWFscygiW0xvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsiKSkgewotCQkJU3RyaW5nW10gdmFsdWVzID0gc3BsaXQodmFsdWUsICcsJyk7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW3ZhbHVlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gZmluZEl0ZW0odmFsdWVzW2ldLCAoKFRyZWUpIHdpZGdldCkuZ2V0SXRlbXMoKSk7Ci0JCQkJaWYgKGl0ZW0gPT0gbnVsbCkgYnJlYWs7Ci0JCQkJaXRlbXNbaV0gPSBpdGVtOwkJCQkKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0W10ge2l0ZW1zfTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucGFyYW1ldGVyRm9yVHlwZSh0eXBlTmFtZSwgdmFsdWUsIHdpZGdldCk7Ci0JfQotCi0JVHJlZUl0ZW0gZmluZEl0ZW0oU3RyaW5nIHZhbHVlLCBUcmVlSXRlbVtdIGl0ZW1zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCWlmIChpdGVtLmdldFRleHQoKS5lcXVhbHModmFsdWUpKSByZXR1cm4gaXRlbTsKLQkJCWl0ZW0gPSBmaW5kSXRlbSh2YWx1ZSwgaXRlbS5nZXRJdGVtcygpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIlRyZWUiOwotCX0KLQotCXZvaWQgcGFja0NvbHVtbnMgKFRyZWUgdHJlZSkgewotCQlpZiAobXVsdGlwbGVDb2x1bW5zLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpbnQgY29sdW1uQ291bnQgPSB0cmVlLmdldENvbHVtbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJCQlUcmVlQ29sdW1uIHRyZWVDb2x1bW4gPSB0cmVlLmdldENvbHVtbihpKTsKLQkJCQl0cmVlQ29sdW1uLnBhY2soKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtb3ZlYWJsZSBjb2x1bW5zIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldENvbHVtbnNNb3ZlYWJsZSAoKSB7Ci0JCWJvb2xlYW4gc2VsZWN0aW9uID0gbW92ZWFibGVDb2x1bW5zLmdldFNlbGVjdGlvbigpOwotCQlUcmVlQ29sdW1uW10gY29sdW1uczEgPSB0cmVlMS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uczEubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnMxW2ldLnNldE1vdmVhYmxlKHNlbGVjdGlvbik7Ci0JCX0KLQkJVHJlZUNvbHVtbltdIGNvbHVtbnMyID0gdHJlZTIuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMyLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zMltpXS5zZXRNb3ZlYWJsZShzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVzaXphYmxlIGNvbHVtbnMgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0Q29sdW1uc1Jlc2l6YWJsZSAoKSB7Ci0JCWJvb2xlYW4gc2VsZWN0aW9uID0gcmVzaXphYmxlQ29sdW1ucy5nZXRTZWxlY3Rpb24oKTsKLQkJVHJlZUNvbHVtbltdIGNvbHVtbnMxID0gdHJlZTEuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMxLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5zMVtpXS5zZXRSZXNpemFibGUoc2VsZWN0aW9uKTsKLQkJfQotCQlUcmVlQ29sdW1uW10gY29sdW1uczIgPSB0cmVlMi5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uczIubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnMyW2ldLnNldFJlc2l6YWJsZShzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciwgYmFja2dyb3VuZCBjb2xvciwgYW5kIGZvbnQKLQkgKiBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMgdG8gdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKiBBbHNvIHNldHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxCi0JICogVHJlZUl0ZW1zIHRvIGRlZmF1bHQgc2V0dGluZ3MuCi0JICovCi0Jdm9pZCByZXNldENvbG9yc0FuZEZvbnRzICgpIHsKLQkJc3VwZXIucmVzZXRDb2xvcnNBbmRGb250cyAoKTsKLQkJQ29sb3Igb2xkQ29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQlpdGVtRm9yZWdyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0SXRlbUZvcmVncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCW9sZENvbG9yID0gaXRlbUJhY2tncm91bmRDb2xvcjsKLQkJaXRlbUJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlGb250IG9sZEZvbnQgPSBmb250OwotCQlpdGVtRm9udCA9IG51bGw7Ci0JCXNldEl0ZW1Gb250ICgpOwotCQlpZiAob2xkRm9udCAhPSBudWxsKSBvbGRGb250LmRpc3Bvc2UoKTsKLQkJb2xkQ29sb3IgPSBjZWxsRm9yZWdyb3VuZENvbG9yOwotCQljZWxsRm9yZWdyb3VuZENvbG9yID0gbnVsbDsKLQkJc2V0Q2VsbEZvcmVncm91bmQgKCk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JCW9sZENvbG9yID0gY2VsbEJhY2tncm91bmRDb2xvcjsKLQkJY2VsbEJhY2tncm91bmRDb2xvciA9IG51bGw7Ci0JCXNldENlbGxCYWNrZ3JvdW5kICgpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCQlvbGRGb250ID0gZm9udDsKLQkJY2VsbEZvbnQgPSBudWxsOwotCQlzZXRDZWxsRm9udCAoKTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgb2xkRm9udC5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKSB7Ci0JCXNldEl0ZW1CYWNrZ3JvdW5kICgpOwotCQlzZXRJdGVtRm9yZWdyb3VuZCAoKTsKLQkJc2V0SXRlbUZvbnQgKCk7Ci0JCXNldENlbGxCYWNrZ3JvdW5kICgpOwotCQlzZXRDZWxsRm9yZWdyb3VuZCAoKTsKLQkJc2V0Q2VsbEZvbnQgKCk7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJc2V0Q29sdW1uc01vdmVhYmxlICgpOwotCQkJc2V0Q29sdW1uc1Jlc2l6YWJsZSAoKTsKLQkJCXNldFdpZGdldEhlYWRlclZpc2libGUgKCk7Ci0JCQlzZXRXaWRnZXRTb3J0SW5kaWNhdG9yICgpOwotCQkJc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpOwotCQl9Ci0JCXN1cGVyLnNldEV4YW1wbGVXaWRnZXRTdGF0ZSAoKTsKLQkJY2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uICgodHJlZTEuZ2V0U3R5bGUgKCkgJiBTV1QuQ0hFQ0spICE9IDApOwotCQljaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24gKCh0cmVlMi5nZXRTdHlsZSAoKSAmIFNXVC5DSEVDSykgIT0gMCk7Ci0JCWZ1bGxTZWxlY3Rpb25CdXR0b24uc2V0U2VsZWN0aW9uICgodHJlZTEuZ2V0U3R5bGUgKCkgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApOwotCQlmdWxsU2VsZWN0aW9uQnV0dG9uLnNldFNlbGVjdGlvbiAoKHRyZWUyLmdldFN0eWxlICgpICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKTsKLQkJdHJ5IHsKLQkJCVRyZWVDb2x1bW4gY29sdW1uID0gdHJlZTEuZ2V0Q29sdW1uKDApOwotCQkJbW92ZWFibGVDb2x1bW5zLnNldFNlbGVjdGlvbiAoY29sdW1uLmdldE1vdmVhYmxlKCkpOwotCQkJcmVzaXphYmxlQ29sdW1ucy5zZXRTZWxlY3Rpb24gKGNvbHVtbi5nZXRSZXNpemFibGUoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQkJaGVhZGVyVmlzaWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRyZWUxLmdldEhlYWRlclZpc2libGUoKSk7Ci0JCWxpbmVzVmlzaWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRyZWUxLmdldExpbmVzVmlzaWJsZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxIFRyZWVJdGVtcyBpbiBjb2x1bW4gMS4KLQkgKi8KLQl2b2lkIHNldENlbGxCYWNrZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0ZXh0Tm9kZTEuc2V0QmFja2dyb3VuZCAoMSwgY2VsbEJhY2tncm91bmRDb2xvcik7Ci0JCQlpbWFnZU5vZGUxLnNldEJhY2tncm91bmQgKDEsIGNlbGxCYWNrZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8qIFNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGNlbGwuICovCi0JCUNvbG9yIGNvbG9yID0gY2VsbEJhY2tncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGV4dE5vZGUxLmdldEJhY2tncm91bmQgKDEpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oQ0VMTF9CQUNLR1JPVU5EX0NPTE9SKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGNvbG9ySW1hZ2UoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxIFRyZWVJdGVtcyBpbiBjb2x1bW4gMS4KLQkgKi8KLQl2b2lkIHNldENlbGxGb3JlZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0ZXh0Tm9kZTEuc2V0Rm9yZWdyb3VuZCAoMSwgY2VsbEZvcmVncm91bmRDb2xvcik7Ci0JCQlpbWFnZU5vZGUxLnNldEZvcmVncm91bmQgKDEsIGNlbGxGb3JlZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8qIFNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIGNlbGwuICovCi0JCUNvbG9yIGNvbG9yID0gY2VsbEZvcmVncm91bmRDb2xvcjsKLQkJaWYgKGNvbG9yID09IG51bGwpIGNvbG9yID0gdGV4dE5vZGUxLmdldEZvcmVncm91bmQgKDEpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oQ0VMTF9GT1JFR1JPVU5EX0NPTE9SKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGNvbG9ySW1hZ2UoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9udCBvZiB0aGUgTm9kZSAxIFRyZWVJdGVtcyBpbiBjb2x1bW4gMS4KLQkgKi8KLQl2b2lkIHNldENlbGxGb250ICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0ZXh0Tm9kZTEuc2V0Rm9udCAoMSwgY2VsbEZvbnQpOwotCQkJaW1hZ2VOb2RlMS5zZXRGb250ICgxLCBjZWxsRm9udCk7Ci0JCX0KLQkJLyogU2V0IHRoZSBmb250IGl0ZW0ncyBpbWFnZSB0byBtYXRjaCB0aGUgZm9udCBvZiB0aGUgaXRlbS4gKi8KLQkJRm9udCBmdCA9IGNlbGxGb250OwotCQlpZiAoZnQgPT0gbnVsbCkgZnQgPSB0ZXh0Tm9kZTEuZ2V0Rm9udCAoMSk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShDRUxMX0ZPTlQpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoZm9udEltYWdlKGZ0KSk7Ci0JCWl0ZW0uc2V0Rm9udChmdCk7Ci0JCWNvbG9yQW5kRm9udFRhYmxlLmxheW91dCAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBOb2RlIDEgVHJlZUl0ZW1zLgotCSAqLwotCXZvaWQgc2V0SXRlbUJhY2tncm91bmQgKCkgewotCQlpZiAoIWluc3RhbmNlLnN0YXJ0dXApIHsKLQkJCXRleHROb2RlMS5zZXRCYWNrZ3JvdW5kIChpdGVtQmFja2dyb3VuZENvbG9yKTsKLQkJCWltYWdlTm9kZTEuc2V0QmFja2dyb3VuZCAoaXRlbUJhY2tncm91bmRDb2xvcik7Ci0JCX0KLQkJLyogU2V0IHRoZSBiYWNrZ3JvdW5kIGJ1dHRvbidzIGNvbG9yIHRvIG1hdGNoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBpdGVtLiAqLwotCQlDb2xvciBjb2xvciA9IGl0ZW1CYWNrZ3JvdW5kQ29sb3I7Ci0JCWlmIChjb2xvciA9PSBudWxsKSBjb2xvciA9IHRleHROb2RlMS5nZXRCYWNrZ3JvdW5kICgpOwotCQlUYWJsZUl0ZW0gaXRlbSA9IGNvbG9yQW5kRm9udFRhYmxlLmdldEl0ZW0oSVRFTV9CQUNLR1JPVU5EX0NPTE9SKTsKLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBpdGVtLmdldEltYWdlKCk7Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlKCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGNvbG9ySW1hZ2UoY29sb3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgTm9kZSAxIFRyZWVJdGVtcy4KLQkgKi8KLQl2b2lkIHNldEl0ZW1Gb3JlZ3JvdW5kICgpIHsKLQkJaWYgKCFpbnN0YW5jZS5zdGFydHVwKSB7Ci0JCQl0ZXh0Tm9kZTEuc2V0Rm9yZWdyb3VuZCAoaXRlbUZvcmVncm91bmRDb2xvcik7Ci0JCQlpbWFnZU5vZGUxLnNldEZvcmVncm91bmQgKGl0ZW1Gb3JlZ3JvdW5kQ29sb3IpOwotCQl9Ci0JCS8qIFNldCB0aGUgZm9yZWdyb3VuZCBidXR0b24ncyBjb2xvciB0byBtYXRjaCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgaXRlbS4gKi8KLQkJQ29sb3IgY29sb3IgPSBpdGVtRm9yZWdyb3VuZENvbG9yOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgY29sb3IgPSB0ZXh0Tm9kZTEuZ2V0Rm9yZWdyb3VuZCAoKTsKLQkJVGFibGVJdGVtIGl0ZW0gPSBjb2xvckFuZEZvbnRUYWJsZS5nZXRJdGVtKElURU1fRk9SRUdST1VORF9DT0xPUik7Ci0JCUltYWdlIG9sZEltYWdlID0gaXRlbS5nZXRJbWFnZSgpOwotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSgpOwotCQlpdGVtLnNldEltYWdlIChjb2xvckltYWdlKGNvbG9yKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgb2YgdGhlIE5vZGUgMSBUcmVlSXRlbXMuCi0JICovCi0Jdm9pZCBzZXRJdGVtRm9udCAoKSB7Ci0JCWlmICghaW5zdGFuY2Uuc3RhcnR1cCkgewotCQkJdGV4dE5vZGUxLnNldEZvbnQgKGl0ZW1Gb250KTsKLQkJCWltYWdlTm9kZTEuc2V0Rm9udCAoaXRlbUZvbnQpOwotCQl9Ci0JCS8qIFNldCB0aGUgZm9udCBpdGVtJ3MgaW1hZ2UgdG8gbWF0Y2ggdGhlIGZvbnQgb2YgdGhlIGl0ZW0uICovCi0JCUZvbnQgZnQgPSBpdGVtRm9udDsKLQkJaWYgKGZ0ID09IG51bGwpIGZ0ID0gdGV4dE5vZGUxLmdldEZvbnQgKCk7Ci0JCVRhYmxlSXRlbSBpdGVtID0gY29sb3JBbmRGb250VGFibGUuZ2V0SXRlbShJVEVNX0ZPTlQpOwotCQlJbWFnZSBvbGRJbWFnZSA9IGl0ZW0uZ2V0SW1hZ2UoKTsKLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UoKTsKLQkJaXRlbS5zZXRJbWFnZSAoZm9udEltYWdlKGZ0KSk7Ci0JCWl0ZW0uc2V0Rm9udChmdCk7Ci0JCWNvbG9yQW5kRm9udFRhYmxlLmxheW91dCAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWFkZXIgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgIkV4YW1wbGUiIHdpZGdldHMuCi0JICovCi0Jdm9pZCBzZXRXaWRnZXRIZWFkZXJWaXNpYmxlICgpIHsKLQkJdHJlZTEuc2V0SGVhZGVyVmlzaWJsZSAoaGVhZGVyVmlzaWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpOwotCQl0cmVlMi5zZXRIZWFkZXJWaXNpYmxlIChoZWFkZXJWaXNpYmxlQnV0dG9uLmdldFNlbGVjdGlvbiAoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHNvcnQgaW5kaWNhdG9yIHN0YXRlIG9mIHRoZSAiRXhhbXBsZSIgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIHNldFdpZGdldFNvcnRJbmRpY2F0b3IgKCkgewotCQlpZiAoc29ydEluZGljYXRvckJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCWluaXRpYWxpemVTb3J0U3RhdGUgKHRyZWUxKTsKLQkJCWluaXRpYWxpemVTb3J0U3RhdGUgKHRyZWUyKTsKLQkJfSBlbHNlIHsKLQkJCXJlc2V0U29ydFN0YXRlICh0cmVlMSk7Ci0JCQlyZXNldFNvcnRTdGF0ZSAodHJlZTIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGluaXRpYWwgc29ydCBpbmRpY2F0b3Igc3RhdGUgYW5kIGFkZHMgYSBsaXN0ZW5lcgotCSAqIHRvIGN5Y2xlIHRocm91Z2ggc29ydCBzdGF0ZXMgYW5kIGNvbHVtbnMuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplU29ydFN0YXRlIChmaW5hbCBUcmVlIHRyZWUpIHsKLQkJLyogUmVzZXQgdG8ga25vd24gc3RhdGU6ICdkb3duJyBvbiBjb2x1bW4gMC4gKi8KLQkJdHJlZS5zZXRTb3J0RGlyZWN0aW9uIChTV1QuRE9XTik7Ci0JCVRyZWVDb2x1bW4gW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVDb2x1bW4gY29sdW1uID0gY29sdW1uc1tpXTsKLQkJCWlmIChpID09IDApIHRyZWUuc2V0U29ydENvbHVtbihjb2x1bW4pOwotCQkJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWludCBzb3J0RGlyZWN0aW9uID0gU1dULkRPV047Ci0JCQkJCWlmIChlLndpZGdldCA9PSB0cmVlLmdldFNvcnRDb2x1bW4oKSkgewotCQkJCQkJLyogSWYgdGhlIHNvcnQgY29sdW1uIGhhc24ndCBjaGFuZ2VkLCBjeWNsZSBkb3duIC0+IHVwIC0+IG5vbmUuICovCi0JCQkJCQlzd2l0Y2ggKHRyZWUuZ2V0U29ydERpcmVjdGlvbiAoKSkgewotCQkJCQkJY2FzZSBTV1QuRE9XTjogc29ydERpcmVjdGlvbiA9IFNXVC5VUDsgYnJlYWs7Ci0JCQkJCQljYXNlIFNXVC5VUDogc29ydERpcmVjdGlvbiA9IFNXVC5OT05FOyBicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyZWUuc2V0U29ydENvbHVtbigoVHJlZUNvbHVtbillLndpZGdldCk7Ci0JCQkJCX0KLQkJCQkJdHJlZS5zZXRTb3J0RGlyZWN0aW9uIChzb3J0RGlyZWN0aW9uKTsKLQkJCQl9Ci0JCQl9OwotCQkJY29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWNvbHVtbi5zZXREYXRhKCJTb3J0TGlzdGVuZXIiLCBsaXN0ZW5lcik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXZvaWQgcmVzZXRTb3J0U3RhdGUgKGZpbmFsIFRyZWUgdHJlZSkgewotCQl0cmVlLnNldFNvcnREaXJlY3Rpb24gKFNXVC5OT05FKTsKLQkJVHJlZUNvbHVtbiBbXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSAoU2VsZWN0aW9uTGlzdGVuZXIpY29sdW1uc1tpXS5nZXREYXRhKCJTb3J0TGlzdGVuZXIiKTsJLy8kTk9OLU5MUy0xJAotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIGNvbHVtbnNbaV0ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxpbmVzIHZpc2libGUgc3RhdGUgb2YgdGhlICJFeGFtcGxlIiB3aWRnZXRzLgotCSAqLwotCXZvaWQgc2V0V2lkZ2V0TGluZXNWaXNpYmxlICgpIHsKLQkJdHJlZTEuc2V0TGluZXNWaXNpYmxlIChsaW5lc1Zpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQkJdHJlZTIuc2V0TGluZXNWaXNpYmxlIChsaW5lc1Zpc2libGVCdXR0b24uZ2V0U2VsZWN0aW9uICgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWFsUG9wdXBNZW51SXRlbXMoTWVudSBtZW51LCBFdmVudCBldmVudCkgewotICAgIAlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLSAgICAJaXRlbS5zZXRUZXh0KCJnZXRJdGVtKFBvaW50KSBvbiBtb3VzZSBjb29yZGluYXRlcyIpOwotICAgIAlmaW5hbCBUcmVlIHQgPSAoVHJlZSkgZXZlbnQud2lkZ2V0OwotICAgIAltZW51TW91c2VDb29yZHMgPSB0LnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotICAgIAlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgIAkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgIAkJCWV2ZW50Q29uc29sZS5hcHBlbmQgKCJnZXRJdGVtKFBvaW50KCIgKyBtZW51TW91c2VDb29yZHMgKyAiKSkgcmV0dXJuZWQ6ICIgKyB0LmdldEl0ZW0obWVudU1vdXNlQ29vcmRzKSk7Ci0gICAgCQkJZXZlbnRDb25zb2xlLmFwcGVuZCAoIlxuIik7Ci0gICAgCQl9OwotICAgIAl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9iYWNrZ3JvdW5kSW1hZ2UucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYmFja2dyb3VuZEltYWdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzMmFkOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9iYWNrZ3JvdW5kSW1hZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvYm9sZC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxMzZjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2JvbGRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9ib2xkX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODYzNDI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2JvbGRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9icm93c2VyLWNvbnRlbnQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2Jyb3dzZXItY29udGVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDhiOTNlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2Jyb3dzZXItY29udGVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5TV1QgQnJvd3NlcjwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxoMz5BYm91dCBTV1QgQnJvd3NlcjwvaDM+Ci08cD5Zb3UgYXJlIGxvb2tpbmcgYXQgSFRNTCBjb250ZW50IGluIGEgPGI+QnJvd3NlcjwvYj4gd2lkZ2V0LgotPHVsPgotPGxpPkZvciBhIGRlZmluaXRpb24gb2YgdGhlIEJyb3dzZXIgd2lkZ2V0LCBzZWU6Ci08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9mYXEucGhwI3doYXRpc2Jyb3dzZXIiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2ZhcS5waHAjd2hhdGlzYnJvd3NlcjwvYT48L2xpPgotPGxpPkZvciBhIGxpc3Qgb2YgdGhlIHBsYXRmb3JtcyB0aGF0IEJyb3dzZXIgc3VwcG9ydHMsIHNlZToKLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2ZhcS5waHAjYnJvd3NlcnBsYXRmb3JtcyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvZmFxLnBocCNicm93c2VycGxhdGZvcm1zPC9hPjwvbGk+Ci08bGk+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIFNXVC5NT1pJTExBIEJyb3dzZXIgc3R5bGUsIHNlZToKLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2ZhcS5waHAjaG93dXNlbW96aWxsYSI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvZmFxLnBocCNob3d1c2Vtb3ppbGxhPC9hPjwvbGk+Ci08bGk+Rm9yIG1vcmUgZXhhbXBsZXMgdGhhdCB1c2UgYSBCcm93c2VyIHdpZGdldCwgc2VlIEJyb3dzZXJFeGFtcGxlLCBCcm93c2VyRGVtbywgYW5kIFdlYkJyb3dzZXI6Ci08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9leGFtcGxlcy5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2V4YW1wbGVzLnBocDwvYT48L2xpPgotPC91bD48L3A+Ci0KLTxoMz5BYm91dCBTV1Q8L2gzPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gU1dULCBpbmNsdWRpbmcgdGhlIFdpZGdldCBHYWxsZXJ5LCBTbmlwcGV0cywgRXhhbXBsZXMsIEZBUSwgVG9vbHMsIERvY3VtZW50YXRpb24KLWFuZCBtb3JlLCBjaGVjayBvdXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dDwvYT4uPC9wPgotCi08aDM+RWNsaXBzZSBEb3dubG9hZHMgUGFnZTwvaDM+Ci08cD5UbyBkb3dubG9hZCB0aGUgbGF0ZXN0IEludGVncmF0aW9uIEJ1aWxkIG9mIGVjbGlwc2UsIGdvIHRvOgotPGEgaHJlZj0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvZG93bmxvYWRzLyI+aHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvZG93bmxvYWRzPC9hPi48L3A+Ci0KLTxoMz5CdWcgUmVwb3J0cyBhbmQgRmVhdHVyZSBSZXF1ZXN0czwvaDM+Ci08cD5UbyByZXBvcnQgYW4gU1dUIGJ1ZyBvciByZXF1ZXN0IGFuIFNXVCBmZWF0dXJlLCBnbyB0bzoKLTxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1QbGF0Zm9ybSI+aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3M8L2E+Ci1hbmQgc2VsZWN0IDxiPkNvbXBvbmVudDogU1dUPC9iPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2Nsb3NlZEZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9jbG9zZWRGb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjYwZDBiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2Nsb3NlZEZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWMuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvaXRhbGljLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwNzFmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9pdGFsaWMuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvaXRhbGljX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvaXRhbGljX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWYyMzU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL2l0YWxpY19tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL29wZW5Gb2xkZXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvb3BlbkZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTk0M2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvb3BlbkZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9wYXJlbnRCYWNrZ3JvdW5kSW1hZ2UucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcGFyZW50QmFja2dyb3VuZEltYWdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmNTVjNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9wYXJlbnRCYWNrZ3JvdW5kSW1hZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcmVkLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNTYzZmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvcmVkLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3JlZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1OWMwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9yZWRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9zdHJpa2VvdXQuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyMWIzYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS9zdHJpa2VvdXQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0X21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvc3RyaWtlb3V0X21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI0OGZiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3N0cmlrZW91dF9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3RhcmdldC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS90YXJnZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA3YWU2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3RhcmdldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS91bmRlcmxpbmUuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlMjhlMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS91bmRlcmxpbmUuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUvdW5kZXJsaW5lX21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE1ZDhiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3VuZGVybGluZV9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3llbGxvdy5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3cuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGE5YzFkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xleGFtcGxlL3llbGxvdy5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3dfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9sZXhhbXBsZS95ZWxsb3dfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTljMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbGV4YW1wbGUveWVsbG93X21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZG5kL0ROREV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9ETkRFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWJjOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZG5kL0ROREV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5kbmQ7Ci0KLSAKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBETkRFeGFtcGxlIHsKLQkKLQlwcml2YXRlIGludCBkcmFnT3BlcmF0aW9uID0gMDsKLQlwcml2YXRlIFRyYW5zZmVyW10gZHJhZ1R5cGVzID0gbmV3IFRyYW5zZmVyWzBdOwotCXByaXZhdGUgQ29udHJvbCBkcmFnQ29udHJvbDsKLQlwcml2YXRlIGludCBkcmFnQ29udHJvbFR5cGUgPSAwOwotCXByaXZhdGUgRHJhZ1NvdXJjZSBkcmFnU291cmNlOwotCXByaXZhdGUgU3RyaW5nIGRyYWdEYXRhVGV4dDsKLQlwcml2YXRlIFN0cmluZyBkcmFnRGF0YVJURjsKLQlwcml2YXRlIFN0cmluZyBkcmFnRGF0YUhUTUw7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJhZ0RhdGFVUkw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBkcmFnRGF0YUZpbGVzOwotCXByaXZhdGUgTGlzdCBmaWxlTGlzdDsKLQlwcml2YXRlIGJvb2xlYW4gZHJhZ0VuYWJsZWQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGludCBkcm9wT3BlcmF0aW9uID0gMDsKLQlwcml2YXRlIGludCBkcm9wRmVlZGJhY2sgPSAwOwotCXByaXZhdGUgaW50IGRyb3BEZWZhdWx0T3BlcmF0aW9uID0gMDsKLQlwcml2YXRlIFRyYW5zZmVyW10gZHJvcFR5cGVzID0gbmV3IFRyYW5zZmVyWzBdOwotCXByaXZhdGUgRHJvcFRhcmdldCBkcm9wVGFyZ2V0OwotCXByaXZhdGUgQ29udHJvbCBkcm9wQ29udHJvbDsKLQlwcml2YXRlIGludCBkcm9wQ29udHJvbFR5cGUgPSAwOwotCXByaXZhdGUgQ29tcG9zaXRlIGRlZmF1bHRQYXJlbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRyb3BFbmFibGVkID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBUZXh0IGRyYWdDb25zb2xlOwotCXByaXZhdGUgYm9vbGVhbiBkcmFnRXZlbnREZXRhaWwgPSBmYWxzZTsKLQlwcml2YXRlIFRleHQgZHJvcENvbnNvbGU7Ci0JcHJpdmF0ZSBib29sZWFuIGRyb3BFdmVudERldGFpbCA9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fVE9HR0xFID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX1JBRElPID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0NIRUNLID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FOVkFTID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUwgPSA0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVNUID0gNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEUgPSA2OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkVFID0gNzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVCA9IDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUWUxFRF9URVhUID0gOTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NQk8gPSAxMDsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUROREV4YW1wbGUgZXhhbXBsZSA9IG5ldyBETkRFeGFtcGxlKCk7Ci0JZXhhbXBsZS5vcGVuKGRpc3BsYXkpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wcml2YXRlIHZvaWQgYWRkRHJhZ1RyYW5zZmVyKFRyYW5zZmVyIHRyYW5zZmVyKXsKLQlUcmFuc2ZlcltdIG5ld1R5cGVzID0gbmV3IFRyYW5zZmVyW2RyYWdUeXBlcy5sZW5ndGggKyAxXTsKLQlTeXN0ZW0uYXJyYXljb3B5KGRyYWdUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGRyYWdUeXBlcy5sZW5ndGgpOwotCW5ld1R5cGVzW2RyYWdUeXBlcy5sZW5ndGhdID0gdHJhbnNmZXI7Ci0JZHJhZ1R5cGVzID0gbmV3VHlwZXM7Ci0JaWYgKGRyYWdTb3VyY2UgIT0gbnVsbCkgewotCQlkcmFnU291cmNlLnNldFRyYW5zZmVyKGRyYWdUeXBlcyk7Ci0JfQotfQotCi1wcml2YXRlIHZvaWQgYWRkRHJvcFRyYW5zZmVyKFRyYW5zZmVyIHRyYW5zZmVyKXsKLQlUcmFuc2ZlcltdIG5ld1R5cGVzID0gbmV3IFRyYW5zZmVyW2Ryb3BUeXBlcy5sZW5ndGggKyAxXTsKLQlTeXN0ZW0uYXJyYXljb3B5KGRyb3BUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGRyb3BUeXBlcy5sZW5ndGgpOwotCW5ld1R5cGVzW2Ryb3BUeXBlcy5sZW5ndGhdID0gdHJhbnNmZXI7Ci0JZHJvcFR5cGVzID0gbmV3VHlwZXM7Ci0JaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCkgewotCQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKGRyb3BUeXBlcyk7Ci0JfQotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJhZ09wZXJhdGlvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBCdXR0b24gbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCW1vdmVCdXR0b24uc2V0VGV4dCgiRE5ELkRST1BfTU9WRSIpOwotCW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiB8PSBETkQuRFJPUF9NT1ZFOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcmFnT3BlcmF0aW9uID0gZHJhZ09wZXJhdGlvbiAmfkRORC5EUk9QX01PVkU7Ci0JCQkJaWYgKGRyYWdPcGVyYXRpb24gPT0gMCkgewotCQkJCQlkcmFnT3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRTsKLQkJCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyYWdFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0KLQlCdXR0b24gY29weUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWNvcHlCdXR0b24uc2V0VGV4dCgiRE5ELkRST1BfQ09QWSIpOwotCWNvcHlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiB8PSBETkQuRFJPUF9DT1BZOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcmFnT3BlcmF0aW9uID0gZHJhZ09wZXJhdGlvbiAmfkRORC5EUk9QX0NPUFk7Ci0JCQkJaWYgKGRyYWdPcGVyYXRpb24gPT0gMCkgewotCQkJCQlkcmFnT3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRTsKLQkJCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyYWdFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlCdXR0b24gbGlua0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWxpbmtCdXR0b24uc2V0VGV4dCgiRE5ELkRST1BfTElOSyIpOwotCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJhZ09wZXJhdGlvbiB8PSBETkQuRFJPUF9MSU5LOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcmFnT3BlcmF0aW9uID0gZHJhZ09wZXJhdGlvbiAmfkRORC5EUk9QX0xJTks7Ci0JCQkJaWYgKGRyYWdPcGVyYXRpb24gPT0gMCkgewotCQkJCQlkcmFnT3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRTsKLQkJCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRyYWdFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy9pbml0aWFsaXplIHN0YXRlCi0JbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JY29weUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JbGlua0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JZHJhZ09wZXJhdGlvbiB8PSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcmFnU291cmNlKCkgewotCWlmIChkcmFnU291cmNlICE9IG51bGwpIGRyYWdTb3VyY2UuZGlzcG9zZSgpOwotCWRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShkcmFnQ29udHJvbCwgZHJhZ09wZXJhdGlvbik7Ci0JZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihkcmFnVHlwZXMpOwotCWRyYWdTb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZHJhZ0NvbnNvbGUuYXBwZW5kKCI+PmRyYWdGaW5pc2hlZFxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJCWRyYWdEYXRhVGV4dCA9IGRyYWdEYXRhUlRGID0gZHJhZ0RhdGFIVE1MID0gZHJhZ0RhdGFVUkwgPSBudWxsOwotCQkJZHJhZ0RhdGFGaWxlcyA9IG51bGw7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpIHsKLQkJCQlzd2l0Y2goZHJhZ0NvbnRyb2xUeXBlKSB7Ci0JCQkJCWNhc2UgQlVUVE9OX0NIRUNLOgotCQkJCQljYXNlIEJVVFRPTl9UT0dHTEU6Ci0JCQkJCWNhc2UgQlVUVE9OX1JBRElPOiB7Ci0JCQkJCQlCdXR0b24gYiA9IChCdXR0b24pZHJhZ0NvbnRyb2w7Ci0JCQkJCQliLnNldFRleHQoIiIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBTVFlMRURfVEVYVDogewotCQkJCQkJU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpZHJhZ0NvbnRyb2w7Ci0JCQkJCQl0ZXh0Lmluc2VydCgiIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIFRBQkxFOiB7Ci0JCQkJCQlUYWJsZSB0YWJsZSA9IChUYWJsZSlkcmFnQ29udHJvbDsKLQkJCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaXRlbXNbaV0uZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBURVhUOiB7Ci0JCQkJCQlUZXh0IHRleHQgPSAoVGV4dClkcmFnQ29udHJvbDsKLQkJCQkJCXRleHQuaW5zZXJ0KCIiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgVFJFRTogewotCQkJCQkJVHJlZSB0cmVlID0gKFRyZWUpZHJhZ0NvbnRyb2w7Ci0JCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENBTlZBUzogewotCQkJCQkJZHJhZ0NvbnRyb2wuc2V0RGF0YSgiU1RSSU5HUyIsIG51bGwpOwotCQkJCQkJZHJhZ0NvbnRyb2wucmVkcmF3KCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIExBQkVMOiB7Ci0JCQkJCQlMYWJlbCBsYWJlbCA9IChMYWJlbClkcmFnQ29udHJvbDsKLQkJCQkJCWxhYmVsLnNldFRleHQoIiIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBMSVNUOiB7Ci0JCQkJCQlMaXN0IGxpc3QgPSAoTGlzdClkcmFnQ29udHJvbDsKLQkJCQkJCWludFtdIGluZGljZXMgPSBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQkJCQkJCWxpc3QucmVtb3ZlKGluZGljZXMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBDT01CTzp7Ci0JCQkJCQlDb21ibyBjb21ibyA9IChDb21ibylkcmFnQ29udHJvbDsKLQkJCQkJCWNvbWJvLnNldFRleHQoIiIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEob3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWRyYWdDb25zb2xlLmFwcGVuZCgiPj5kcmFnU2V0RGF0YVxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGRyYWdEYXRhVGV4dDsKLQkJCX0KLQkJCWlmIChSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCQlldmVudC5kYXRhID0gZHJhZ0RhdGFSVEY7Ci0JCQl9Ci0JCQlpZiAoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCWV2ZW50LmRhdGEgPSBkcmFnRGF0YUhUTUw7Ci0JCQl9Ci0JCQlpZiAoVVJMVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGRyYWdEYXRhVVJMOwotCQkJfQotCQkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCQlldmVudC5kYXRhID0gZHJhZ0RhdGFGaWxlczsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQob3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWRyYWdDb25zb2xlLmFwcGVuZCgiPj5kcmFnU3RhcnRcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlkcmFnRGF0YUZpbGVzID0gZmlsZUxpc3QuZ2V0SXRlbXMoKTsKLQkJCXN3aXRjaChkcmFnQ29udHJvbFR5cGUpIHsKLQkJCQljYXNlIEJVVFRPTl9DSEVDSzoKLQkJCQljYXNlIEJVVFRPTl9UT0dHTEU6Ci0JCQkJY2FzZSBCVVRUT05fUkFESU86IHsKLQkJCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWRyYWdDb250cm9sOwotCQkJCQlkcmFnRGF0YVRleHQgPSBiLmdldFNlbGVjdGlvbigpID8gInRydWUiIDogImZhbHNlIjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1RZTEVEX1RFWFQ6IHsKLQkJCQkJU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpZHJhZ0NvbnRyb2w7Ci0JCQkJCVN0cmluZyBzID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRyYWdEYXRhVGV4dCA9IHM7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgVEFCTEU6IHsKLQkJCQkJVGFibGUgdGFibGUgPSAoVGFibGUpZHJhZ0NvbnRyb2w7Ci0JCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgewotCQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKGl0ZW1zW2ldLmdldFRleHQoKSk7Ci0JCQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDEgJiYgaSA8IGl0ZW1zLmxlbmd0aCAtIDEpIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBURVhUOiB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KWRyYWdDb250cm9sOwotCQkJCQlTdHJpbmcgcyA9IHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkcmFnRGF0YVRleHQgPSBzOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFRSRUU6IHsKLQkJCQkJVHJlZSB0cmVlID0gKFRyZWUpZHJhZ0NvbnRyb2w7Ci0JCQkJCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChpdGVtc1tpXS5nZXRUZXh0KCkpOwotCQkJCQkJCWlmIChpdGVtcy5sZW5ndGggPiAxICYmIGkgPCBpdGVtcy5sZW5ndGggLSAxKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZHJhZ0RhdGFUZXh0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ0FOVkFTOiB7Ci0JCQkJCVN0cmluZ1tdIHN0cmluZ3MgPSAoU3RyaW5nW10pZHJhZ0NvbnRyb2wuZ2V0RGF0YSgiU1RSSU5HUyIpOwotCQkJCQlpZiAoc3RyaW5ncyA9PSBudWxsIHx8IHN0cmluZ3MubGVuZ3RoID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHN0cmluZ3NbaV0pOwotCQkJCQkJCWlmIChzdHJpbmdzLmxlbmd0aCA+IDEgJiYgaSA8IHN0cmluZ3MubGVuZ3RoIC0gMSkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWRyYWdEYXRhVGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIExBQkVMOiB7Ci0JCQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWRyYWdDb250cm9sOwotCQkJCQlTdHJpbmcgc3RyaW5nID0gbGFiZWwuZ2V0VGV4dCgpOwotCQkJCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRyYWdEYXRhVGV4dCA9IHN0cmluZzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBMSVNUOiB7Ci0JCQkJCUxpc3QgbGlzdCA9IChMaXN0KWRyYWdDb250cm9sOwotCQkJCQlTdHJpbmdbXSBzZWxlY3Rpb24gPSBsaXN0LmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHNlbGVjdGlvbltpXSk7Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPiAxICYmIGkgPCBzZWxlY3Rpb24ubGVuZ3RoIC0gMSkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWRyYWdEYXRhVGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENPTUJPOiB7Ci0JCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBkcmFnQ29udHJvbDsKLQkJCQkJU3RyaW5nIHN0cmluZyA9IGNvbWJvLmdldFRleHQoKTsKLQkJCQkJUG9pbnQgc2VsZWN0aW9uID0gY29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24ueCA9PSBzZWxlY3Rpb24ueSkgewotCQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHJhZ0RhdGFUZXh0ID0gc3RyaW5nLnN1YnN0cmluZyhzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgU1dURXJyb3IoU1dULkVSUk9SX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQl9Ci0JCQlpZiAoZHJhZ0RhdGFUZXh0ICE9IG51bGwpIHsKLQkJCQlkcmFnRGF0YVJURiA9ICJ7XFxydGYxe1xcY29sb3J0Ymw7XFxyZWQyNTVcXGdyZWVuMFxcYmx1ZTA7fVxcY2YxXFxiICIrZHJhZ0RhdGFUZXh0KyJ9IjsKLQkJCQlkcmFnRGF0YUhUTUwgPSAiPGI+IitkcmFnRGF0YVRleHQrIjwvYj4iOwotCQkJCWRyYWdEYXRhVVJMID0gImh0dHA6Ly8iICsgZHJhZ0RhdGFUZXh0LnJlcGxhY2UoJyAnLCAnLicpOwotCQkJCXRyeSB7Ci0JCQkJCW5ldyBVUkwoZHJhZ0RhdGFVUkwpOwotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWRyYWdEYXRhVVJMID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZHJhZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGRyYWdUeXBlc1tpXSBpbnN0YW5jZW9mIFRleHRUcmFuc2ZlciAmJiBkcmFnRGF0YVRleHQgPT0gbnVsbCkgewotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChkcmFnVHlwZXNbaV0gaW5zdGFuY2VvZiBSVEZUcmFuc2ZlciAmJiBkcmFnRGF0YVJURiA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGRyYWdUeXBlc1tpXSBpbnN0YW5jZW9mIEhUTUxUcmFuc2ZlciAmJiBkcmFnRGF0YUhUTUwgPT0gbnVsbCkgewotCQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChkcmFnVHlwZXNbaV0gaW5zdGFuY2VvZiBVUkxUcmFuc2ZlciAmJiBkcmFnRGF0YVVSTCA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGRyYWdUeXBlc1tpXSBpbnN0YW5jZW9mIEZpbGVUcmFuc2ZlciAmJiAoZHJhZ0RhdGFGaWxlcyA9PSBudWxsIHx8IGRyYWdEYXRhRmlsZXMubGVuZ3RoID09IDApKSB7Ci0JCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyYWdUeXBlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlCdXR0b24gdGV4dEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCXRleHRCdXR0b24uc2V0VGV4dCgiVGV4dCBUcmFuc2ZlciIpOwotCXRleHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJhZ1RyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJhZ1RyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJSVEYgVHJhbnNmZXIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyYWdUcmFuc2ZlcihSVEZUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJhZ1RyYW5zZmVyKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiSFRNTCBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJhZ1RyYW5zZmVyKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcmVtb3ZlRHJhZ1RyYW5zZmVyKEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIlVSTCBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJhZ1RyYW5zZmVyKFVSTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcmFnVHJhbnNmZXIoVVJMVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGaWxlIFRyYW5zZmVyIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyYWdUcmFuc2ZlcihGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyYWdUcmFuc2ZlcihGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlNlbGVjdCBGaWxlKHMpIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGZpbGVMaXN0LmdldFNoZWxsKCksIFNXVC5PUEVOIHwgU1dULk1VTFRJKTsKLQkJCVN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApewotCQkJCWZpbGVMaXN0LnJlbW92ZUFsbCgpOwotCQkJCVN0cmluZyBzZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JCQkJU3RyaW5nIHBhdGggPSBkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpOwotCQkJCVN0cmluZ1tdIG5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZmlsZUxpc3QuYWRkKHBhdGgrc2VwYXJhdG9yK25hbWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlmaWxlTGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCWZpbGVMaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSBzdGF0ZQotCXRleHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFkZERyYWdUcmFuc2ZlcihUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVEcmFnV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JY29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsiVG9nZ2xlIEJ1dHRvbiIsICJSYWRpbyBCdXR0b24iLCAiQ2hlY2tib3giLCAiQ2FudmFzIiwgIkxhYmVsIiwgIkxpc3QiLCAiVGFibGUiLCAiVHJlZSIsICJUZXh0IiwgIlN0eWxlZFRleHQiLCAiQ29tYm8ifSk7Ci0JY29tYm8uc2VsZWN0KExBQkVMKTsKLQlkcmFnQ29udHJvbFR5cGUgPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCWRyYWdDb250cm9sID0gY3JlYXRlV2lkZ2V0KGRyYWdDb250cm9sVHlwZSwgcGFyZW50LCAiRHJhZyBTb3VyY2UiKTsKLQkKLQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJT2JqZWN0IGRhdGEgPSBkcmFnQ29udHJvbC5nZXRMYXlvdXREYXRhKCk7Ci0JCQlDb21wb3NpdGUgcGFyZW50ID0gZHJhZ0NvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCQlkcmFnQ29udHJvbC5kaXNwb3NlKCk7Ci0JCQlDb21ibyBjID0gKENvbWJvKWUud2lkZ2V0OyAKLQkJCWRyYWdDb250cm9sVHlwZSA9IGMuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCWRyYWdDb250cm9sID0gY3JlYXRlV2lkZ2V0KGRyYWdDb250cm9sVHlwZSwgcGFyZW50LCAiRHJhZyBTb3VyY2UiKTsKLQkJCWRyYWdDb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlpZiAoZHJhZ0VuYWJsZWQpIGNyZWF0ZURyYWdTb3VyY2UoKTsKLQkJCXBhcmVudC5sYXlvdXQoKTsKLQkJfQotCX0pOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJEcmFnU291cmNlIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJZHJhZ0VuYWJsZWQgPSBiLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGRyYWdFbmFibGVkKSB7Ci0JCQkJY3JlYXRlRHJhZ1NvdXJjZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZHJhZ1NvdXJjZSAhPSBudWxsKXsKLQkJCQkJZHJhZ1NvdXJjZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWRyYWdTb3VyY2UgPSBudWxsOwotCQkJfQotCQl9Ci0JfSk7Ci0JYi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JZHJhZ0VuYWJsZWQgPSB0cnVlOwotCQotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sIC0xMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkcmFnQ29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAxMCk7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlRHJvcE9wZXJhdGlvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBCdXR0b24gbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCW1vdmVCdXR0b24uc2V0VGV4dCgiRE5ELkRST1BfTU9WRSIpOwotCW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiB8PSBETkQuRFJPUF9NT1ZFOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wT3BlcmF0aW9uID0gZHJvcE9wZXJhdGlvbiAmIH5ETkQuRFJPUF9NT1ZFOwotCQkJCWlmIChkcm9wT3BlcmF0aW9uID09IDAgfHwgKGRyb3BEZWZhdWx0T3BlcmF0aW9uICYgRE5ELkRST1BfTU9WRSkgIT0gMCkgewotCQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX01PVkU7Ci0JCQkJCW1vdmVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCi0JZmluYWwgQnV0dG9uIGNvcHlCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQljb3B5QnV0dG9uLnNldFRleHQoIkRORC5EUk9QX0NPUFkiKTsKLQljb3B5QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfQ09QWTsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiA9IGRyb3BPcGVyYXRpb24gJiB+RE5ELkRST1BfQ09QWTsKLQkJCQlpZiAoZHJvcE9wZXJhdGlvbiA9PSAwIHx8IChkcm9wRGVmYXVsdE9wZXJhdGlvbiAmIERORC5EUk9QX0NPUFkpICE9IDApIHsKLQkJCQkJZHJvcE9wZXJhdGlvbiA9IERORC5EUk9QX0NPUFk7Ci0JCQkJCWNvcHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCX0KLQkJfQotCX0pOwotCi0JZmluYWwgQnV0dG9uIGxpbmtCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQlsaW5rQnV0dG9uLnNldFRleHQoIkRORC5EUk9QX0xJTksiKTsKLQlsaW5rQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfTElOSzsJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJZHJvcE9wZXJhdGlvbiA9IGRyb3BPcGVyYXRpb24gJiB+RE5ELkRST1BfTElOSzsKLQkJCQlpZiAoZHJvcE9wZXJhdGlvbiA9PSAwIHx8IChkcm9wRGVmYXVsdE9wZXJhdGlvbiAmIERORC5EUk9QX0xJTkspICE9IDApIHsKLQkJCQkJZHJvcE9wZXJhdGlvbiA9IERORC5EUk9QX0xJTks7Ci0JCQkJCWxpbmtCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcm9wRW5hYmxlZCkgewotCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJETkQuRFJPUF9ERUZBVUxUIik7Ci0JZGVmYXVsdFBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX0RFRkFVTFQ7Ci0JCQkJZGVmYXVsdFBhcmVudC5zZXRWaXNpYmxlKHRydWUpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wT3BlcmF0aW9uID0gZHJvcE9wZXJhdGlvbiAmIH5ETkQuRFJPUF9ERUZBVUxUOwotCQkJCWRlZmF1bHRQYXJlbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlkZWZhdWx0UGFyZW50LnNldFZpc2libGUoZmFsc2UpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSAyMDsKLQlkZWZhdWx0UGFyZW50LnNldExheW91dChsYXlvdXQpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRlZmF1bHRQYXJlbnQsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJWYWx1ZSBmb3IgZGVmYXVsdCBvcGVyYXRpb24gaXM6Iik7Ci0JYiA9IG5ldyBCdXR0b24oZGVmYXVsdFBhcmVudCwgU1dULlJBRElPKTsKLQliLnNldFRleHQoIkRORC5EUk9QX01PVkUiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BEZWZhdWx0T3BlcmF0aW9uID0gRE5ELkRST1BfTU9WRTsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX01PVkU7Ci0JCQkJbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihkZWZhdWx0UGFyZW50LCBTV1QuUkFESU8pOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfQ09QWSIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcERlZmF1bHRPcGVyYXRpb24gPSBETkQuRFJPUF9DT1BZOwotCQkJCWRyb3BPcGVyYXRpb24gfD0gRE5ELkRST1BfQ09QWTsKLQkJCQljb3B5QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQkJY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCi0JYiA9IG5ldyBCdXR0b24oZGVmYXVsdFBhcmVudCwgU1dULlJBRElPKTsKLQliLnNldFRleHQoIkRORC5EUk9QX0xJTksiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BEZWZhdWx0T3BlcmF0aW9uID0gRE5ELkRST1BfTElOSzsKLQkJCQlkcm9wT3BlcmF0aW9uIHw9IERORC5EUk9QX0xJTks7Ci0JCQkJbGlua0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihkZWZhdWx0UGFyZW50LCBTV1QuUkFESU8pOwotCWIuc2V0VGV4dCgiRE5ELkRST1BfTk9ORSIpOwotCWIuc2V0U2VsZWN0aW9uKHRydWUpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZHJvcERlZmF1bHRPcGVyYXRpb24gPSBETkQuRFJPUF9OT05FOwotCQkJCWRyb3BPcGVyYXRpb24gJj0gfkRORC5EUk9QX0RFRkFVTFQ7Ci0JCQkJaWYgKGRyb3BFbmFibGVkKSB7Ci0JCQkJCWNyZWF0ZURyb3BUYXJnZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkvLyBpbml0aWFsaXplIHN0YXRlCi0JbW92ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JY29weUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JbGlua0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JZHJvcE9wZXJhdGlvbiA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyb3BUYXJnZXQoKSB7Ci0JaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCkgZHJvcFRhcmdldC5kaXNwb3NlKCk7Ci0JZHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGRyb3BDb250cm9sLCBkcm9wT3BlcmF0aW9uKTsKLQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKGRyb3BUeXBlcyk7Ci0JZHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyYWdFbnRlclxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWV2ZW50LmRldGFpbCA9IGRyb3BEZWZhdWx0T3BlcmF0aW9uOwotCQkJfQotCQkJZXZlbnQuZmVlZGJhY2sgPSBkcm9wRmVlZGJhY2s7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyYWdMZWF2ZVxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWRyb3BDb25zb2xlLmFwcGVuZCgiPj5kcmFnT3BlcmF0aW9uQ2hhbmdlZFxuIik7Ci0JCQlwcmludEV2ZW50KGV2ZW50KTsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWV2ZW50LmRldGFpbCA9IGRyb3BEZWZhdWx0T3BlcmF0aW9uOwotCQkJfQotCQkJZXZlbnQuZmVlZGJhY2sgPSBkcm9wRmVlZGJhY2s7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlkcm9wQ29uc29sZS5hcHBlbmQoIj4+ZHJhZ092ZXJcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlldmVudC5mZWVkYmFjayA9IGRyb3BGZWVkYmFjazsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyb3BcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCQlTdHJpbmdbXSBzdHJpbmdzID0gbnVsbDsKLQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSB8fAotCQkJICAgIFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkgfHwKLQkJCSAgICBIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSB8fAotCQkJICAgIFVSTFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCSAgICBzdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsoU3RyaW5nKWV2ZW50LmRhdGF9OwotCQkJfQotCQkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkJc3RyaW5ncyA9IChTdHJpbmdbXSlldmVudC5kYXRhOwotCQkJfQotCQkJaWYgKHN0cmluZ3MgPT0gbnVsbCB8fCBzdHJpbmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJZHJvcENvbnNvbGUuYXBwZW5kKCIhIUludmFsaWQgZGF0YSBkcm9wcGVkIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAoc3RyaW5ncy5sZW5ndGggPT0gMSAmJiAoZHJvcENvbnRyb2xUeXBlID09IFRBQkxFIHx8IAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BDb250cm9sVHlwZSA9PSBUUkVFIHx8IAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BDb250cm9sVHlwZSA9PSBMSVNUKSkgewotCQkJCS8vIGNvbnZlcnQgc3RyaW5nIHNlcGFyYXRlZCBieSAiXG4iIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncyAKLQkJCQlTdHJpbmcgc3RyaW5nID0gc3RyaW5nc1swXTsKLQkJCQlpbnQgY291bnQgPSAwOwotCQkJCWludCBvZmZzZXQgPSBzdHJpbmcuaW5kZXhPZigiXG4iLCAwKTsKLQkJCQl3aGlsZSAob2Zmc2V0ID4gMCkgewotCQkJCQljb3VudCsrOwotCQkJCQlvZmZzZXQgPSBzdHJpbmcuaW5kZXhPZigiXG4iLCBvZmZzZXQgKyAxKTsKLQkJCQl9Ci0JCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCQlzdHJpbmdzID0gbmV3IFN0cmluZ1tjb3VudCArIDFdOwotCQkJCQlpbnQgc3RhcnQgPSAwOwotCQkJCQlpbnQgZW5kID0gc3RyaW5nLmluZGV4T2YoIlxuIik7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCXdoaWxlIChzdGFydCA8IGVuZCkgewotCQkJCQkJc3RyaW5nc1tpbmRleCsrXSA9IHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JCQkJCQlzdGFydCA9IGVuZCArIDE7Ci0JCQkJCQllbmQgPSBzdHJpbmcuaW5kZXhPZigiXG4iLCBzdGFydCk7Ci0JCQkJCQlpZiAoZW5kID09IC0xKSBlbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzd2l0Y2goZHJvcENvbnRyb2xUeXBlKSB7Ci0JCQkJY2FzZSBCVVRUT05fQ0hFQ0s6Ci0JCQkJY2FzZSBCVVRUT05fVE9HR0xFOgotCQkJCWNhc2UgQlVUVE9OX1JBRElPOiB7Ci0JCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbilkcm9wQ29udHJvbDsKLQkJCQkJYi5zZXRUZXh0KHN0cmluZ3NbMF0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTVFlMRURfVEVYVDogewotCQkJCQlTdHlsZWRUZXh0IHRleHQgPSAoU3R5bGVkVGV4dClkcm9wQ29udHJvbDsKLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXRleHQuaW5zZXJ0KHN0cmluZ3NbaV0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFRBQkxFOiB7Ci0JCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKWRyb3BDb250cm9sOwotCQkJCQlQb2ludCBwID0gZXZlbnQuZGlzcGxheS5tYXAobnVsbCwgdGFibGUsIGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlUYWJsZUl0ZW0gZHJvcEl0ZW0gPSB0YWJsZS5nZXRJdGVtKHApOwotCQkJCQlpbnQgaW5kZXggPSBkcm9wSXRlbSA9PSBudWxsID8gdGFibGUuZ2V0SXRlbUNvdW50KCkgOiB0YWJsZS5pbmRleE9mKGRyb3BJdGVtKTsKLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUsIGluZGV4KTsKLQkJCQkJCWl0ZW0uc2V0VGV4dCgwLCBzdHJpbmdzW2ldKTsKLQkJCQkJCWl0ZW0uc2V0VGV4dCgxLCAiZHJvcHBlZCBpdGVtIik7Ci0JCQkJCX0KLQkJCQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWNvbHVtbnNbaV0ucGFjaygpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFRFWFQ6IHsKLQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpZHJvcENvbnRyb2w7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQl0ZXh0LmFwcGVuZChzdHJpbmdzW2ldKyJcbiIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFRSRUU6IHsKLQkJCQkJVHJlZSB0cmVlID0gKFRyZWUpZHJvcENvbnRyb2w7Ci0JCQkJCVBvaW50IHAgPSBldmVudC5kaXNwbGF5Lm1hcChudWxsLCB0cmVlLCBldmVudC54LCBldmVudC55KTsKLQkJCQkJVHJlZUl0ZW0gcGFyZW50SXRlbSA9IHRyZWUuZ2V0SXRlbShwKTsKLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCVRyZWVJdGVtIGl0ZW0gPSBwYXJlbnRJdGVtICE9IG51bGwgPyBuZXcgVHJlZUl0ZW0ocGFyZW50SXRlbSwgU1dULk5PTkUpIDogbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChzdHJpbmdzW2ldKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBDQU5WQVM6IHsKLQkJCQkJZHJvcENvbnRyb2wuc2V0RGF0YSgiU1RSSU5HUyIsIHN0cmluZ3MpOwotCQkJCQlkcm9wQ29udHJvbC5yZWRyYXcoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTEFCRUw6IHsKLQkJCQkJTGFiZWwgbGFiZWwgPSAoTGFiZWwpZHJvcENvbnRyb2w7Ci0JCQkJCWxhYmVsLnNldFRleHQoc3RyaW5nc1swXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIExJU1Q6IHsKLQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpZHJvcENvbnRyb2w7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlsaXN0LmFkZChzdHJpbmdzW2ldKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBDT01CTzogewotCQkJCQlDb21ibyBjb21ibyA9IChDb21ibylkcm9wQ29udHJvbDsKLQkJCQkJY29tYm8uc2V0VGV4dChzdHJpbmdzWzBdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBTV1RFcnJvcihTV1QuRVJST1JfTk9UX0lNUExFTUVOVEVEKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZHJvcENvbnNvbGUuYXBwZW5kKCI+PmRyb3BBY2NlcHRcbiIpOwotCQkJcHJpbnRFdmVudChldmVudCk7Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUZlZWRiYWNrVHlwZXMoR3JvdXAgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19TRUxFQ1QiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfU0VMRUNUOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19TQ1JPTEwiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfU0NST0xMOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19JTlNFUlRfQkVGT1JFIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlkcm9wRmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7CQkJCi0JCQl9IGVsc2UgewotCQkJCWRyb3BGZWVkYmFjayAmPSB+RE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19JTlNFUlRfQUZURVIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJGRUVEQkFDS19FWFBBTkQiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWRyb3BGZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfRVhQQU5EOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlkcm9wRmVlZGJhY2sgJj0gfkRORC5GRUVEQkFDS19FWFBBTkQ7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyb3BUeXBlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCUJ1dHRvbiB0ZXh0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JdGV4dEJ1dHRvbi5zZXRUZXh0KCJUZXh0IFRyYW5zZmVyIik7Ci0JdGV4dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIlJURiBUcmFuc2ZlciIpOwotCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLndpZGdldDsKLQkJCWlmIChiLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJYWRkRHJvcFRyYW5zZmVyKFJURlRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkKLQliID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJIVE1MIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVEcm9wVHJhbnNmZXIoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JYiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWIuc2V0VGV4dCgiVVJMIFRyYW5zZmVyIik7Ci0JYi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUud2lkZ2V0OwotCQkJaWYgKGIuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlhZGREcm9wVHJhbnNmZXIoVVJMVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyb3BUcmFuc2ZlcihVUkxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCWIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkZpbGUgVHJhbnNmZXIiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlpZiAoYi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWFkZERyb3BUcmFuc2ZlcihGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7CQkJCi0JCQl9IGVsc2UgewotCQkJCXJlbW92ZURyb3BUcmFuc2ZlcihGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkvLyBpbml0aWFsaXplIHN0YXRlCi0JdGV4dEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYWRkRHJvcFRyYW5zZmVyKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZURyb3BXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCXBhcmVudC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQljb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyJUb2dnbGUgQnV0dG9uIiwgIlJhZGlvIEJ1dHRvbiIsICJDaGVja2JveCIsICJDYW52YXMiLCAiTGFiZWwiLCAiTGlzdCIsICJUYWJsZSIsICJUcmVlIiwgIlRleHQiLCAiU3R5bGVkVGV4dCIsICJDb21ibyJ9KTsKLQljb21iby5zZWxlY3QoTEFCRUwpOwotCWRyb3BDb250cm9sVHlwZSA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JZHJvcENvbnRyb2wgPSBjcmVhdGVXaWRnZXQoZHJvcENvbnRyb2xUeXBlLCBwYXJlbnQsICJEcm9wIFRhcmdldCIpOwotCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlPYmplY3QgZGF0YSA9IGRyb3BDb250cm9sLmdldExheW91dERhdGEoKTsKLQkJCUNvbXBvc2l0ZSBwYXJlbnQgPSBkcm9wQ29udHJvbC5nZXRQYXJlbnQoKTsKLQkJCWRyb3BDb250cm9sLmRpc3Bvc2UoKTsKLQkJCUNvbWJvIGMgPSAoQ29tYm8pZS53aWRnZXQ7Ci0JCQlkcm9wQ29udHJvbFR5cGUgPSBjLmdldFNlbGVjdGlvbkluZGV4KCk7IAotCQkJZHJvcENvbnRyb2wgPSBjcmVhdGVXaWRnZXQoZHJvcENvbnRyb2xUeXBlLCBwYXJlbnQsICJEcm9wIFRhcmdldCIpOwotCQkJZHJvcENvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWlmIChkcm9wRW5hYmxlZCkgY3JlYXRlRHJvcFRhcmdldCgpOwotCQkJcGFyZW50LmxheW91dCgpOwotCQl9Ci0JfSk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQliLnNldFRleHQoIkRyb3BUYXJnZXQiKTsKLQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pZS53aWRnZXQ7Ci0JCQlkcm9wRW5hYmxlZCA9IGIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoZHJvcEVuYWJsZWQpIHsKLQkJCQljcmVhdGVEcm9wVGFyZ2V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpewotCQkJCQlkcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJZHJvcFRhcmdldCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkvLyBpbml0aWFsaXplIHN0YXRlCi0JYi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JZHJvcEVuYWJsZWQgPSB0cnVlOwotCQotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tYm8sIC0xMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkcm9wQ29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvLCAxMCk7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotfQotCi1wcml2YXRlIENvbnRyb2wgY3JlYXRlV2lkZ2V0KGludCB0eXBlLCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgcHJlZml4KXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBCVVRUT05fQ0hFQ0s6IHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJCWJ1dHRvbi5zZXRUZXh0KHByZWZpeCsiIENoZWNrIGJveCIpOwotCQkJcmV0dXJuIGJ1dHRvbjsKLQkJfQotCQljYXNlIEJVVFRPTl9UT0dHTEU6IHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlRPR0dMRSk7Ci0JCQlidXR0b24uc2V0VGV4dChwcmVmaXgrIiBUb2dnbGUgYnV0dG9uIik7Ci0JCQlyZXR1cm4gYnV0dG9uOwotCQl9Ci0JCWNhc2UgQlVUVE9OX1JBRElPOiB7Ci0JCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0JCQlidXR0b24uc2V0VGV4dChwcmVmaXgrIiBSYWRpbyBidXR0b24iKTsKLQkJCXJldHVybiBidXR0b247Ci0JCX0KLQkJY2FzZSBTVFlMRURfVEVYVDogewotCQkJU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCXRleHQuc2V0VGV4dChwcmVmaXgrIiBTdHlsZWQgVGV4dCIpOwotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJY2FzZSBUQUJMRTogewotCQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCQljb2x1bW4wLnNldFRleHQoIk5hbWUiKTsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5SSUdIVCk7Ci0JCQljb2x1bW4xLnNldFRleHQoIlZhbHVlIik7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJCWNvbHVtbjIuc2V0VGV4dCgiRGVzY3JpcHRpb24iKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dCgwLCBwcmVmaXgrIiBuYW1lICIraSk7Ci0JCQkJaXRlbS5zZXRUZXh0KDEsIHByZWZpeCsiIHZhbHVlICIraSk7Ci0JCQkJaXRlbS5zZXRUZXh0KDIsIHByZWZpeCsiIGRlc2NyaXB0aW9uICIraSk7Ci0JCQl9Ci0JCQljb2x1bW4wLnBhY2soKTsKLQkJCWNvbHVtbjEucGFjaygpOwotCQkJY29sdW1uMi5wYWNrKCk7Ci0JCQlyZXR1cm4gdGFibGU7Ci0JCX0KLQkJY2FzZSBURVhUOiB7Ci0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJdGV4dC5zZXRUZXh0KHByZWZpeCsiIFRleHQiKTsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWNhc2UgVFJFRTogewotCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkJCWNvbHVtbjAuc2V0VGV4dCgiTmFtZSIpOwotCQkJVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULlJJR0hUKTsKLQkJCWNvbHVtbjEuc2V0VGV4dCgiVmFsdWUiKTsKLQkJCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQkJY29sdW1uMi5zZXRUZXh0KCJEZXNjcmlwdGlvbiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQoMCwgcHJlZml4KyIgbmFtZSAiK2kpOwotCQkJCWl0ZW0uc2V0VGV4dCgxLCBwcmVmaXgrIiB2YWx1ZSAiK2kpOwotCQkJCWl0ZW0uc2V0VGV4dCgyLCBwcmVmaXgrIiBkZXNjcmlwdGlvbiAiK2kpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCQlzdWJJdGVtLnNldFRleHQoMCwgcHJlZml4KyIgbmFtZSAiK2krIiAiK2opOwotCQkJCQlzdWJJdGVtLnNldFRleHQoMSwgcHJlZml4KyIgdmFsdWUgIitpKyIgIitqKTsKLQkJCQkJc3ViSXRlbS5zZXRUZXh0KDIsIHByZWZpeCsiIGRlc2NyaXB0aW9uICIraSsiICIraik7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgMzsgaysrKSB7Ci0JCQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgwLCBwcmVmaXgrIiBuYW1lICIraSsiICIraisiICIrayk7Ci0JCQkJCQlzdWJzdWJJdGVtLnNldFRleHQoMSwgcHJlZml4KyIgdmFsdWUgIitpKyIgIitqKyIgIitrKTsKLQkJCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgyLCBwcmVmaXgrIiBkZXNjcmlwdGlvbiAiK2krIiAiK2orIiAiK2spOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY29sdW1uMC5wYWNrKCk7Ci0JCQljb2x1bW4xLnBhY2soKTsKLQkJCWNvbHVtbjIucGFjaygpOwotCQkJcmV0dXJuIHRyZWU7Ci0JCX0KLQkJY2FzZSBDQU5WQVM6IHsKLQkJCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQljYW52YXMuc2V0RGF0YSgiU1RSSU5HUyIsIG5ldyBTdHJpbmdbXSB7cHJlZml4KyIgQ2FudmFzIHdpZGdldCJ9KTsKLQkJCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJQ2FudmFzIGMgPSAoQ2FudmFzKWUud2lkZ2V0OwotCQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSljLmdldERhdGEoIklNQUdFIik7Ci0JCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQllLmdjLmRyYXdJbWFnZShpbWFnZSwgNSwgNSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdbXSBzdHJpbmdzID0gKFN0cmluZ1tdKWMuZ2V0RGF0YSgiU1RSSU5HUyIpOwotCQkJCQkJaWYgKHN0cmluZ3MgIT0gbnVsbCkgewotCQkJCQkJCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBlLmdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJCQkJaW50IGhlaWdodCA9IG1ldHJpY3MuZ2V0SGVpZ2h0KCk7Ci0JCQkJCQkJaW50IHkgPSA1OwotCQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCWUuZ2MuZHJhd1N0cmluZyhzdHJpbmdzW2ldLCA1LCB5KTsKLQkJCQkJCQkJeSArPSBoZWlnaHQgKyA1OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJcmV0dXJuIGNhbnZhczsKLQkJfQotCQljYXNlIExBQkVMOiB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQkJbGFiZWwuc2V0VGV4dChwcmVmaXgrIiBMYWJlbCIpOwotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0JCWNhc2UgTElTVDogewotCQkJTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWxpc3Quc2V0SXRlbXMobmV3IFN0cmluZ1tdIHtwcmVmaXgrIiBJdGVtIGEiLCBwcmVmaXgrIiBJdGVtIGIiLCAgcHJlZml4KyIgSXRlbSBjIiwgIHByZWZpeCsiIEl0ZW0gZCJ9KTsKLQkJCXJldHVybiBsaXN0OwotCQl9Ci0JCWNhc2UgQ09NQk86ewotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ikl0ZW0gYSIsICJJdGVtIGIiLCAiSXRlbSBjIiwgIkl0ZW0gZCJ9KTsKLQkJCXJldHVybiBjb21ibzsKLQkJfQotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9OT1RfSU1QTEVNRU5URUQpOwotCX0KLX0KLQotcHVibGljIHZvaWQgb3BlbihEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJEcmFnIGFuZCBEcm9wIEV4YW1wbGUiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2MsIFNXVC5OT05FKTsKLQlzYy5zZXRDb250ZW50KHBhcmVudCk7Ci0JcGFyZW50LnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkKLQlMYWJlbCBkcmFnTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JZHJhZ0xhYmVsLnNldFRleHQoIkRyYWcgU291cmNlOiIpOwotCQotCUdyb3VwIGRyYWdXaWRnZXRHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQlkcmFnV2lkZ2V0R3JvdXAuc2V0VGV4dCgiV2lkZ2V0Iik7Ci0JY3JlYXRlRHJhZ1dpZGdldChkcmFnV2lkZ2V0R3JvdXApOwotCQotCUNvbXBvc2l0ZSBjTGVmdCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY0xlZnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JR3JvdXAgZHJhZ09wZXJhdGlvbnNHcm91cCA9IG5ldyBHcm91cChjTGVmdCwgU1dULk5PTkUpOwotCWRyYWdPcGVyYXRpb25zR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsKLQlkcmFnT3BlcmF0aW9uc0dyb3VwLnNldFRleHQoIkFsbG93ZWQgT3BlcmF0aW9uKHMpOiIpOwotCWNyZWF0ZURyYWdPcGVyYXRpb25zKGRyYWdPcGVyYXRpb25zR3JvdXApOwotCQotCUdyb3VwIGRyYWdUeXBlc0dyb3VwID0gbmV3IEdyb3VwKGNMZWZ0LCBTV1QuTk9ORSk7Ci0JZHJhZ1R5cGVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKSk7Ci0JZHJhZ1R5cGVzR3JvdXAuc2V0VGV4dCgiVHJhbnNmZXIgVHlwZShzKToiKTsKLQljcmVhdGVEcmFnVHlwZXMoZHJhZ1R5cGVzR3JvdXApOwotCQotCWRyYWdDb25zb2xlID0gbmV3IFRleHQoY0xlZnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSIHxTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTVVMVEkpOwotCWRyYWdDb25zb2xlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAoIkNsZWFyIik7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJZHJhZ0NvbnNvbGUuc2V0VGV4dCgiIik7Ci0JCX0KLQl9KTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuQ0hFQ0spOwotCWl0ZW0uc2V0VGV4dCAoIlNob3cgRXZlbnQgZGV0YWlsIik7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSllLndpZGdldDsKLQkJCWRyYWdFdmVudERldGFpbCA9IGl0ZW0uZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQl9KTsKLQlkcmFnQ29uc29sZS5zZXRNZW51KG1lbnUpOwotCQotCUxhYmVsIGRyb3BMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQlkcm9wTGFiZWwuc2V0VGV4dCgiRHJvcCBUYXJnZXQ6Iik7Ci0JCi0JR3JvdXAgZHJvcFdpZGdldEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCWRyb3BXaWRnZXRHcm91cC5zZXRUZXh0KCJXaWRnZXQiKTsKLQljcmVhdGVEcm9wV2lkZ2V0KGRyb3BXaWRnZXRHcm91cCk7Ci0JCi0JQ29tcG9zaXRlIGNSaWdodCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY1JpZ2h0LnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCUdyb3VwIGRyb3BPcGVyYXRpb25zR3JvdXAgPSBuZXcgR3JvdXAoY1JpZ2h0LCBTV1QuTk9ORSk7Ci0JZHJvcE9wZXJhdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMikpOwotCWRyb3BPcGVyYXRpb25zR3JvdXAuc2V0VGV4dCgiQWxsb3dlZCBPcGVyYXRpb24ocyk6Iik7Ci0JY3JlYXRlRHJvcE9wZXJhdGlvbnMoZHJvcE9wZXJhdGlvbnNHcm91cCk7Ci0JCi0JR3JvdXAgZHJvcFR5cGVzR3JvdXAgPSBuZXcgR3JvdXAoY1JpZ2h0LCBTV1QuTk9ORSk7Ci0JZHJvcFR5cGVzR3JvdXAuc2V0VGV4dCgiVHJhbnNmZXIgVHlwZShzKToiKTsKLQljcmVhdGVEcm9wVHlwZXMoZHJvcFR5cGVzR3JvdXApOwotCQotCUdyb3VwIGZlZWRiYWNrVHlwZXNHcm91cCA9IG5ldyBHcm91cChjUmlnaHQsIFNXVC5OT05FKTsKLQlmZWVkYmFja1R5cGVzR3JvdXAuc2V0VGV4dCgiRmVlZGJhY2sgVHlwZShzKToiKTsKLQljcmVhdGVGZWVkYmFja1R5cGVzKGZlZWRiYWNrVHlwZXNHcm91cCk7Ci0JCi0JZHJvcENvbnNvbGUgPSBuZXcgVGV4dChjUmlnaHQsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSIHxTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTVVMVEkpOwotCWRyb3BDb25zb2xlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCW1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKCJDbGVhciIpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWRyb3BDb25zb2xlLnNldFRleHQoIiIpOwotCQl9Ci0JfSk7Ci0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULkNIRUNLKTsKLQlpdGVtLnNldFRleHQgKCJTaG93IEV2ZW50IGRldGFpbCIpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pZS53aWRnZXQ7Ci0JCQlkcm9wRXZlbnREZXRhaWwgPSBpdGVtLmdldFNlbGVjdGlvbigpOwotCQl9Ci0JfSk7Ci0JZHJvcENvbnNvbGUuc2V0TWVudShtZW51KTsKLQkKLQlpZiAoZHJhZ0VuYWJsZWQpIGNyZWF0ZURyYWdTb3VyY2UoKTsKLQlpZiAoZHJvcEVuYWJsZWQpIGNyZWF0ZURyb3BUYXJnZXQoKTsKLQkKLQlpbnQgaGVpZ2h0ID0gMjAwOwotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkcmFnTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZHJhZ0xhYmVsLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAtMTApOwotCWRhdGEuaGVpZ2h0ID0gaGVpZ2h0OwotCWRyYWdXaWRnZXRHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkcmFnV2lkZ2V0R3JvdXAsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTAsIC0xMCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWNMZWZ0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTApOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGVmdCwgMTApOwotCWRyb3BMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChkcm9wTGFiZWwsIDEwKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xlZnQsIDEwKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEwKTsKLQlkYXRhLmhlaWdodCA9IGhlaWdodDsKLQlkcm9wV2lkZ2V0R3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZHJvcFdpZGdldEdyb3VwLCAxMCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMZWZ0LCAxMCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMCk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTApOwotCWNSaWdodC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQlzYy5zZXRNaW5TaXplKHBhcmVudC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQlzYy5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCXNjLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQotCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVJlY3RhbmdsZSBtb25pdG9yQXJlYSA9IHNoZWxsLmdldE1vbml0b3IoKS5nZXRDbGllbnRBcmVhKCk7Ci0Jc2hlbGwuc2V0U2l6ZShNYXRoLm1pbihzaXplLngsIG1vbml0b3JBcmVhLndpZHRoIC0gMjApLCBNYXRoLm1pbihzaXplLnksIG1vbml0b3JBcmVhLmhlaWdodCAtIDIwKSk7Ci0Jc2hlbGwub3BlbigpOwotCQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQkKLX0KLQotcHJpdmF0ZSB2b2lkIHByaW50RXZlbnQoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQlpZiAoIWRyYWdFdmVudERldGFpbCkgcmV0dXJuOwotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlzYi5hcHBlbmQoIndpZGdldDogIik7IHNiLmFwcGVuZChlLndpZGdldCk7Ci0Jc2IuYXBwZW5kKCIsIHRpbWU6ICIpOyBzYi5hcHBlbmQoZS50aW1lKTsKLQlzYi5hcHBlbmQoIiwgb3BlcmF0aW9uOiAiKTsgc2IuYXBwZW5kKGUuZGV0YWlsKTsKLQlzYi5hcHBlbmQoIiwgdHlwZTogIik7IHNiLmFwcGVuZChlLmRhdGFUeXBlICE9IG51bGwgPyBlLmRhdGFUeXBlLnR5cGUgOiAwKTsKLQlzYi5hcHBlbmQoIiwgZG9pdDogIik7IHNiLmFwcGVuZChlLmRvaXQpOwotCXNiLmFwcGVuZCgiLCBkYXRhOiAiKTsgc2IuYXBwZW5kKGUuZGF0YSk7Ci0Jc2IuYXBwZW5kKCJcbiIpOwotCWRyYWdDb25zb2xlLmFwcGVuZChzYi50b1N0cmluZygpKTsKLX0KLQotcHJpdmF0ZSB2b2lkIHByaW50RXZlbnQoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQlpZiAoIWRyb3BFdmVudERldGFpbCkgcmV0dXJuOwotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlzYi5hcHBlbmQoIndpZGdldDsgIik7IHNiLmFwcGVuZChlLndpZGdldCk7Ci0Jc2IuYXBwZW5kKCIsIHRpbWU6ICIpOyBzYi5hcHBlbmQoZS50aW1lKTsKLQlzYi5hcHBlbmQoIiwgeDogIik7IHNiLmFwcGVuZChlLngpOwotCXNiLmFwcGVuZCgiLCB5OiAiKTsgc2IuYXBwZW5kKGUueSk7Ci0Jc2IuYXBwZW5kKCIsIGl0ZW06ICIpOyBzYi5hcHBlbmQoZS5pdGVtKTsKLQlzYi5hcHBlbmQoIiwgb3BlcmF0aW9uczogIik7IHNiLmFwcGVuZChlLm9wZXJhdGlvbnMpOwotCXNiLmFwcGVuZCgiLCBvcGVyYXRpb246ICIpOyBzYi5hcHBlbmQoZS5kZXRhaWwpOwotCXNiLmFwcGVuZCgiLCBmZWVkYmFjazogIik7IHNiLmFwcGVuZChlLmZlZWRiYWNrKTsKLQlpZiAoZS5kYXRhVHlwZXMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGUuZGF0YVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoIiwgZGF0YVR5cGUgIik7IHNiLmFwcGVuZChpKTsgc2IuYXBwZW5kKCI6ICIpOyBzYi5hcHBlbmQoZS5kYXRhVHlwZXNbaV0udHlwZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlzYi5hcHBlbmQoIiwgZGF0YVR5cGVzOiBub25lIik7Ci0JfQotCXNiLmFwcGVuZCgiLCBjdXJyZW50RGF0YVR5cGU6ICIpOyBzYi5hcHBlbmQoZS5jdXJyZW50RGF0YVR5cGUpOwotCXNiLmFwcGVuZCgiLCBkYXRhOiAiKTsgc2IuYXBwZW5kKGUuZGF0YSk7Ci0Jc2IuYXBwZW5kKCJcbiIpOwotCWRyb3BDb25zb2xlLmFwcGVuZChzYi50b1N0cmluZygpKTsKLX0KLQotcHJpdmF0ZSB2b2lkIHJlbW92ZURyYWdUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JaWYgKGRyYWdUeXBlcy5sZW5ndGggPT0gMSkgewotCQlkcmFnVHlwZXMgPSBuZXcgVHJhbnNmZXJbMF07Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBkcmFnVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkcmFnVHlwZXNbaV0gPT0gdHJhbnNmZXIpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm47Ci0JCVRyYW5zZmVyW10gbmV3VHlwZXMgPSBuZXcgVHJhbnNmZXJbZHJhZ1R5cGVzLmxlbmd0aCAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRyYWdUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShkcmFnVHlwZXMsIGluZGV4ICsgMSwgbmV3VHlwZXMsIGluZGV4LCBkcmFnVHlwZXMubGVuZ3RoIC0gaW5kZXggLSAxKTsKLQkJZHJhZ1R5cGVzID0gbmV3VHlwZXM7Ci0JfQotCWlmIChkcmFnU291cmNlICE9IG51bGwpIHsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihkcmFnVHlwZXMpOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIHJlbW92ZURyb3BUcmFuc2ZlcihUcmFuc2ZlciB0cmFuc2Zlcil7Ci0JaWYgKGRyb3BUeXBlcy5sZW5ndGggPT0gMSkgewotCQlkcm9wVHlwZXMgPSBuZXcgVHJhbnNmZXJbMF07Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBkcm9wVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkcm9wVHlwZXNbaV0gPT0gdHJhbnNmZXIpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm47Ci0JCVRyYW5zZmVyW10gbmV3VHlwZXMgPSBuZXcgVHJhbnNmZXJbZHJvcFR5cGVzLmxlbmd0aCAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRyb3BUeXBlcywgMCwgbmV3VHlwZXMsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShkcm9wVHlwZXMsIGluZGV4ICsgMSwgbmV3VHlwZXMsIGluZGV4LCBkcm9wVHlwZXMubGVuZ3RoIC0gaW5kZXggLSAxKTsKLQkJZHJvcFR5cGVzID0gbmV3VHlwZXM7Ci0JfQotCWlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIHsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2Zlcihkcm9wVHlwZXMpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9JbWFnZVRyYW5zZmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9kbmQvSW1hZ2VUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Y3ZWQxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2RuZC9JbWFnZVRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmRuZDsKLQotIAotLyoqCi0gKiBUcmFuc2ZlciB0eXBlIHRvIHRyYW5zZmVyIFNXVCBJbWFnZURhdGEgb2JqZWN0cy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEltYWdlVHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVOQU1FID0gImltYWdlZGF0YSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVJRCA9IHJlZ2lzdGVyVHlwZShUWVBFTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VUcmFuc2ZlciBfaW5zdGFuY2UgPSBuZXcgSW1hZ2VUcmFuc2ZlcigpOwotCi1wdWJsaWMgc3RhdGljIEltYWdlVHJhbnNmZXIgZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci0KLXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZSAoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCWlmICghY2hlY2tJbWFnZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JfQotCUltYWdlRGF0YSBpbWRhdGEgPSAoSW1hZ2VEYXRhKW9iamVjdDsKLQl0cnkgewotCQkvLyB3cml0ZSBkYXRhIHRvIGEgYnl0ZSBhcnJheSBhbmQgdGhlbiBhc2sgc3VwZXIgdG8gY29udmVydCB0byBwTWVkaXVtCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhIFtdIHtpbWRhdGF9OwotCQlsb2FkZXIuc2F2ZSh3cml0ZU91dCwgU1dULklNQUdFX0JNUCk7Ci0JCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCWJ5dGVbXSBidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQkJc3VwZXIuamF2YVRvTmF0aXZlKGJ1ZmZlciwgdHJhbnNmZXJEYXRhKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfSAKLQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0KLX0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpewkKLQlpZiAoIWlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSByZXR1cm4gbnVsbDsKLQkJCi0JYnl0ZVtdIGJ1ZmZlciA9IChieXRlW10pc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSk7Ci0JaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQlJbWFnZURhdGEgaW1kYXRhOwotCXRyeSB7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlcik7Ci0JCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKLQkJaW1kYXRhID0gbmV3IEltYWdlRGF0YShyZWFkSW4pOwotCQlyZWFkSW4uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGltZGF0YTsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmV3IFN0cmluZ1tde1RZUEVOQU1FfTsKLX0KLXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCl7Ci0JcmV0dXJuIG5ldyBpbnRbXSB7VFlQRUlEfTsKLX0KLWJvb2xlYW4gY2hlY2tJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIChvYmplY3QgIT0gbnVsbCAgJiYgb2JqZWN0IGluc3RhbmNlb2YgSW1hZ2VEYXRhKTsKLX0KLXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQlyZXR1cm4gY2hlY2tJbWFnZShvYmplY3QpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9GaWxlVmlld2VyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ZpbGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGMzZDhjMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ZpbGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5maWxldmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEZpbGUgVmlld2VyIGV4YW1wbGUKLSAqLwotcHVibGljIGNsYXNzIEZpbGVWaWV3ZXIgeyAKLSAJcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2ZpbGV2aWV3ZXIiKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEUklWRV9BID0gImE6IiArIEZpbGUuc2VwYXJhdG9yOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEUklWRV9CID0gImI6IiArIEZpbGUuc2VwYXJhdG9yOwotCi0JLyogVUkgZWxlbWVudHMgKi8gCQotCXByaXZhdGUgRGlzcGxheSBkaXNwbGF5OyAKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgVG9vbEJhciB0b29sQmFyOwotCi0JcHJpdmF0ZSBMYWJlbCBudW1PYmplY3RzTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBkaXNrU3BhY2VMYWJlbDsKLQkKLQlwcml2YXRlIEZpbGUgY3VycmVudERpcmVjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWwgPSB0cnVlOwotCQotCS8qIERyYWcgYW5kIGRyb3Agb3B0aW1pemF0aW9ucyAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIGlmIHRoaXMgYXBwIGlzIGRyYWdnaW5nCi0JcHJpdmF0ZSBib29sZWFuIGlzRHJvcHBpbmcgPSBmYWxzZTsgLy8gaWYgdGhpcyBhcHAgaXMgZHJvcHBpbmcKLQotCXByaXZhdGUgRmlsZVtdICBwcm9jZXNzZWREcm9wRmlsZXMgPSBudWxsOyAvLyBzbyBEcmFnIG9ubHkgZGVsZXRlcyB3aGF0IGl0IG5lZWRzIHRvCi0JcHJpdmF0ZSBGaWxlW10gIGRlZmVycmVkUmVmcmVzaEZpbGVzID0gbnVsbDsgICAgICAvLyB0byBkZWZlciBub3RpZnlSZWZyZXNoRmlsZXMgd2hpbGUgd2UgZG8gRE5ECi0JcHJpdmF0ZSBib29sZWFuIGRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCA9IGZhbHNlOyAvLyB0byBkZWZlciBub3RpZnlSZWZyZXNoRmlsZXMgd2hpbGUgd2UgZG8gRE5ECi0JcHJpdmF0ZSBQcm9ncmVzc0RpYWxvZyBwcm9ncmVzc0RpYWxvZyA9IG51bGw7IC8vIHByb2dyZXNzIGRpYWxvZyBmb3IgbG9jYWxseS1pbml0aWF0ZWQgb3BlcmF0aW9ucwotCi0JLyogQ29tYm8gdmlldyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01CT0RBVEFfUk9PVFMgPSAiQ29tYm8ucm9vdHMiOwotCQkvLyBGaWxlW106IEFycmF5IG9mIGZpbGVzIHdob3NlIHBhdGhzIGFyZSBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSBjb21ibwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01CT0RBVEFfTEFTVFRFWFQgPSAiQ29tYm8ubGFzdFRleHQiOwotCQkvLyBTdHJpbmc6IFByZXZpb3VzIHNlbGVjdGlvbiB0ZXh0IHN0cmluZwotCi0JcHJpdmF0ZSBDb21ibyBjb21ibzsKLQotCS8qIFRyZWUgdmlldyAqLwotCXByaXZhdGUgSWNvbkNhY2hlIGljb25DYWNoZSA9IG5ldyBJY29uQ2FjaGUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRUlURU1EQVRBX0ZJTEUgPSAiVHJlZUl0ZW0uZmlsZSI7Ci0JCS8vIEZpbGU6IEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRyZWUgaXRlbQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFSVRFTURBVEFfSU1BR0VFWFBBTkRFRCA9ICJUcmVlSXRlbS5pbWFnZUV4cGFuZGVkIjsKLQkJLy8gSW1hZ2U6IHNob3duIHdoZW4gaXRlbSBpcyBleHBhbmRlZAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFSVRFTURBVEFfSU1BR0VDT0xMQVBTRUQgPSAiVHJlZUl0ZW0uaW1hZ2VDb2xsYXBzZWQiOwotCQkvLyBJbWFnZTogc2hvd24gd2hlbiBpdGVtIGlzIGNvbGxhcHNlZAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFSVRFTURBVEFfU1RVQiA9ICJUcmVlSXRlbS5zdHViIjsKLQkJLy8gT2JqZWN0OiBpZiBub3QgcHJlc2VudCBvciBudWxsIHRoZW4gdGhlIGl0ZW0gaGFzIG5vdCBiZWVuIHBvcHVsYXRlZAotCi0JcHJpdmF0ZSBUcmVlIHRyZWU7Ci0JcHJpdmF0ZSBMYWJlbCB0cmVlU2NvcGVMYWJlbDsKLQotCS8qIFRhYmxlIHZpZXcgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoCi0JCURhdGVGb3JtYXQuTUVESVVNLCBEYXRlRm9ybWF0Lk1FRElVTSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFSVRFTURBVEFfRklMRSA9ICJUYWJsZUl0ZW0uZmlsZSI7Ci0JCS8vIEZpbGU6IEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRhYmxlIHJvdwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRURBVEFfRElSID0gIlRhYmxlLmRpciI7Ci0JCS8vIEZpbGU6IEN1cnJlbnRseSB2aXNpYmxlIGRpcmVjdG9yeQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHRhYmxlV2lkdGhzID0gbmV3IGludFtdIHsxNTAsIDYwLCA3NSwgMTUwfTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHRhYmxlVGl0bGVzID0gbmV3IFN0cmluZyBbXSB7Ci0JCUZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInRhYmxlLk5hbWUudGl0bGUiKSwKLQkJRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygidGFibGUuU2l6ZS50aXRsZSIpLAotCQlGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJ0YWJsZS5UeXBlLnRpdGxlIiksCi0JCUZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInRhYmxlLk1vZGlmaWVkLnRpdGxlIikKLQl9OwotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBMYWJlbCB0YWJsZUNvbnRlbnRzT2ZMYWJlbDsKLQotCS8qIFRhYmxlIHVwZGF0ZSB3b3JrZXIgKi8KLQkvLyBDb250cm9sIGRhdGEKLQlwcml2YXRlIGZpbmFsIE9iamVjdCB3b3JrZXJMb2NrID0gbmV3IE9iamVjdCgpOwotCQkvLyBMb2NrIGZvciBhbGwgd29ya2VyIGNvbnRyb2wgZGF0YSBhbmQgc3RhdGUKLQlwcml2YXRlIHZvbGF0aWxlIFRocmVhZCAgd29ya2VyVGhyZWFkID0gbnVsbDsKLQkJLy8gVGhlIHdvcmtlcidzIHRocmVhZAotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB3b3JrZXJTdG9wcGVkID0gZmFsc2U7Ci0JCS8vIFRydWUgaWYgdGhlIHdvcmtlciBtdXN0IGV4aXQgb24gY29tcGxldGlvbiBvZiB0aGUgY3VycmVudCBjeWNsZQotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB3b3JrZXJDYW5jZWxsZWQgPSBmYWxzZTsKLQkJLy8gVHJ1ZSBpZiB0aGUgd29ya2VyIG11c3QgY2FuY2VsIGl0cyBvcGVyYXRpb25zIHByZW1hdHVyZWx5IHBlcmhhcHMgZHVlIHRvIGEgc3RhdGUgdXBkYXRlCi0KLQkvLyBXb3JrZXIgc3RhdGUgaW5mb3JtYXRpb24gLS0gdGhpcyBpcyB3aGF0IGdldHMgc3luY2hyb25pemVkIGJ5IGFuIHVwZGF0ZQotCXByaXZhdGUgdm9sYXRpbGUgRmlsZSB3b3JrZXJTdGF0ZURpciA9IG51bGw7Ci0KLQkvLyBTdGF0ZSBpbmZvcm1hdGlvbiB0byB1c2UgZm9yIHRoZSBuZXh0IGN5Y2xlCi0JcHJpdmF0ZSB2b2xhdGlsZSBGaWxlIHdvcmtlck5leHREaXIgPSBudWxsOwotCi0JLyogU2ltdWxhdGUgb25seSBmbGFnICovCi0JLy8gd2hlbiB0cnVlLCBkaXNhYmxlcyBhY3R1YWwgZmlsZXN5c3RlbSBtYW5pcHVsYXRpb25zIGFuZCBvdXRwdXRzIHJlc3VsdHMgdG8gc3RhbmRhcmQgb3V0Ci0JcHJpdmF0ZSBib29sZWFuIHNpbXVsYXRlT25seSA9IHRydWU7Ci0KLQkvKioKLQkgKiBSdW5zIG1haW4gcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCUZpbGVWaWV3ZXIgYXBwbGljYXRpb24gPSBuZXcgRmlsZVZpZXdlcigpOwotCQlTaGVsbCBzaGVsbCA9IGFwcGxpY2F0aW9uLm9wZW4oZGlzcGxheSk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWFwcGxpY2F0aW9uLmNsb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBtYWluIHByb2dyYW0uCi0JICovCi0JcHVibGljIFNoZWxsIG9wZW4oRGlzcGxheSBkaXNwbGF5KSB7CQkKLQkJLy8gQ3JlYXRlIHRoZSB3aW5kb3cKLQkJdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsKLQkJaWNvbkNhY2hlLmluaXRSZXNvdXJjZXMoZGlzcGxheSk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCWNyZWF0ZVNoZWxsQ29udGVudHMoKTsKLQkJbm90aWZ5UmVmcmVzaEZpbGVzKG51bGwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIG1haW4gcHJvZ3JhbS4KLQkgKi8KLQl2b2lkIGNsb3NlKCkgewotCQl3b3JrZXJTdG9wKCk7Ci0JCWljb25DYWNoZS5mcmVlUmVzb3VyY2VzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggYmVjYXVzZSBvZiBhIG1pc3NpbmcgU3RyaW5nLgotCSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgdGhlIFVJCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lciB0aGUgU2hlbGxDb250YWluZXIgbWFuYWdpbmcgdGhlIFNoZWxsIHdlIGFyZSByZW5kZXJpbmcgaW5zaWRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNoZWxsQ29udGVudHMoKSB7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIlRpdGxlIiwgbmV3IE9iamVjdFtdIHsgIiIgfSkpOwkKLQkJc2hlbGwuc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5zaGVsbEljb25dKTsKLQkJTWVudSBiYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIoYmFyKTsKLQkJY3JlYXRlRmlsZU1lbnUoYmFyKTsKLQkJY3JlYXRlSGVscE1lbnUoYmFyKTsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTg1OwotCQljcmVhdGVDb21ib1ZpZXcoc2hlbGwsIGdyaWREYXRhKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljcmVhdGVUb29sQmFyKHNoZWxsLCBncmlkRGF0YSk7Ci0KLQkJU2FzaEZvcm0gc2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0oc2hlbGwsIFNXVC5OT05FKTsKLQkJc2FzaEZvcm0uc2V0T3JpZW50YXRpb24oU1dULkhPUklaT05UQUwpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzYXNoRm9ybS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY3JlYXRlVHJlZVZpZXcoc2FzaEZvcm0pOwotCQljcmVhdGVUYWJsZVZpZXcoc2FzaEZvcm0pOwotCQlzYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDIsIDUgfSk7Ci0KLQkJbnVtT2JqZWN0c0xhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDE4NTsKLQkJbnVtT2JqZWN0c0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJZGlza1NwYWNlTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkaXNrU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRmlsZSBNZW51LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBtZW51Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbGVNZW51KE1lbnUgcGFyZW50KSB7Ci0JCU1lbnUgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0JCU1lbnVJdGVtIGhlYWRlciA9IG5ldyBNZW51SXRlbShwYXJlbnQsIFNXVC5DQVNDQURFKTsKLQkJaGVhZGVyLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIm1lbnUuRmlsZS50ZXh0IikpOwotCQloZWFkZXIuc2V0TWVudShtZW51KTsKLQotCQlmaW5hbCBNZW51SXRlbSBzaW11bGF0ZUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQkJc2ltdWxhdGVJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIm1lbnUuRmlsZS5TaW11bGF0ZU9ubHkudGV4dCIpKTsKLQkJc2ltdWxhdGVJdGVtLnNldFNlbGVjdGlvbihzaW11bGF0ZU9ubHkpOwotCQlzaW11bGF0ZUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNpbXVsYXRlT25seSA9IHNpbXVsYXRlSXRlbS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5GaWxlLkNsb3NlLnRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBIZWxwIE1lbnUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG1lbnUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlSGVscE1lbnUoTWVudSBwYXJlbnQpIHsKLQkJTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJTWVudUl0ZW0gaGVhZGVyID0gbmV3IE1lbnVJdGVtKHBhcmVudCwgU1dULkNBU0NBREUpOwotCQloZWFkZXIuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygibWVudS5IZWxwLnRleHQiKSk7Ci0JCWhlYWRlci5zZXRNZW51KG1lbnUpOwotCi0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIm1lbnUuSGVscC5BYm91dC50ZXh0IikpOwkJCi0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULk9LKTsKLQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkFib3V0LnRpdGxlIikpOwotCQkJCWJveC5zZXRNZXNzYWdlKGdldFJlc291cmNlU3RyaW5nKCJkaWFsb2cuQWJvdXQuZGVzY3JpcHRpb24iLAotCQkJCQluZXcgT2JqZWN0W10geyBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSB9KSk7Ci0JCQkJYm94Lm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9vbGJhcgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgb24gd2hpY2ggdG8gYXR0YWNoIHRoZSB0b29sYmFyCi0JICogQHBhcmFtIGxheW91dERhdGEgdGhlIGxheW91dCBkYXRhCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRvb2xCYXIoZmluYWwgU2hlbGwgc2hlbGwsIE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULk5PTkUpOwotCQl0b29sQmFyLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kUGFyZW50XSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUGFyZW50LnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRvUGFyZW50KCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZFJlZnJlc2hdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5SZWZyZXNoLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRvUmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQkJU2VsZWN0aW9uQWRhcHRlciB1bmltcGxlbWVudGVkTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9JTkZPUk1BVElPTiB8IFNXVC5PSyk7Ci0JCQkJYm94LnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5Ob3RJbXBsZW1lbnRlZC50aXRsZSIpKTsKLQkJCQlib3guc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkFjdGlvbk5vdEltcGxlbWVudGVkLmRlc2NyaXB0aW9uIikpOwotCQkJCWJveC5vcGVuKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuU0VQQVJBVE9SKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRDdXRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5DdXQudGlwdGV4dCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih1bmltcGxlbWVudGVkTGlzdGVuZXIpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZENvcHldKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5Db3B5LnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQkJaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5jbWRQYXN0ZV0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlBhc3RlLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZERlbGV0ZV0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLkRlbGV0ZS50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kUmVuYW1lXSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUmVuYW1lLnRpcHRleHQiKSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodW5pbXBsZW1lbnRlZExpc3RlbmVyKTsKLQotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRJbWFnZShpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmNtZFNlYXJjaF0pOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ0b29sLlNlYXJjaC50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0JCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuY21kUHJpbnRdKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dChnZXRSZXNvdXJjZVN0cmluZygidG9vbC5QcmludC50aXB0ZXh0IikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHVuaW1wbGVtZW50ZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29tYm8gYm94IHZpZXcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29tYm9WaWV3KENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCWNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21iby5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBGaWxlW10gcm9vdHMgPSAoRmlsZVtdKSBjb21iby5nZXREYXRhKENPTUJPREFUQV9ST09UUyk7Ci0JCQkJaWYgKHJvb3RzID09IG51bGwpIHJldHVybjsKLQkJCQlpbnQgc2VsZWN0aW9uID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoc2VsZWN0aW9uID49IDAgJiYgc2VsZWN0aW9uIDwgcm9vdHMubGVuZ3RoKSB7Ci0JCQkJCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KHJvb3RzW3NlbGVjdGlvbl0pOwotCQkJCX0KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGxhc3RUZXh0ID0gKFN0cmluZykgY29tYm8uZ2V0RGF0YShDT01CT0RBVEFfTEFTVFRFWFQpOwotCQkJCVN0cmluZyB0ZXh0ID0gY29tYm8uZ2V0VGV4dCgpOwotCQkJCWlmICh0ZXh0ID09IG51bGwpIHJldHVybjsKLQkJCQlpZiAobGFzdFRleHQgIT0gbnVsbCAmJiBsYXN0VGV4dC5lcXVhbHModGV4dCkpIHJldHVybjsKLQkJCQljb21iby5zZXREYXRhKENPTUJPREFUQV9MQVNUVEVYVCwgdGV4dCk7Ci0JCQkJbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkobmV3IEZpbGUodGV4dCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmaWxlIHRyZWUgdmlldy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUcmVlVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQlncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCXRyZWVTY29wZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXRyZWVTY29wZUxhYmVsLnNldFRleHQoRmlsZVZpZXdlci5nZXRSZXNvdXJjZVN0cmluZygiZGV0YWlscy5BbGxGb2xkZXJzLnRleHQiKSk7Ci0JCXRyZWVTY29wZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQotCQl0cmVlID0gbmV3IFRyZWUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlNJTkdMRSk7Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCi0JCXRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5sZW5ndGggIT0gMCkgewotCQkJCQlUcmVlSXRlbSBpdGVtID0gc2VsZWN0aW9uWzBdOwotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCQkKLQkJCQkJbm90aWZ5U2VsZWN0ZWREaXJlY3RvcnkoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluYWwgVHJlZUl0ZW1bXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ubGVuZ3RoICE9IDApIHsKLQkJCQkJVHJlZUl0ZW0gaXRlbSA9IHNlbGVjdGlvblswXTsKLQkJCQkJaXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCQkJdHJlZUV4cGFuZEl0ZW0oaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdHJlZS5hZGRUcmVlTGlzdGVuZXIobmV3IFRyZWVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VFWFBBTkRFRCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJCXRyZWVFeHBhbmRJdGVtKGl0ZW0pOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCWZpbmFsIEltYWdlIGltYWdlID0gKEltYWdlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFQ09MTEFQU0VEKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQl9Ci0JCX0pOwotCQljcmVhdGVUcmVlRHJhZ1NvdXJjZSh0cmVlKTsKLQkJY3JlYXRlVHJlZURyb3BUYXJnZXQodHJlZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRHJhZyAmIERyb3AgRHJhZ1NvdXJjZSBmb3IgaXRlbXMgYmVpbmcgZHJhZ2dlZCBmcm9tIHRoZSB0cmVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERyYWdTb3VyY2UgZm9yIHRoZSB0cmVlCi0JICovCi0JcHJpdmF0ZSBEcmFnU291cmNlIGNyZWF0ZVRyZWVEcmFnU291cmNlKGZpbmFsIFRyZWUgdHJlZSl7Ci0JCURyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRyZWUsIERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZKTsKLQkJZHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQkJVHJlZUl0ZW1bXSBkbmRTZWxlY3Rpb24gPSBudWxsOwotCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSBudWxsOwotCQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJZG5kU2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQkJZXZlbnQuZG9pdCA9IGRuZFNlbGVjdGlvbi5sZW5ndGggPiAwOwotCQkJCWlzRHJhZ2dpbmcgPSB0cnVlOwotCQkJCXByb2Nlc3NlZERyb3BGaWxlcyA9IG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlkcmFnU291cmNlSGFuZGxlRHJhZ0ZpbmlzaGVkKGV2ZW50LCBzb3VyY2VOYW1lcyk7Ci0JCQkJZG5kU2VsZWN0aW9uID0gbnVsbDsKLQkJCQlzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQkJaXNEcmFnZ2luZyA9IGZhbHNlOwotCQkJCXByb2Nlc3NlZERyb3BGaWxlcyA9IG51bGw7Ci0JCQkJaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpewotCQkJCWlmIChkbmRTZWxlY3Rpb24gPT0gbnVsbCB8fCBkbmRTZWxlY3Rpb24ubGVuZ3RoID09IDApIHJldHVybjsKLQkJCQlpZiAoISBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSByZXR1cm47Ci0JCQkJCi0JCQkJc291cmNlTmFtZXMgID0gbmV3IFN0cmluZ1tkbmRTZWxlY3Rpb24ubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRuZFNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgZG5kU2VsZWN0aW9uW2ldLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJCQlzb3VyY2VOYW1lc1tpXSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfQotCQkJCWV2ZW50LmRhdGEgPSBzb3VyY2VOYW1lczsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBkcmFnU291cmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIERyYWcgJiBEcm9wIERyb3BUYXJnZXQgZm9yIGl0ZW1zIGJlaW5nIGRyb3BwZWQgb250byB0aGUgdHJlZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEcm9wVGFyZ2V0IGZvciB0aGUgdHJlZQotCSAqLwotCXByaXZhdGUgRHJvcFRhcmdldCBjcmVhdGVUcmVlRHJvcFRhcmdldChmaW5hbCBUcmVlIHRyZWUpIHsKLQkJRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodHJlZSwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkpOwotCQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlpc0Ryb3BwaW5nID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlpc0Ryb3BwaW5nID0gZmFsc2U7Ci0JCQkJaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlkcm9wVGFyZ2V0VmFsaWRhdGUoZXZlbnQsIGdldFRhcmdldEZpbGUoZXZlbnQpKTsKLQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfRVhQQU5EIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZSB0YXJnZXRGaWxlID0gZ2V0VGFyZ2V0RmlsZShldmVudCk7Ci0JCQkJaWYgKGRyb3BUYXJnZXRWYWxpZGF0ZShldmVudCwgdGFyZ2V0RmlsZSkpCi0JCQkJCWRyb3BUYXJnZXRIYW5kbGVEcm9wKGV2ZW50LCB0YXJnZXRGaWxlKTsKLQkJCX0KLQkJCXByaXZhdGUgRmlsZSBnZXRUYXJnZXRGaWxlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCS8vIERldGVybWluZSB0aGUgdGFyZ2V0IEZpbGUgZm9yIHRoZSBkcm9wIAotCQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0odHJlZS50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKSk7Ci0JCQkJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCS8vIFdlIGFyZSBvdmVyIGEgcGFydGljdWxhciBpdGVtIGluIHRoZSB0cmVlLCB1c2UgdGhlIGl0ZW0ncyBmaWxlCi0JCQkJCXRhcmdldEZpbGUgPSAoRmlsZSkgaXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRhcmdldEZpbGU7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZHJvcFRhcmdldDsJCi0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBleHBhbmQgZXZlbnRzIG9uIGEgdHJlZSBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBpdGVtIHRoZSBUcmVlSXRlbSB0byBmaWxsIGluCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyZWVFeHBhbmRJdGVtKFRyZWVJdGVtIGl0ZW0pIHsKLQkJc2hlbGwuc2V0Q3Vyc29yKGljb25DYWNoZS5zdG9ja0N1cnNvcnNbaWNvbkNhY2hlLmN1cnNvcldhaXRdKTsKLQkJZmluYWwgT2JqZWN0IHN0dWIgPSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX1NUVUIpOwotCQlpZiAoc3R1YiA9PSBudWxsKSB0cmVlUmVmcmVzaEl0ZW0oaXRlbSwgdHJ1ZSk7Ci0JCXNoZWxsLnNldEN1cnNvcihpY29uQ2FjaGUuc3RvY2tDdXJzb3JzW2ljb25DYWNoZS5jdXJzb3JEZWZhdWx0XSk7Ci0JfQotCQotCS8qKgotCSAqIFRyYXZlcnNlIHRoZSBlbnRpcmUgdHJlZSBhbmQgdXBkYXRlIG9ubHkgd2hhdCBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdHMgdGhlIHJvb3QgZGlyZWN0b3J5IGxpc3RpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJlZVJlZnJlc2goRmlsZVtdIG1hc3RlckZpbGVzKSB7Ci0JCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldEl0ZW1zKCk7Ci0JCWludCBtYXN0ZXJJbmRleCA9IDA7Ci0JCWludCBpdGVtSW5kZXggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlmaW5hbCBGaWxlIGl0ZW1GaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQlpZiAoKGl0ZW1GaWxlID09IG51bGwpIHx8IChtYXN0ZXJJbmRleCA9PSBtYXN0ZXJGaWxlcy5sZW5ndGgpKSB7Ci0JCQkJLy8gcmVtb3ZlIGJhZCBpdGVtIG9yIHBsYWNlaG9sZGVyCi0JCQkJaXRlbS5kaXNwb3NlKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmaW5hbCBGaWxlIG1hc3RlckZpbGUgPSBtYXN0ZXJGaWxlc1ttYXN0ZXJJbmRleF07Ci0JCQlpbnQgY29tcGFyZSA9IGNvbXBhcmVGaWxlcyhtYXN0ZXJGaWxlLCBpdGVtRmlsZSk7Ci0JCQlpZiAoY29tcGFyZSA9PSAwKSB7Ci0JCQkJLy8gc2FtZSBmaWxlLCB1cGRhdGUgaXQKLQkJCQl0cmVlUmVmcmVzaEl0ZW0oaXRlbSwgZmFsc2UpOwotCQkJCSsraXRlbUluZGV4OwotCQkJCSsrbWFzdGVySW5kZXg7Ci0JCQl9IGVsc2UgaWYgKGNvbXBhcmUgPCAwKSB7Ci0JCQkJLy8gc2hvdWxkIGFwcGVhciBiZWZvcmUgZmlsZSwgaW5zZXJ0IGl0Ci0JCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgaXRlbUluZGV4KTsKLQkJCQl0cmVlSW5pdFZvbHVtZShuZXdJdGVtLCBtYXN0ZXJGaWxlKTsKLQkJCQluZXcgVHJlZUl0ZW0obmV3SXRlbSwgU1dULk5PTkUpOyAvLyBwbGFjZWhvbGRlciBjaGlsZCBpdGVtIHRvIGdldCAiZXhwYW5kIiBidXR0b24KLQkJCQkrK2l0ZW1JbmRleDsKLQkJCQkrK21hc3RlckluZGV4OwotCQkJCS0taTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc2hvdWxkIGFwcGVhciBhZnRlciBmaWxlLCBkZWxldGUgc3RhbGUgaXRlbQotCQkJCWl0ZW0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWZvciAoO21hc3RlckluZGV4IDwgbWFzdGVyRmlsZXMubGVuZ3RoOyArK21hc3RlckluZGV4KSB7Ci0JCQlmaW5hbCBGaWxlIG1hc3RlckZpbGUgPSBtYXN0ZXJGaWxlc1ttYXN0ZXJJbmRleF07Ci0JCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCXRyZWVJbml0Vm9sdW1lKG5ld0l0ZW0sIG1hc3RlckZpbGUpOwotCQkJbmV3IFRyZWVJdGVtKG5ld0l0ZW0sIFNXVC5OT05FKTsgLy8gcGxhY2Vob2xkZXIgY2hpbGQgaXRlbSB0byBnZXQgImV4cGFuZCIgYnV0dG9uCi0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBUcmF2ZXJzZSBhbiBpdGVtIGluIHRoZSB0cmVlIGFuZCB1cGRhdGUgb25seSB3aGF0IGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBkaXJJdGVtIHRoZSB0cmVlIGl0ZW0gb2YgdGhlIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBmb3JjZVBvcHVsYXRlIHRydWUgaWZmIHdlIHNob3VsZCBwb3B1bGF0ZSBub24tZXhwYW5kZWQgaXRlbXMgYXMgd2VsbAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmVlUmVmcmVzaEl0ZW0oVHJlZUl0ZW0gZGlySXRlbSwgYm9vbGVhbiBmb3JjZVBvcHVsYXRlKSB7Ci0JCWZpbmFsIEZpbGUgZGlyID0gKEZpbGUpIGRpckl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQotCQlpZiAoISBmb3JjZVBvcHVsYXRlICYmICEgZGlySXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQkvLyBSZWZyZXNoIG5vbi1leHBhbmRlZCBpdGVtCi0JCQlpZiAoZGlySXRlbS5nZXREYXRhKFRSRUVJVEVNREFUQV9TVFVCKSAhPSBudWxsKSB7Ci0JCQkJdHJlZUl0ZW1SZW1vdmVBbGwoZGlySXRlbSk7Ci0JCQkJbmV3IFRyZWVJdGVtKGRpckl0ZW0sIFNXVC5OT05FKTsgLy8gcGxhY2Vob2xkZXIgY2hpbGQgaXRlbSB0byBnZXQgImV4cGFuZCIgYnV0dG9uCi0JCQkJZGlySXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9TVFVCLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBSZWZyZXNoIGV4cGFuZGVkIGl0ZW0KLQkJZGlySXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9TVFVCLCB0aGlzKTsgLy8gY2xlYXIgc3R1YiBmbGFnCi0KLQkJLyogR2V0IGRpcmVjdG9yeSBsaXN0aW5nICovCi0JCUZpbGVbXSBzdWJGaWxlcyA9IChkaXIgIT0gbnVsbCkgPyBGaWxlVmlld2VyLmdldERpcmVjdG9yeUxpc3QoZGlyKSA6IG51bGw7Ci0JCWlmIChzdWJGaWxlcyA9PSBudWxsIHx8IHN1YkZpbGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkvKiBFcnJvciBvciBubyBjb250ZW50cyAqLwotCQkJdHJlZUl0ZW1SZW1vdmVBbGwoZGlySXRlbSk7Ci0JCQlkaXJJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIFJlZnJlc2ggc3ViLWl0ZW1zICovCi0JCVRyZWVJdGVtW10gaXRlbXMgPSBkaXJJdGVtLmdldEl0ZW1zKCk7Ci0JCWZpbmFsIEZpbGVbXSBtYXN0ZXJGaWxlcyA9IHN1YkZpbGVzOwotCQlpbnQgbWFzdGVySW5kZXggPSAwOwotCQlpbnQgaXRlbUluZGV4ID0gMDsKLQkJRmlsZSBtYXN0ZXJGaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotCQkJd2hpbGUgKChtYXN0ZXJGaWxlID09IG51bGwpICYmIChtYXN0ZXJJbmRleCA8IG1hc3RlckZpbGVzLmxlbmd0aCkpIHsKLQkJCQltYXN0ZXJGaWxlID0gbWFzdGVyRmlsZXNbbWFzdGVySW5kZXgrK107Ci0JCQkJaWYgKCEgbWFzdGVyRmlsZS5pc0RpcmVjdG9yeSgpKSBtYXN0ZXJGaWxlID0gbnVsbDsKLQkJCX0KLQotCQkJZmluYWwgVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJZmluYWwgRmlsZSBpdGVtRmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUpOwotCQkJaWYgKChpdGVtRmlsZSA9PSBudWxsKSB8fCAobWFzdGVyRmlsZSA9PSBudWxsKSkgewotCQkJCS8vIHJlbW92ZSBiYWQgaXRlbSBvciBwbGFjZWhvbGRlcgotCQkJCWl0ZW0uZGlzcG9zZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaW50IGNvbXBhcmUgPSBjb21wYXJlRmlsZXMobWFzdGVyRmlsZSwgaXRlbUZpbGUpOwotCQkJaWYgKGNvbXBhcmUgPT0gMCkgewotCQkJCS8vIHNhbWUgZmlsZSwgdXBkYXRlIGl0Ci0JCQkJdHJlZVJlZnJlc2hJdGVtKGl0ZW0sIGZhbHNlKTsKLQkJCQltYXN0ZXJGaWxlID0gbnVsbDsKLQkJCQkrK2l0ZW1JbmRleDsKLQkJCX0gZWxzZSBpZiAoY29tcGFyZSA8IDApIHsKLQkJCQkvLyBzaG91bGQgYXBwZWFyIGJlZm9yZSBmaWxlLCBpbnNlcnQgaXQKLQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGRpckl0ZW0sIFNXVC5OT05FLCBpdGVtSW5kZXgpOwotCQkJCXRyZWVJbml0Rm9sZGVyKG5ld0l0ZW0sIG1hc3RlckZpbGUpOwotCQkJCW5ldyBUcmVlSXRlbShuZXdJdGVtLCBTV1QuTk9ORSk7IC8vIGFkZCBhIHBsYWNlaG9sZGVyIGNoaWxkIGl0ZW0gc28gd2UgZ2V0IHRoZSAiZXhwYW5kIiBidXR0b24KLQkJCQltYXN0ZXJGaWxlID0gbnVsbDsKLQkJCQkrK2l0ZW1JbmRleDsKLQkJCQktLWk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNob3VsZCBhcHBlYXIgYWZ0ZXIgZmlsZSwgZGVsZXRlIHN0YWxlIGl0ZW0KLQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoKG1hc3RlckZpbGUgIT0gbnVsbCkgfHwgKG1hc3RlckluZGV4IDwgbWFzdGVyRmlsZXMubGVuZ3RoKSkgewotCQkJaWYgKG1hc3RlckZpbGUgIT0gbnVsbCkgewotCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0oZGlySXRlbSwgU1dULk5PTkUpOwotCQkJCXRyZWVJbml0Rm9sZGVyKG5ld0l0ZW0sIG1hc3RlckZpbGUpOwotCQkJCW5ldyBUcmVlSXRlbShuZXdJdGVtLCBTV1QuTk9ORSk7IC8vIGFkZCBhIHBsYWNlaG9sZGVyIGNoaWxkIGl0ZW0gc28gd2UgZ2V0IHRoZSAiZXhwYW5kIiBidXR0b24KLQkJCQlpZiAobWFzdGVySW5kZXggPT0gbWFzdGVyRmlsZXMubGVuZ3RoKSBicmVhazsKLQkJCX0KLQkJCW1hc3RlckZpbGUgPSBtYXN0ZXJGaWxlc1ttYXN0ZXJJbmRleCsrXTsKLQkJCWlmICghIG1hc3RlckZpbGUuaXNEaXJlY3RvcnkoKSkgbWFzdGVyRmlsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3JlaWduIG1ldGhvZDogcmVtb3ZlcyBhbGwgY2hpbGRyZW4gb2YgYSBUcmVlSXRlbS4KLQkgKiBAcGFyYW0gdHJlZUl0ZW0gdGhlIFRyZWVJdGVtCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmVlSXRlbVJlbW92ZUFsbChUcmVlSXRlbSB0cmVlSXRlbSkgewotCQlmaW5hbCBUcmVlSXRlbVtdIGNoaWxkcmVuID0gdHJlZUl0ZW0uZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgYSBmb2xkZXIgaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gaXRlbSB0aGUgVHJlZUl0ZW0gdG8gaW5pdGlhbGl6ZQotCSAqIEBwYXJhbSBmb2xkZXIgdGhlIEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVHJlZUl0ZW0KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJlZUluaXRGb2xkZXIoVHJlZUl0ZW0gaXRlbSwgRmlsZSBmb2xkZXIpIHsKLQkJaXRlbS5zZXRUZXh0KGZvbGRlci5nZXROYW1lKCkpOwotCQlpdGVtLnNldEltYWdlKGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkNsb3NlZEZvbGRlcl0pOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0ZJTEUsIGZvbGRlcik7Ci0JCWl0ZW0uc2V0RGF0YShUUkVFSVRFTURBVEFfSU1BR0VFWFBBTkRFRCwgaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uT3BlbkZvbGRlcl0pOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFQ09MTEFQU0VELCBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25DbG9zZWRGb2xkZXJdKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBhIHZvbHVtZSBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBpdGVtIHRoZSBUcmVlSXRlbSB0byBpbml0aWFsaXplCi0JICogQHBhcmFtIHZvbHVtZSB0aGUgRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBUcmVlSXRlbQotCSAqLwotCXByaXZhdGUgdm9pZCB0cmVlSW5pdFZvbHVtZShUcmVlSXRlbSBpdGVtLCBGaWxlIHZvbHVtZSkgewotCQlpdGVtLnNldFRleHQodm9sdW1lLmdldFBhdGgoKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaWNvbkNhY2hlLnN0b2NrSW1hZ2VzW2ljb25DYWNoZS5pY29uQ2xvc2VkRHJpdmVdKTsKLQkJaXRlbS5zZXREYXRhKFRSRUVJVEVNREFUQV9GSUxFLCB2b2x1bWUpOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFRVhQQU5ERUQsIGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbk9wZW5Ecml2ZV0pOwotCQlpdGVtLnNldERhdGEoVFJFRUlURU1EQVRBX0lNQUdFQ09MTEFQU0VELCBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25DbG9zZWREcml2ZV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGZpbGUgZGV0YWlscyB0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZVZpZXcoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJdGFibGVDb250ZW50c09mTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGFibGVDb250ZW50c09mTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCi0JCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlVGl0bGVzLmxlbmd0aDsgKytpKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCWNvbHVtbi5zZXRUZXh0KHRhYmxlVGl0bGVzW2ldKTsKLQkJCWNvbHVtbi5zZXRXaWR0aCh0YWJsZVdpZHRoc1tpXSk7Ci0JCX0KLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW5vdGlmeVNlbGVjdGVkRmlsZXMoZ2V0U2VsZWN0ZWRGaWxlcygpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWRvRGVmYXVsdEZpbGVBY3Rpb24oZ2V0U2VsZWN0ZWRGaWxlcygpKTsKLQkJCX0KLQkJCXByaXZhdGUgRmlsZVtdIGdldFNlbGVjdGVkRmlsZXMoKSB7Ci0JCQkJZmluYWwgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlmaW5hbCBGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVtpdGVtcy5sZW5ndGhdOwotCQkJCQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKLQkJCQkJZmlsZXNbaV0gPSAoRmlsZSkgaXRlbXNbaV0uZ2V0RGF0YShUQUJMRUlURU1EQVRBX0ZJTEUpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmlsZXM7Ci0JCQl9Ci0JCX0pOwotCi0JCWNyZWF0ZVRhYmxlRHJhZ1NvdXJjZSh0YWJsZSk7Ci0JCWNyZWF0ZVRhYmxlRHJvcFRhcmdldCh0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRHJhZyAmIERyb3AgRHJhZ1NvdXJjZSBmb3IgaXRlbXMgYmVpbmcgZHJhZ2dlZCBmcm9tIHRoZSB0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEcmFnU291cmNlIGZvciB0aGUgdGFibGUKLQkgKi8KLQlwcml2YXRlIERyYWdTb3VyY2UgY3JlYXRlVGFibGVEcmFnU291cmNlKGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0JCURyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRhYmxlLCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSk7Ci0JCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJZHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQkJCVRhYmxlSXRlbVtdIGRuZFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlTdHJpbmdbXSBzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KXsKLQkJCQlkbmRTZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlzb3VyY2VOYW1lcyA9IG51bGw7Ci0JCQkJZXZlbnQuZG9pdCA9IGRuZFNlbGVjdGlvbi5sZW5ndGggPiAwOwotCQkJCWlzRHJhZ2dpbmcgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJZHJhZ1NvdXJjZUhhbmRsZURyYWdGaW5pc2hlZChldmVudCwgc291cmNlTmFtZXMpOwotCQkJCWRuZFNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJc291cmNlTmFtZXMgPSBudWxsOwotCQkJCWlzRHJhZ2dpbmcgPSBmYWxzZTsKLQkJCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCl7Ci0JCQkJaWYgKGRuZFNlbGVjdGlvbiA9PSBudWxsIHx8IGRuZFNlbGVjdGlvbi5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkJCWlmICghIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHJldHVybjsKLQkJCQkKLQkJCQlzb3VyY2VOYW1lcyAgPSBuZXcgU3RyaW5nW2RuZFNlbGVjdGlvbi5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZG5kU2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBkbmRTZWxlY3Rpb25baV0uZ2V0RGF0YShUQUJMRUlURU1EQVRBX0ZJTEUpOwotCQkJCQlzb3VyY2VOYW1lc1tpXSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfQotCQkJCWV2ZW50LmRhdGEgPSBzb3VyY2VOYW1lczsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBkcmFnU291cmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIERyYWcgJiBEcm9wIERyb3BUYXJnZXQgZm9yIGl0ZW1zIGJlaW5nIGRyb3BwZWQgb250byB0aGUgdGFibGUuCi0JICogCi0JICogQHJldHVybiB0aGUgRHJvcFRhcmdldCBmb3IgdGhlIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBEcm9wVGFyZ2V0IGNyZWF0ZVRhYmxlRHJvcFRhcmdldChmaW5hbCBUYWJsZSB0YWJsZSl7Ci0JCURyb3BUYXJnZXQgZHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRhYmxlLCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSk7Ci0JCWRyb3BUYXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJZHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlzRHJvcHBpbmcgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlzRHJvcHBpbmcgPSBmYWxzZTsKLQkJCQloYW5kbGVEZWZlcnJlZFJlZnJlc2goKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWRyb3BUYXJnZXRWYWxpZGF0ZShldmVudCwgZ2V0VGFyZ2V0RmlsZShldmVudCkpOwotCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJfQotCQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPSBnZXRUYXJnZXRGaWxlKGV2ZW50KTsKLQkJCQlpZiAoZHJvcFRhcmdldFZhbGlkYXRlKGV2ZW50LCB0YXJnZXRGaWxlKSkKLQkJCQkJZHJvcFRhcmdldEhhbmRsZURyb3AoZXZlbnQsIHRhcmdldEZpbGUpOwotCQkJfQotCQkJcHJpdmF0ZSBGaWxlIGdldFRhcmdldEZpbGUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gRGV0ZXJtaW5lIHRoZSB0YXJnZXQgRmlsZSBmb3IgdGhlIGRyb3AgCi0JCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtKHRhYmxlLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpKTsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPSBudWxsOwotCQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQkJLy8gV2UgYXJlIG92ZXIgYW4gdW5vY2N1cGllZCBhcmVhIG9mIHRoZSB0YWJsZS4KLQkJCQkJLy8gSWYgaXQgaXMgYSBDT1BZLCB3ZSBjYW4gdXNlIHRoZSB0YWJsZSdzIHJvb3QgZmlsZS4KLQkJCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9DT1BZKSB7Ci0JCQkJCQl0YXJnZXRGaWxlID0gKEZpbGUpIHRhYmxlLmdldERhdGEoVEFCTEVEQVRBX0RJUik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBXZSBhcmUgb3ZlciBhIHBhcnRpY3VsYXIgaXRlbSBpbiB0aGUgdGFibGUsIHVzZSB0aGUgaXRlbSdzIGZpbGUKLQkJCQkJdGFyZ2V0RmlsZSA9IChGaWxlKSBpdGVtLmdldERhdGEoVEFCTEVJVEVNREFUQV9GSUxFKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRhcmdldEZpbGU7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZHJvcFRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50cyB0aGF0IGEgbmV3IGN1cnJlbnQgZGlyZWN0b3J5IGhhcyBiZWVuIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIGRpciB0aGUgZGlyZWN0b3J5IHRoYXQgd2FzIHNlbGVjdGVkLCBudWxsIGlzIGlnbm9yZWQKLQkgKi8KLQl2b2lkIG5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KEZpbGUgZGlyKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoY3VycmVudERpcmVjdG9yeSAhPSBudWxsICYmIGRpci5lcXVhbHMoY3VycmVudERpcmVjdG9yeSkpIHJldHVybjsKLQkJY3VycmVudERpcmVjdG9yeSA9IGRpcjsKLQkJbm90aWZ5U2VsZWN0ZWRGaWxlcyhudWxsKTsKLQkJCi0JCS8qIFNoZWxsOgotCQkgKiBTZXRzIHRoZSB0aXRsZSB0byBpbmRpY2F0ZSB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5Ci0JCSAqLwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJUaXRsZSIsIG5ldyBPYmplY3RbXSB7IGN1cnJlbnREaXJlY3RvcnkuZ2V0UGF0aCgpIH0pKTsKLQotCQkvKiBUYWJsZSB2aWV3OgotCQkgKiBEaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIHNlbGVjdGVkIGRpcmVjdG9yeS4KLQkJICovCi0JCXdvcmtlclVwZGF0ZShkaXIsIGZhbHNlKTsKLQotCQkvKiBDb21ibyB2aWV3OgotCQkgKiBTZXRzIHRoZSBjb21ibyBib3ggdG8gcG9pbnQgdG8gdGhlIHNlbGVjdGVkIGRpcmVjdG9yeS4KLQkJICovCi0JCWZpbmFsIEZpbGVbXSBjb21ib1Jvb3RzID0gKEZpbGVbXSkgY29tYm8uZ2V0RGF0YShDT01CT0RBVEFfUk9PVFMpOwotCQlpbnQgY29tYm9FbnRyeSA9IC0xOwotCQlpZiAoY29tYm9Sb290cyAhPSBudWxsKSB7CQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tYm9Sb290cy5sZW5ndGg7ICsraSkgewotCQkJCWlmIChkaXIuZXF1YWxzKGNvbWJvUm9vdHNbaV0pKSB7Ci0JCQkJCWNvbWJvRW50cnkgPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbWJvRW50cnkgPT0gLTEpIGNvbWJvLnNldFRleHQoZGlyLmdldFBhdGgoKSk7Ci0JCWVsc2UgY29tYm8uc2VsZWN0KGNvbWJvRW50cnkpOwotCi0JCS8qIFRyZWUgdmlldzoKLQkJICogSWYgbm90IGFscmVhZHkgZXhwYW5kZWQsIHJlY3Vyc2l2ZWx5IGV4cGFuZHMgdGhlIHBhcmVudHMgb2YgdGhlIHNwZWNpZmllZAotCQkgKiBkaXJlY3RvcnkgdW50aWwgaXQgaXMgdmlzaWJsZS4KLQkJICovCi0JCVZlY3RvciAvKiBvZiBGaWxlICovIHBhdGggPSBuZXcgVmVjdG9yKCk7Ci0JCS8vIEJ1aWxkIGEgc3RhY2sgb2YgcGF0aHMgZnJvbSB0aGUgcm9vdCBvZiB0aGUgdHJlZQotCQl3aGlsZSAoZGlyICE9IG51bGwpIHsKLQkJCXBhdGguYWRkKGRpcik7Ci0JCQlkaXIgPSBkaXIuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCS8vIFJlY3Vyc2l2ZWx5IGV4cGFuZCB0aGUgdHJlZSB0byBnZXQgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJVHJlZUl0ZW0gbGFzdEl0ZW0gPSBudWxsOwotCQlmb3IgKGludCBpID0gcGF0aC5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotCQkJZmluYWwgRmlsZSBwYXRoRWxlbWVudCA9IChGaWxlKSBwYXRoLmVsZW1lbnRBdChpKTsKLQotCQkJLy8gU2VhcmNoIGZvciBhIHBhcnRpY3VsYXIgRmlsZSBpbiB0aGUgYXJyYXkgb2YgdHJlZSBpdGVtcwotCQkJLy8gTm8gZ3VhcmFudGVlIHRoYXQgdGhlIGl0ZW1zIGFyZSBzb3J0ZWQgaW4gYW55IHJlY29nbml6YWJsZSBmYXNoaW9uLCBzbyB3ZSdsbAotCQkJLy8ganVzdCBzZXF1ZW50aWFsIHNjYW4uICBUaGVyZSBzaG91bGRuJ3QgYmUgbW9yZSB0aGFuIGEgZmV3IHRob3VzYW5kIGVudHJpZXMuCi0JCQlUcmVlSXRlbSBpdGVtID0gbnVsbDsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaXRlbXMubGVuZ3RoOyArK2spIHsKLQkJCQlpdGVtID0gaXRlbXNba107Ci0JCQkJaWYgKGl0ZW0uaXNEaXNwb3NlZCgpKSBjb250aW51ZTsKLQkJCQlmaW5hbCBGaWxlIGl0ZW1GaWxlID0gKEZpbGUpIGl0ZW0uZ2V0RGF0YShUUkVFSVRFTURBVEFfRklMRSk7Ci0JCQkJaWYgKGl0ZW1GaWxlICE9IG51bGwgJiYgaXRlbUZpbGUuZXF1YWxzKHBhdGhFbGVtZW50KSkgYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSBicmVhazsKLQkJCWxhc3RJdGVtID0gaXRlbTsKLQkJCWlmIChpICE9IDAgJiYgIWl0ZW0uZ2V0RXhwYW5kZWQoKSkgewotCQkJCXRyZWVFeHBhbmRJdGVtKGl0ZW0pOwotCQkJCWl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlpdGVtcyA9IGl0ZW0uZ2V0SXRlbXMoKTsKLQkJfQotCQl0cmVlLnNldFNlbGVjdGlvbigobGFzdEl0ZW0gIT0gbnVsbCkgPyBuZXcgVHJlZUl0ZW1bXSB7IGxhc3RJdGVtIH0gOiBuZXcgVHJlZUl0ZW1bMF0pOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50cyB0aGF0IGZpbGVzIGhhdmUgYmVlbiBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBmaWxlcyB0aGUgZmlsZXMgdGhhdCB3ZXJlIHNlbGVjdGVkLCBudWxsIG9yIGVtcHR5IGFycmF5IGluZGljYXRlcyBubyBhY3RpdmUgc2VsZWN0aW9uCi0JICovCi0Jdm9pZCBub3RpZnlTZWxlY3RlZEZpbGVzKEZpbGVbXSBmaWxlcykgewotCQkvKiBEZXRhaWxzOgotCQkgKiBVcGRhdGUgdGhlIGRldGFpbHMgdGhhdCBhcmUgdmlzaWJsZSBvbiBzY3JlZW4uCi0JCSAqLwotCQlpZiAoKGZpbGVzICE9IG51bGwpICYmIChmaWxlcy5sZW5ndGggIT0gMCkpIHsKLQkJCW51bU9iamVjdHNMYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkZXRhaWxzLk51bWJlck9mU2VsZWN0ZWRGaWxlcy50ZXh0IiwKLQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihmaWxlcy5sZW5ndGgpIH0pKTsKLQkJCWxvbmcgZmlsZVNpemUgPSAwTDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaWxlU2l6ZSArPSBmaWxlc1tpXS5sZW5ndGgoKTsKLQkJCX0KLQkJCWRpc2tTcGFjZUxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoImRldGFpbHMuRmlsZVNpemUudGV4dCIsCi0JCQkJbmV3IE9iamVjdFtdIHsgbmV3IExvbmcoZmlsZVNpemUpIH0pKTsKLQkJfSBlbHNlIHsKLQkJCS8vIE5vIGZpbGVzIHNlbGVjdGVkCi0JCQlkaXNrU3BhY2VMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCWlmIChjdXJyZW50RGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCQlpbnQgbnVtT2JqZWN0cyA9IGdldERpcmVjdG9yeUxpc3QoY3VycmVudERpcmVjdG9yeSkubGVuZ3RoOwotCQkJCW51bU9iamVjdHNMYWJlbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJkZXRhaWxzLkRpck51bWJlck9mT2JqZWN0cy50ZXh0IiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIobnVtT2JqZWN0cykgfSkpOwotCQkJfSBlbHNlIHsKLQkJCQludW1PYmplY3RzTGFiZWwuc2V0VGV4dCgiIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50cyB0aGF0IGZpbGVzIG11c3QgYmUgcmVmcmVzaGVkCi0JICogCi0JICogQHBhcmFtIGZpbGVzIHRoZSBmaWxlcyB0aGF0IG5lZWQgcmVmcmVzaGluZywgZW1wdHkgYXJyYXkgaXMgYSBuby1vcCwgbnVsbCByZWZyZXNoZXMgYWxsCi0JICovCi0Jdm9pZCBub3RpZnlSZWZyZXNoRmlsZXMoRmlsZVtdIGZpbGVzKSB7Ci0JCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0KLQkJaWYgKChkZWZlcnJlZFJlZnJlc2hSZXF1ZXN0ZWQpICYmIChkZWZlcnJlZFJlZnJlc2hGaWxlcyAhPSBudWxsKSAmJiAoZmlsZXMgIT0gbnVsbCkpIHsKLQkJCS8vIG1lcmdlIHJlcXVlc3RzCi0JCQlGaWxlW10gbmV3UmVxdWVzdCA9IG5ldyBGaWxlW2RlZmVycmVkUmVmcmVzaEZpbGVzLmxlbmd0aCArIGZpbGVzLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRlZmVycmVkUmVmcmVzaEZpbGVzLCAwLCBuZXdSZXF1ZXN0LCAwLCBkZWZlcnJlZFJlZnJlc2hGaWxlcy5sZW5ndGgpOwotCQkJU3lzdGVtLmFycmF5Y29weShmaWxlcywgMCwgbmV3UmVxdWVzdCwgZGVmZXJyZWRSZWZyZXNoRmlsZXMubGVuZ3RoLCBmaWxlcy5sZW5ndGgpOwotCQkJZGVmZXJyZWRSZWZyZXNoRmlsZXMgPSBuZXdSZXF1ZXN0OwotCQl9IGVsc2UgewotCQkJZGVmZXJyZWRSZWZyZXNoRmlsZXMgPSBmaWxlczsKLQkJCWRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCA9IHRydWU7Ci0JCX0KLQkJaGFuZGxlRGVmZXJyZWRSZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBkZWZlcnJlZCBSZWZyZXNoIG5vdGlmaWNhdGlvbnMgKGR1ZSB0byBEcmFnICYgRHJvcCkKLQkgKi8KLQl2b2lkIGhhbmRsZURlZmVycmVkUmVmcmVzaCgpIHsKLQkJaWYgKGlzRHJhZ2dpbmcgfHwgaXNEcm9wcGluZyB8fCAhIGRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCkgcmV0dXJuOwotCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NEaWFsb2cuY2xvc2UoKTsKLQkJCXByb2dyZXNzRGlhbG9nID0gbnVsbDsKLQkJfQotCi0JCWRlZmVycmVkUmVmcmVzaFJlcXVlc3RlZCA9IGZhbHNlOwotCQlGaWxlW10gZmlsZXMgPSBkZWZlcnJlZFJlZnJlc2hGaWxlczsKLQkJZGVmZXJyZWRSZWZyZXNoRmlsZXMgPSBudWxsOwotCi0JCXNoZWxsLnNldEN1cnNvcihpY29uQ2FjaGUuc3RvY2tDdXJzb3JzW2ljb25DYWNoZS5jdXJzb3JXYWl0XSk7Ci0KLQkJLyogVGFibGUgdmlldzoKLQkJICogUmVmcmVzaGVzIGluZm9ybWF0aW9uIGFib3V0IGFueSBmaWxlcyBpbiB0aGUgbGlzdCBhbmQgdGhlaXIgY2hpbGRyZW4uCi0JCSAqLwotCQlib29sZWFuIHJlZnJlc2hUYWJsZSA9IGZhbHNlOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIEZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJCWlmIChmaWxlLmVxdWFscyhjdXJyZW50RGlyZWN0b3J5KSkgewotCQkJCQlyZWZyZXNoVGFibGUgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJRmlsZSBwYXJlbnRGaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaWYgKChwYXJlbnRGaWxlICE9IG51bGwpICYmIChwYXJlbnRGaWxlLmVxdWFscyhjdXJyZW50RGlyZWN0b3J5KSkpIHsKLQkJCQkJcmVmcmVzaFRhYmxlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgcmVmcmVzaFRhYmxlID0gdHJ1ZTsKLQkJaWYgKHJlZnJlc2hUYWJsZSkgd29ya2VyVXBkYXRlKGN1cnJlbnREaXJlY3RvcnksIHRydWUpOwotCi0JCS8qIENvbWJvIHZpZXc6Ci0JCSAqIFJlZnJlc2hlcyB0aGUgbGlzdCBvZiByb290cwotCQkgKi8KLQkJZmluYWwgRmlsZVtdIHJvb3RzID0gZ2V0Um9vdHMoKTsKLQotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJYm9vbGVhbiByZWZyZXNoQ29tYm8gPSBmYWxzZTsKLQkJCWZpbmFsIEZpbGVbXSBjb21ib1Jvb3RzID0gKEZpbGVbXSkgY29tYm8uZ2V0RGF0YShDT01CT0RBVEFfUk9PVFMpOwotCQkKLQkJCWlmICgoY29tYm9Sb290cyAhPSBudWxsKSAmJiAoY29tYm9Sb290cy5sZW5ndGggPT0gcm9vdHMubGVuZ3RoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJaWYgKCEgcm9vdHNbaV0uZXF1YWxzKGNvbWJvUm9vdHNbaV0pKSB7Ci0JCQkJCQlyZWZyZXNoQ29tYm8gPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgcmVmcmVzaENvbWJvID0gdHJ1ZTsKLQotCQkJaWYgKHJlZnJlc2hDb21ibykgewotCQkJCWNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCWNvbWJvLnNldERhdGEoQ09NQk9EQVRBX1JPT1RTLCByb290cyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7ICsraSkgewotCQkJCQlmaW5hbCBGaWxlIGZpbGUgPSByb290c1tpXTsKLQkJCQkJY29tYm8uYWRkKGZpbGUuZ2V0UGF0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKiBUcmVlIHZpZXc6Ci0JCSAqIFJlZnJlc2hlcyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgZmlsZXMgaW4gdGhlIGxpc3QgYW5kIHRoZWlyIGNoaWxkcmVuLgotCQkgKi8KLQkJdHJlZVJlZnJlc2gocm9vdHMpOwotCQkKLQkJLy8gUmVtaW5kIGV2ZXJ5b25lIHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZXN5c3RlbQotCQlmaW5hbCBGaWxlIGRpciA9IGN1cnJlbnREaXJlY3Rvcnk7Ci0JCWN1cnJlbnREaXJlY3RvcnkgPSBudWxsOwotCQlub3RpZnlTZWxlY3RlZERpcmVjdG9yeShkaXIpOwotCi0JCXNoZWxsLnNldEN1cnNvcihpY29uQ2FjaGUuc3RvY2tDdXJzb3JzW2ljb25DYWNoZS5jdXJzb3JEZWZhdWx0XSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGRlZmF1bHQgYWN0aW9uIG9uIGEgc2V0IG9mIGZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlcyB0aGUgYXJyYXkgb2YgZmlsZXMgdG8gcHJvY2VzcwotCSAqLwotCXZvaWQgZG9EZWZhdWx0RmlsZUFjdGlvbihGaWxlW10gZmlsZXMpIHsKLQkJLy8gb25seSB1c2VzIHRoZSAxc3QgZmlsZSAoZm9yIG5vdykKLQkJaWYgKGZpbGVzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCWZpbmFsIEZpbGUgZmlsZSA9IGZpbGVzWzBdOwotCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KGZpbGUpOwotCQl9IGVsc2UgewotCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCWlmICghIFByb2dyYW0ubGF1bmNoKGZpbGVOYW1lKSkgewkKLQkJCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUiB8IFNXVC5PSyk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkZhaWxlZExhdW5jaC5tZXNzYWdlIiwgbmV3IE9iamVjdFtdIHsgZmlsZU5hbWUgfSkpOwotCQkJCWRpYWxvZy5zZXRUZXh0KHNoZWxsLmdldFRleHQgKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOYXZpZ2F0ZXMgdG8gdGhlIHBhcmVudCBkaXJlY3RvcnkKLQkgKi8KLQl2b2lkIGRvUGFyZW50KCkgewotCQlpZiAoY3VycmVudERpcmVjdG9yeSA9PSBudWxsKSByZXR1cm47Ci0JCUZpbGUgcGFyZW50RGlyZWN0b3J5ID0gY3VycmVudERpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCk7Ci0JCW5vdGlmeVNlbGVjdGVkRGlyZWN0b3J5KHBhcmVudERpcmVjdG9yeSk7Ci0JfQotCSAKLQkvKioKLQkgKiBQZXJmb3JtcyBhIHJlZnJlc2gKLQkgKi8KLQl2b2lkIGRvUmVmcmVzaCgpIHsKLQkJbm90aWZ5UmVmcmVzaEZpbGVzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIGRyb3AgdGFyZ2V0IGFzIGEgY2FuZGlkYXRlIGZvciBhIGRyb3Agb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIFVzZWQgaW4gZHJhZ092ZXIoKSBhbmQgZHJvcEFjY2VwdCgpLjxicj4KLQkgKiBOb3RlIGV2ZW50LmRldGFpbCBpcyBzZXQgdG8gRE5ELkRST1BfTk9ORSBieSB0aGlzIG1ldGhvZCBpZiB0aGUgdGFyZ2V0IGlzIG5vdCB2YWxpZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGV2ZW50IHRoZSBEcm9wVGFyZ2V0RXZlbnQgdG8gdmFsaWRhdGUKLQkgKiBAcGFyYW0gdGFyZ2V0RmlsZSB0aGUgRmlsZSByZXByZXNlbnRpbmcgdGhlIGRyb3AgdGFyZ2V0IGxvY2F0aW9uCi0JICogICAgICAgIHVuZGVyIGluc3BlY3Rpb24sIG9yIG51bGwgaWYgbm9uZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkcm9wVGFyZ2V0VmFsaWRhdGUoRHJvcFRhcmdldEV2ZW50IGV2ZW50LCBGaWxlIHRhcmdldEZpbGUpIHsKLQkJaWYgKHRhcmdldEZpbGUgIT0gbnVsbCAmJiB0YXJnZXRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfQ09QWSAmJiBldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTU9WRSkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX01PVkU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQl9Ci0JCXJldHVybiBldmVudC5kZXRhaWwgIT0gRE5ELkRST1BfTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgZHJvcCBvbiBhIGRyb3BUYXJnZXQuCi0JICogPHA+Ci0JICogVXNlZCBpbiBkcm9wKCkuPGJyPgotCSAqIE5vdGUgZXZlbnQuZGV0YWlsIGlzIG1vZGlmaWVkIGJ5IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gZXZlbnQgdGhlIERyb3BUYXJnZXRFdmVudCBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZSBkcm9wKCkgbWV0aG9kCi0JICogQHBhcmFtIHRhcmdldEZpbGUgdGhlIEZpbGUgcmVwcmVzZW50aW5nIHRoZSBkcm9wIHRhcmdldCBsb2NhdGlvbgotCSAqICAgICAgICB1bmRlciBpbnNwZWN0aW9uLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZHJvcFRhcmdldEhhbmRsZURyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50LCBGaWxlIHRhcmdldEZpbGUpIHsKLQkJLy8gR2V0IGRyb3BwZWQgZGF0YSAoYW4gYXJyYXkgb2YgZmlsZW5hbWVzKQotCQlpZiAoISBkcm9wVGFyZ2V0VmFsaWRhdGUoZXZlbnQsIHRhcmdldEZpbGUpKSByZXR1cm47Ci0JCWZpbmFsIFN0cmluZ1tdIHNvdXJjZU5hbWVzID0gKFN0cmluZ1tdKSBldmVudC5kYXRhOwotCQlpZiAoc291cmNlTmFtZXMgPT0gbnVsbCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9OT05FKSByZXR1cm47Ci0KLQkJLy8gT3BlbiBwcm9ncmVzcyBkaWFsb2cKLQkJcHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coc2hlbGwsCi0JCQkoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpID8gUHJvZ3Jlc3NEaWFsb2cuTU9WRSA6IFByb2dyZXNzRGlhbG9nLkNPUFkpOwotCQlwcm9ncmVzc0RpYWxvZy5zZXRUb3RhbFdvcmtVbml0cyhzb3VyY2VOYW1lcy5sZW5ndGgpOwotCQlwcm9ncmVzc0RpYWxvZy5vcGVuKCk7Ci0KLQkJLy8gQ29weSBlYWNoIGZpbGUKLQkJVmVjdG9yIC8qIG9mIEZpbGUgKi8gcHJvY2Vzc2VkRmlsZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHNvdXJjZU5hbWVzLmxlbmd0aCkgJiYgKCEgcHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSk7IGkrKyl7Ci0JCQlmaW5hbCBGaWxlIHNvdXJjZSA9IG5ldyBGaWxlKHNvdXJjZU5hbWVzW2ldKTsKLQkJCWZpbmFsIEZpbGUgZGVzdCA9IG5ldyBGaWxlKHRhcmdldEZpbGUsIHNvdXJjZS5nZXROYW1lKCkpOwotCQkJaWYgKHNvdXJjZS5lcXVhbHMoZGVzdCkpIGNvbnRpbnVlOyAvLyBpZ25vcmUgaWYgaW4gc2FtZSBsb2NhdGlvbgotCi0JCQlwcm9ncmVzc0RpYWxvZy5zZXREZXRhaWxGaWxlKHNvdXJjZSwgUHJvZ3Jlc3NEaWFsb2cuQ09QWSk7Ci0JCQl3aGlsZSAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJaWYgKGNvcHlGaWxlU3RydWN0dXJlKHNvdXJjZSwgZGVzdCkpIHsKLQkJCQkJcHJvY2Vzc2VkRmlsZXMuYWRkKHNvdXJjZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSAmJiAoIWlzRHJhZ2dpbmcpKSB7Ci0JCQkJCQkvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gbm90aWZ5IGFuIGV4dGVybmFsIGRyYWcgc291cmNlIHRoYXQgYSBkcm9wCi0JCQkJCQkvLyBvcGVyYXRpb24gd2FzIG9ubHkgcGFydGlhbGx5IHN1Y2Nlc3NmdWwuICBUaGlzIGlzIHBhcnRpY3VsYXJseSBhCi0JCQkJCQkvLyBwcm9ibGVtIGZvciBEUk9QX01PVkUgb3BlcmF0aW9ucyBzaW5jZSB1bmxlc3MgdGhlIHNvdXJjZSBnZXRzCi0JCQkJCQkvLyBEUk9QX05PTkUsIGl0IHdpbGwgZGVsZXRlIHRoZSBvcmlnaW5hbCBkYXRhIGluY2x1ZGluZyBiaXRzIHRoYXQKLQkJCQkJCS8vIG1heSBub3QgaGF2ZSBiZWVuIHRyYW5zZmVycmVkIHN1Y2Nlc3NmdWxseS4KLQkJCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SIHwgU1dULlJFVFJZIHwgU1dULkNBTkNFTCk7Ci0JCQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZENvcHkudGl0bGUiKSk7Ci0JCQkJCQlib3guc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZENvcHkuZGVzY3JpcHRpb24iLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHNvdXJjZSwgZGVzdCB9KSk7Ci0JCQkJCQlpbnQgYnV0dG9uID0gYm94Lm9wZW4oKTsKLQkJCQkJCWlmIChidXR0b24gPT0gU1dULkNBTkNFTCkgewotCQkJCQkJCWkgPSBzb3VyY2VOYW1lcy5sZW5ndGg7Ci0JCQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFdlIGNhbiByZWNvdmVyIGdyYWNlZnVsbHkgZnJvbSBlcnJvcnMgaWYgdGhlIGRyYWcgc291cmNlIGJlbG9uZ3MKLQkJCQkJCS8vIHRvIHRoaXMgYXBwbGljYXRpb24gc2luY2UgaXQgd2lsbCBsb29rIGF0IHByb2Nlc3NlZERyb3BGaWxlcy4KLQkJCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SIHwgU1dULkFCT1JUIHwgU1dULlJFVFJZIHwgU1dULklHTk9SRSk7Ci0JCQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZENvcHkudGl0bGUiKSk7Ci0JCQkJCQlib3guc2V0TWVzc2FnZShnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZENvcHkuZGVzY3JpcHRpb24iLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHNvdXJjZSwgZGVzdCB9KSk7Ci0JCQkJCQlpbnQgYnV0dG9uID0gYm94Lm9wZW4oKTsKLQkJCQkJCWlmIChidXR0b24gPT0gU1dULkFCT1JUKSBpID0gc291cmNlTmFtZXMubGVuZ3RoOwotCQkJCQkJaWYgKGJ1dHRvbiAhPSBTV1QuUkVUUlkpIGJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCXByb2dyZXNzRGlhbG9nLmFkZFByb2dyZXNzKDEpOwotCQkJfQotCQl9Ci0JCWlmIChpc0RyYWdnaW5nKSB7Ci0JCQkvLyBSZW1lbWJlciBleGFjdGx5IHdoaWNoIGZpbGVzIHdlIHByb2Nlc3NlZAotCQkJcHJvY2Vzc2VkRHJvcEZpbGVzID0gKChGaWxlW10pIHByb2Nlc3NlZEZpbGVzLnRvQXJyYXkobmV3IEZpbGVbcHJvY2Vzc2VkRmlsZXMuc2l6ZSgpXSkpOwotCQl9IGVsc2UgewotCQkJcHJvZ3Jlc3NEaWFsb2cuY2xvc2UoKTsKLQkJCXByb2dyZXNzRGlhbG9nID0gbnVsbDsKLQkJfQotCQlub3RpZnlSZWZyZXNoRmlsZXMobmV3IEZpbGVbXSB7IHRhcmdldEZpbGUgfSk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgY29tcGxldGlvbiBvZiBhIGRyYWcgb24gYSBkcmFnU291cmNlLgotCSAqIDxwPgotCSAqIFVzZWQgaW4gZHJhZ0ZpbmlzaGVkKCkuPGJyPgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gZXZlbnQgdGhlIERyYWdTb3VyY2VFdmVudCBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZSBkcmFnRmluaXNoZWQoKSBtZXRob2QKLQkgKiBAcGFyYW0gc291cmNlTmFtZXMgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IHdlcmUgZHJhZ2dlZCAoZXZlbnQuZGF0YSBpcyBpbnZhbGlkKQotCSAqLwotCXByaXZhdGUgdm9pZCBkcmFnU291cmNlSGFuZGxlRHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCwgU3RyaW5nW10gc291cmNlTmFtZXMpIHsKLQkJaWYgKHNvdXJjZU5hbWVzID09IG51bGwpIHJldHVybjsKLQkJaWYgKGV2ZW50LmRldGFpbCAhPSBETkQuRFJPUF9NT1ZFKSByZXR1cm47Ci0KLQkJLy8gR2V0IGFycmF5IG9mIGZpbGVzIHRoYXQgd2VyZSBhY3R1YWxseSB0cmFuc2ZlcnJlZAotCQlmaW5hbCBGaWxlW10gc291cmNlRmlsZXM7Ci0JCWlmIChwcm9jZXNzZWREcm9wRmlsZXMgIT0gbnVsbCkgewotCQkJc291cmNlRmlsZXMgPSBwcm9jZXNzZWREcm9wRmlsZXM7Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2VGaWxlcyA9IG5ldyBGaWxlW3NvdXJjZU5hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZU5hbWVzLmxlbmd0aDsgKytpKQotCQkJCXNvdXJjZUZpbGVzW2ldID0gbmV3IEZpbGUoc291cmNlTmFtZXNbaV0pOwotCQl9CQotCQlpZiAocHJvZ3Jlc3NEaWFsb2cgPT0gbnVsbCkKLQkJCXByb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKHNoZWxsLCBQcm9ncmVzc0RpYWxvZy5NT1ZFKTsKLQkJcHJvZ3Jlc3NEaWFsb2cuc2V0VG90YWxXb3JrVW5pdHMoc291cmNlRmlsZXMubGVuZ3RoKTsKLQkJcHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3MoMCk7Ci0JCXByb2dyZXNzRGlhbG9nLm9wZW4oKTsKLQotCQkvLyBEZWxldGUgZWFjaCBmaWxlCi0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHNvdXJjZUZpbGVzLmxlbmd0aCkgJiYgKCEgcHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSk7IGkrKyl7Ci0JCQlmaW5hbCBGaWxlIHNvdXJjZSA9IHNvdXJjZUZpbGVzW2ldOwotCQkJcHJvZ3Jlc3NEaWFsb2cuc2V0RGV0YWlsRmlsZShzb3VyY2UsIFByb2dyZXNzRGlhbG9nLkRFTEVURSk7Ci0JCQl3aGlsZSAoISBwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJaWYgKGRlbGV0ZUZpbGVTdHJ1Y3R1cmUoc291cmNlKSkgewotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKCEgcHJvZ3Jlc3NEaWFsb2cuaXNDYW5jZWxsZWQoKSkgewotCQkJCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUiB8IFNXVC5BQk9SVCB8IFNXVC5SRVRSWSB8IFNXVC5JR05PUkUpOwotCQkJCQlib3guc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiZGlhbG9nLkZhaWxlZERlbGV0ZS50aXRsZSIpKTsKLQkJCQkJYm94LnNldE1lc3NhZ2UoZ2V0UmVzb3VyY2VTdHJpbmcoImRpYWxvZy5GYWlsZWREZWxldGUuZGVzY3JpcHRpb24iLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgc291cmNlIH0pKTsKLQkJCQkJaW50IGJ1dHRvbiA9IGJveC5vcGVuKCk7Ci0JCQkJCWlmIChidXR0b24gPT0gU1dULkFCT1JUKSBpID0gc291cmNlTmFtZXMubGVuZ3RoOwotCQkJCQlpZiAoYnV0dG9uID09IFNXVC5SRVRSWSkgYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkUHJvZ3Jlc3MoMSk7Ci0JCX0KLQkJbm90aWZ5UmVmcmVzaEZpbGVzKHNvdXJjZUZpbGVzKTsKLQkJcHJvZ3Jlc3NEaWFsb2cuY2xvc2UoKTsKLQkJcHJvZ3Jlc3NEaWFsb2cgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgZmlsZXN5c3RlbSByb290IGVudHJpZXMKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIEZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJvb3QgZGlyZWN0b3JpZXMgb24gdGhlIHBsYXRmb3JtLAotCSAqICAgICAgICAgbWF5IGJlIGVtcHR5IGJ1dCBub3QgbnVsbAotCSAqLwotCUZpbGVbXSBnZXRSb290cygpIHsKLQkJLyoKLQkJICogT24gSkRLIDEuMjIgb25seS4uLgotCQkgKi8KLQkJLy8gcmV0dXJuIEZpbGUubGlzdFJvb3RzKCk7Ci0KLQkJLyoKLQkJICogT24gSkRLIDEuMS43IGFuZCBiZXlvbmQuLi4KLQkJICogLS0gUE9SVEFCSUxJVFkgSVNTVUVTIEhFUkUgLS0KLQkJICovCi0JCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkgKCJvcy5uYW1lIikuaW5kZXhPZiAoIldpbmRvd3MiKSAhPSAtMSkgewotCQkJVmVjdG9yIC8qIG9mIEZpbGUgKi8gbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCWxpc3QuYWRkKG5ldyBGaWxlKERSSVZFX0EpKTsKLQkJCWxpc3QuYWRkKG5ldyBGaWxlKERSSVZFX0IpKTsKLQkJCWZvciAoY2hhciBpID0gJ2MnOyBpIDw9ICd6JzsgKytpKSB7Ci0JCQkJRmlsZSBkcml2ZSA9IG5ldyBGaWxlKGkgKyAiOiIgKyBGaWxlLnNlcGFyYXRvcik7Ci0JCQkJaWYgKGRyaXZlLmlzRGlyZWN0b3J5KCkgJiYgZHJpdmUuZXhpc3RzKCkpIHsKLQkJCQkJbGlzdC5hZGQoZHJpdmUpOwotCQkJCQlpZiAoaW5pdGlhbCAmJiBpID09ICdjJykgewotCQkJCQkJY3VycmVudERpcmVjdG9yeSA9IGRyaXZlOwotCQkJCQkJaW5pdGlhbCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJRmlsZVtdIHJvb3RzID0gKEZpbGVbXSkgbGlzdC50b0FycmF5KG5ldyBGaWxlW2xpc3Quc2l6ZSgpXSk7Ci0JCQlzb3J0RmlsZXMocm9vdHMpOwotCQkJcmV0dXJuIHJvb3RzOwotCQl9Ci0JCUZpbGUgcm9vdCA9IG5ldyBGaWxlKEZpbGUuc2VwYXJhdG9yKTsKLQkJaWYgKGluaXRpYWwpIHsKLQkJCWN1cnJlbnREaXJlY3RvcnkgPSByb290OwotCQkJaW5pdGlhbCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBuZXcgRmlsZVtdIHsgcm9vdCB9OwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBkaXJlY3RvcnkgbGlzdGluZwotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSBkaXJlY3RvcnkgdG8gYmUgbGlzdGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmaWxlcyB0aGlzIGRpcmVjdG9yeSBjb250YWlucywgbWF5IGJlIGVtcHR5IGJ1dCBub3QgbnVsbAotCSAqLwotCXN0YXRpYyBGaWxlW10gZ2V0RGlyZWN0b3J5TGlzdChGaWxlIGZpbGUpIHsKLQkJRmlsZVtdIGxpc3QgPSBmaWxlLmxpc3RGaWxlcygpOwotCQlpZiAobGlzdCA9PSBudWxsKSByZXR1cm4gbmV3IEZpbGVbMF07Ci0JCXNvcnRGaWxlcyhsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyBhIGZpbGUgb3IgZW50aXJlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0JICogCi0JICogQHBhcmFtIG9sZEZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBvbGQgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gbmV3RmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIG5ldyBmaWxlIG9yIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyB3aXRob3V0IGVycm9ycwotCSAqLwotCWJvb2xlYW4gY29weUZpbGVTdHJ1Y3R1cmUoRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJaWYgKG9sZEZpbGUgPT0gbnVsbCB8fCBuZXdGaWxlID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCi0JCS8vIGVuc3VyZSB0aGF0IG5ld0ZpbGUgaXMgbm90IGEgY2hpbGQgb2Ygb2xkRmlsZSBvciBhIGR1cGUKLQkJRmlsZSBzZWFyY2hGaWxlID0gbmV3RmlsZTsKLQkJZG8gewotCQkJaWYgKG9sZEZpbGUuZXF1YWxzKHNlYXJjaEZpbGUpKSByZXR1cm4gZmFsc2U7Ci0JCQlzZWFyY2hGaWxlID0gc2VhcmNoRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0gd2hpbGUgKHNlYXJjaEZpbGUgIT0gbnVsbCk7Ci0JCQotCQlpZiAob2xkRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkvKgotCQkJICogQ29weSBhIGRpcmVjdG9yeQotCQkJICovCi0JCQlpZiAocHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzRGlhbG9nLnNldERldGFpbEZpbGUob2xkRmlsZSwgUHJvZ3Jlc3NEaWFsb2cuQ09QWSk7Ci0JCQl9Ci0JCQlpZiAoc2ltdWxhdGVPbmx5KSB7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZ2V0UmVzb3VyY2VTdHJpbmcoInNpbXVsYXRlLkRpcmVjdG9yaWVzQ3JlYXRlZC50ZXh0IiwKLQkJCQkvLwluZXcgT2JqZWN0W10geyBuZXdGaWxlLmdldFBhdGgoKSB9KSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghIG5ld0ZpbGUubWtkaXJzKCkpIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUZpbGVbXSBzdWJGaWxlcyA9IG9sZEZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoc3ViRmlsZXMgIT0gbnVsbCkgewotCQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJCXByb2dyZXNzRGlhbG9nLmFkZFdvcmtVbml0cyhzdWJGaWxlcy5sZW5ndGgpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YkZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgb2xkU3ViRmlsZSA9IHN1YkZpbGVzW2ldOwotCQkJCQlGaWxlIG5ld1N1YkZpbGUgPSBuZXcgRmlsZShuZXdGaWxlLCBvbGRTdWJGaWxlLmdldE5hbWUoKSk7Ci0JCQkJCWlmICghIGNvcHlGaWxlU3RydWN0dXJlKG9sZFN1YkZpbGUsIG5ld1N1YkZpbGUpKSByZXR1cm4gZmFsc2U7Ci0JCQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJCQlwcm9ncmVzc0RpYWxvZy5hZGRQcm9ncmVzcygxKTsKLQkJCQkJCWlmIChwcm9ncmVzc0RpYWxvZy5pc0NhbmNlbGxlZCgpKSByZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogQ29weSBhIGZpbGUKLQkJCSAqLwotCQkJaWYgKHNpbXVsYXRlT25seSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGdldFJlc291cmNlU3RyaW5nKCJzaW11bGF0ZS5Db3B5RnJvbVRvLnRleHQiLAotCQkJCS8vCW5ldyBPYmplY3RbXSB7IG9sZEZpbGUuZ2V0UGF0aCgpLCBuZXdGaWxlLmdldFBhdGgoKSB9KSk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGVSZWFkZXIgaW4gPSBudWxsOwotCQkJCUZpbGVXcml0ZXIgb3V0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpbiA9IG5ldyBGaWxlUmVhZGVyKG9sZEZpbGUpOwotCQkJCQlvdXQgPSBuZXcgRmlsZVdyaXRlcihuZXdGaWxlKTsKLQkJCQotCQkJCQlpbnQgY291bnQ7Ci0JCQkJCXdoaWxlICgoY291bnQgPSBpbi5yZWFkKCkpICE9IC0xKSBvdXQud3JpdGUoY291bnQpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGluICE9IG51bGwpIGluLmNsb3NlKCk7Ci0JCQkJCQlpZiAob3V0ICE9IG51bGwpIG91dC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhIGZpbGUgb3IgZW50aXJlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0JICogCi0JICogQHBhcmFtIG9sZEZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBvbGQgZmlsZSBvciBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgd2l0aG91dCBlcnJvcnMKLQkgKi8KLQlib29sZWFuIGRlbGV0ZUZpbGVTdHJ1Y3R1cmUoRmlsZSBvbGRGaWxlKSB7Ci0JCWlmIChvbGRGaWxlID09IG51bGwpIHJldHVybiBmYWxzZTsJCQotCQlpZiAob2xkRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkvKgotCQkJICogRGVsZXRlIGEgZGlyZWN0b3J5Ci0JCQkgKi8KLQkJCWlmIChwcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NEaWFsb2cuc2V0RGV0YWlsRmlsZShvbGRGaWxlLCBQcm9ncmVzc0RpYWxvZy5ERUxFVEUpOwotCQkJfQotCQkJRmlsZVtdIHN1YkZpbGVzID0gb2xkRmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChzdWJGaWxlcyAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQkJcHJvZ3Jlc3NEaWFsb2cuYWRkV29ya1VuaXRzKHN1YkZpbGVzLmxlbmd0aCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBvbGRTdWJGaWxlID0gc3ViRmlsZXNbaV07Ci0JCQkJCWlmICghIGRlbGV0ZUZpbGVTdHJ1Y3R1cmUob2xkU3ViRmlsZSkpIHJldHVybiBmYWxzZTsKLQkJCQkJaWYgKHByb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKLQkJCQkJCXByb2dyZXNzRGlhbG9nLmFkZFByb2dyZXNzKDEpOwotCQkJCQkJaWYgKHByb2dyZXNzRGlhbG9nLmlzQ2FuY2VsbGVkKCkpIHJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2ltdWxhdGVPbmx5KSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihnZXRSZXNvdXJjZVN0cmluZygic2ltdWxhdGUuRGVsZXRlLnRleHQiLAotCQkJLy8JbmV3IE9iamVjdFtdIHsgb2xkRmlsZS5nZXRQYXRoKCksIG9sZEZpbGUuZ2V0UGF0aCgpIH0pKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBvbGRGaWxlLmRlbGV0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTb3J0cyBmaWxlcyBsZXhpY29ncmFwaGljYWxseSBieSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlcyB0aGUgYXJyYXkgb2YgRmlsZXMgdG8gYmUgc29ydGVkCi0JICovCi0Jc3RhdGljIHZvaWQgc29ydEZpbGVzKEZpbGVbXSBmaWxlcykgewotCQkvKiBWZXJ5IGxhenkgbWVyZ2Ugc29ydCBhbGdvcml0aG0gKi8KLQkJc29ydEJsb2NrKGZpbGVzLCAwLCBmaWxlcy5sZW5ndGggLSAxLCBuZXcgRmlsZVtmaWxlcy5sZW5ndGhdKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzb3J0QmxvY2soRmlsZVtdIGZpbGVzLCBpbnQgc3RhcnQsIGludCBlbmQsIEZpbGVbXSBtZXJnZVRlbXApIHsKLQkJZmluYWwgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0ICsgMTsKLQkJaWYgKGxlbmd0aCA8IDgpIHsKLQkJCWZvciAoaW50IGkgPSBlbmQ7IGkgPiBzdGFydDsgLS1pKSB7Ci0JCQkJZm9yIChpbnQgaiA9IGVuZDsgaiA+IHN0YXJ0OyAtLWopICB7Ci0JCQkJCWlmIChjb21wYXJlRmlsZXMoZmlsZXNbaiAtIDFdLCBmaWxlc1tqXSkgPiAwKSB7Ci0JCQkJCSAgICBmaW5hbCBGaWxlIHRlbXAgPSBmaWxlc1tqXTsgCi0JCQkJCSAgICBmaWxlc1tqXSA9IGZpbGVzW2otMV07IAotCQkJCQkgICAgZmlsZXNbai0xXSA9IHRlbXA7Ci0JCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgaW50IG1pZCA9IChzdGFydCArIGVuZCkgLyAyOwotCQlzb3J0QmxvY2soZmlsZXMsIHN0YXJ0LCBtaWQsIG1lcmdlVGVtcCk7Ci0JCXNvcnRCbG9jayhmaWxlcywgbWlkICsgMSwgZW5kLCBtZXJnZVRlbXApOwotCQlpbnQgeCA9IHN0YXJ0OwotCQlpbnQgeSA9IG1pZCArIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLQkJCWlmICgoeCA+IG1pZCkgfHwgKCh5IDw9IGVuZCkgJiYgY29tcGFyZUZpbGVzKGZpbGVzW3hdLCBmaWxlc1t5XSkgPiAwKSkgewotCQkJCW1lcmdlVGVtcFtpXSA9IGZpbGVzW3krK107Ci0JCQl9IGVsc2UgewotCQkJCW1lcmdlVGVtcFtpXSA9IGZpbGVzW3grK107Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgZmlsZXNbaSArIHN0YXJ0XSA9IG1lcmdlVGVtcFtpXTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXBhcmVGaWxlcyhGaWxlIGEsIEZpbGUgYikgewotLy8JCWJvb2xlYW4gYUlzRGlyID0gYS5pc0RpcmVjdG9yeSgpOwotLy8JCWJvb2xlYW4gYklzRGlyID0gYi5pc0RpcmVjdG9yeSgpOwotLy8JCWlmIChhSXNEaXIgJiYgISBiSXNEaXIpIHJldHVybiAtMTsKLS8vCQlpZiAoYklzRGlyICYmICEgYUlzRGlyKSByZXR1cm4gMTsKLQotCQkvLyBzb3J0IGNhc2Utc2Vuc2l0aXZlIGZpbGVzIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIKLQkJaW50IGNvbXBhcmUgPSBhLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKGIuZ2V0TmFtZSgpKTsKLQkJaWYgKGNvbXBhcmUgPT0gMCkgY29tcGFyZSA9IGEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhiLmdldE5hbWUoKSk7Ci0JCXJldHVybiBjb21wYXJlOwotCX0KLQkKLQkvKgotCSAqIFRoaXMgd29ya2VyIHVwZGF0ZXMgdGhlIHRhYmxlIHdpdGggZmlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgYmFja2dyb3VuZC4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRhdGlvbiBub3RlczoKLQkgKiA8dWw+Ci0JICogPGxpPiBJdCBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgaXQgY2FuIGJlIGludGVycnVwdGVkIGNsZWFubHkuCi0JICogPGxpPiBJdCB1c2VzIGFzeW5jRXhlYygpIGluIHNvbWUgcGxhY2VzIHRvIGVuc3VyZSB0aGF0IFNXVCBXaWRnZXRzIGFyZSBtYW5pcHVsYXRlZCBpbiB0aGUKLQkgKiAgICAgIHJpZ2h0IHRocmVhZC4gIEV4Y2x1c2l2ZSB1c2Ugb2Ygc3luY0V4ZWMoKSB3b3VsZCBiZSBpbmFwcHJvcHJpYXRlIGFzIGl0IHdvdWxkIHJlcXVpcmUgYSBwYWlyCi0JICogICAgICBvZiBjb250ZXh0IHN3aXRjaGVzIGJldHdlZW4gZWFjaCB0YWJsZSB1cGRhdGUgb3BlcmF0aW9uLgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCi0JLyoqCi0JICogU3RvcHMgdGhlIHdvcmtlciBhbmQgd2FpdHMgZm9yIGl0IHRvIHRlcm1pbmF0ZS4KLQkgKi8KLQl2b2lkIHdvcmtlclN0b3AoKSB7Ci0JCWlmICh3b3JrZXJUaHJlYWQgPT0gbnVsbCkgcmV0dXJuOwotCQlzeW5jaHJvbml6ZWQod29ya2VyTG9jaykgewotCQkJd29ya2VyQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCXdvcmtlclN0b3BwZWQgPSB0cnVlOwotCQkJd29ya2VyTG9jay5ub3RpZnlBbGwoKTsKLQkJfQotCQl3aGlsZSAod29ya2VyVGhyZWFkICE9IG51bGwpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSB3b3JrZXIgdGhhdCBpdCBzaG91bGQgdXBkYXRlIGl0c2VsZiB3aXRoIG5ldyBkYXRhLgotCSAqIENhbmNlbHMgYW55IHByZXZpb3VzIG9wZXJhdGlvbiBhbmQgYmVnaW5zIGEgbmV3IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBuZXcgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSB0YWJsZSwgbnVsbCBpcyBpZ25vcmVkCi0JICogQHBhcmFtIGZvcmNlIGlmIHRydWUgY2F1c2VzIGEgcmVmcmVzaCBldmVuIGlmIHRoZSBkYXRhIGlzIHRoZSBzYW1lCi0JICovCi0Jdm9pZCB3b3JrZXJVcGRhdGUoRmlsZSBkaXIsIGJvb2xlYW4gZm9yY2UpIHsKLQkJaWYgKGRpciA9PSBudWxsKSByZXR1cm47Ci0JCWlmICgoIWZvcmNlKSAmJiAod29ya2VyTmV4dERpciAhPSBudWxsKSAmJiAod29ya2VyTmV4dERpci5lcXVhbHMoZGlyKSkpIHJldHVybjsKLQotCQlzeW5jaHJvbml6ZWQod29ya2VyTG9jaykgewotCQkJd29ya2VyTmV4dERpciA9IGRpcjsKLQkJCXdvcmtlclN0b3BwZWQgPSBmYWxzZTsKLQkJCXdvcmtlckNhbmNlbGxlZCA9IHRydWU7Ci0JCQl3b3JrZXJMb2NrLm5vdGlmeUFsbCgpOwotCQl9Ci0JCWlmICh3b3JrZXJUaHJlYWQgPT0gbnVsbCkgewotCQkJd29ya2VyVGhyZWFkID0gbmV3IFRocmVhZCh3b3JrZXJSdW5uYWJsZSk7Ci0JCQl3b3JrZXJUaHJlYWQuc3RhcnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hbmFnZXMgdGhlIHdvcmtlcidzIHRocmVhZAotCSAqLwotCXByaXZhdGUgZmluYWwgUnVubmFibGUgd29ya2VyUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXdoaWxlICghIHdvcmtlclN0b3BwZWQpIHsKLQkJCQlzeW5jaHJvbml6ZWQod29ya2VyTG9jaykgewotCQkJCQl3b3JrZXJDYW5jZWxsZWQgPSBmYWxzZTsKLQkJCQkJd29ya2VyU3RhdGVEaXIgPSB3b3JrZXJOZXh0RGlyOwotCQkJCX0KLQkJCQl3b3JrZXJFeGVjdXRlKCk7Ci0JCQkJc3luY2hyb25pemVkKHdvcmtlckxvY2spIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICgoIXdvcmtlckNhbmNlbGxlZCkgJiYgKHdvcmtlclN0YXRlRGlyID09IHdvcmtlck5leHREaXIpKSB3b3JrZXJMb2NrLndhaXQoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJd29ya2VyVGhyZWFkID0gbnVsbDsKLQkJCS8vIHdha2UgdXAgVUkgdGhyZWFkIGluIGNhc2UgaXQgaXMgaW4gYSBtb2RhbCBsb29wIGF3YWl0aW5nIHRocmVhZCB0ZXJtaW5hdGlvbgotCQkJLy8gKHNlZSB3b3JrZXJTdG9wKCkpCi0JCQlkaXNwbGF5Lndha2UoKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgdGFibGUncyBjb250ZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCB3b3JrZXJFeGVjdXRlKCkgewotCQlGaWxlW10gZGlyTGlzdDsKLQkJLy8gQ2xlYXIgZXhpc3RpbmcgaW5mb3JtYXRpb24KLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdGFibGVDb250ZW50c09mTGFiZWwuc2V0VGV4dChGaWxlVmlld2VyLmdldFJlc291cmNlU3RyaW5nKCJkZXRhaWxzLkNvbnRlbnRzT2YudGV4dCIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IHdvcmtlclN0YXRlRGlyLmdldFBhdGgoKSB9KSk7Ci0JCQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JCQkJdGFibGUuc2V0RGF0YShUQUJMRURBVEFfRElSLCB3b3JrZXJTdGF0ZURpcik7Ci0JCQl9Ci0JCX0pOwotCQlkaXJMaXN0ID0gZ2V0RGlyZWN0b3J5TGlzdCh3b3JrZXJTdGF0ZURpcik7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgKCEgd29ya2VyQ2FuY2VsbGVkKSAmJiAoaSA8IGRpckxpc3QubGVuZ3RoKTsgaSsrKSB7Ci0JCQl3b3JrZXJBZGRGaWxlRGV0YWlscyhkaXJMaXN0W2ldKTsKLQkJfQotCi0JfQotCQkKLQkvKioKLQkgKiBBZGRzIGEgZmlsZSdzIGRldGFpbCBpbmZvcm1hdGlvbiB0byB0aGUgZGlyZWN0b3J5IGxpc3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgd29ya2VyQWRkRmlsZURldGFpbHMoZmluYWwgRmlsZSBmaWxlKSB7Ci0JCWZpbmFsIFN0cmluZyBuYW1lU3RyaW5nID0gZmlsZS5nZXROYW1lKCk7Ci0JCWZpbmFsIFN0cmluZyBkYXRlU3RyaW5nID0gZGF0ZUZvcm1hdC5mb3JtYXQobmV3IERhdGUoZmlsZS5sYXN0TW9kaWZpZWQoKSkpOwotCQlmaW5hbCBTdHJpbmcgc2l6ZVN0cmluZzsKLQkJZmluYWwgU3RyaW5nIHR5cGVTdHJpbmc7Ci0JCWZpbmFsIEltYWdlIGljb25JbWFnZTsKLQkJCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXR5cGVTdHJpbmcgPSBnZXRSZXNvdXJjZVN0cmluZygiZmlsZXR5cGUuRm9sZGVyIik7Ci0JCQlzaXplU3RyaW5nID0gIiI7Ci0JCQlpY29uSW1hZ2UgPSBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25DbG9zZWRGb2xkZXJdOwotCQl9IGVsc2UgewotCQkJc2l6ZVN0cmluZyA9IGdldFJlc291cmNlU3RyaW5nKCJmaWxlc2l6ZS5LQiIsCi0JCQkJbmV3IE9iamVjdFtdIHsgbmV3IExvbmcoKGZpbGUubGVuZ3RoKCkgKyA1MTIpIC8gMTAyNCkgfSk7Ci0JCQkKLQkJCWludCBkb3QgPSBuYW1lU3RyaW5nLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoZG90ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGV4dGVuc2lvbiA9IG5hbWVTdHJpbmcuc3Vic3RyaW5nKGRvdCk7Ci0JCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb24pOwotCQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQkJdHlwZVN0cmluZyA9IHByb2dyYW0uZ2V0TmFtZSgpOwotCQkJCQlpY29uSW1hZ2UgPSBpY29uQ2FjaGUuZ2V0SWNvbkZyb21Qcm9ncmFtKHByb2dyYW0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXR5cGVTdHJpbmcgPSBnZXRSZXNvdXJjZVN0cmluZygiZmlsZXR5cGUuVW5rbm93biIsIG5ldyBPYmplY3RbXSB7IGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpIH0pOwotCQkJCQlpY29uSW1hZ2UgPSBpY29uQ2FjaGUuc3RvY2tJbWFnZXNbaWNvbkNhY2hlLmljb25GaWxlXTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXR5cGVTdHJpbmcgPSBnZXRSZXNvdXJjZVN0cmluZygiZmlsZXR5cGUuTm9uZSIpOwotCQkJCWljb25JbWFnZSA9IGljb25DYWNoZS5zdG9ja0ltYWdlc1tpY29uQ2FjaGUuaWNvbkZpbGVdOwotCQkJfQotCQl9Ci0JCWZpbmFsIFN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW10geyBuYW1lU3RyaW5nLCBzaXplU3RyaW5nLCB0eXBlU3RyaW5nLCBkYXRlU3RyaW5nIH07Ci0KLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJCS8vIGd1YXJkIGFnYWluc3QgdGhlIHNoZWxsIGJlaW5nIGNsb3NlZCBiZWZvcmUgdGhpcyBydW5zCi0JCQkJaWYgKHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCQl0YWJsZUl0ZW0uc2V0VGV4dChzdHJpbmdzKTsKLQkJCQl0YWJsZUl0ZW0uc2V0SW1hZ2UoaWNvbkltYWdlKTsKLQkJCQl0YWJsZUl0ZW0uc2V0RGF0YShUQUJMRUlURU1EQVRBX0ZJTEUsIGZpbGUpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgbWFuYWdlIGEgcHJvZ3Jlc3MgZGlhbG9nIGZvciBmaWxlIG9wZXJhdGlvbnMuCi0JICovCi0JY2xhc3MgUHJvZ3Jlc3NEaWFsb2cgewotCQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT1BZID0gMDsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVMRVRFID0gMTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTU9WRSA9IDI7Ci0KLQkJU2hlbGwgc2hlbGw7Ci0JCUxhYmVsIG1lc3NhZ2VMYWJlbCwgZGV0YWlsTGFiZWw7Ci0JCVByb2dyZXNzQmFyIHByb2dyZXNzQmFyOwotCQlCdXR0b24gY2FuY2VsQnV0dG9uOwotCQlib29sZWFuIGlzQ2FuY2VsbGVkID0gZmFsc2U7Ci0KLQkJZmluYWwgU3RyaW5nIG9wZXJhdGlvbktleU5hbWVbXSA9IHsKLQkJCSJDb3B5IiwKLQkJCSJEZWxldGUiLAotCQkJIk1vdmUiCi0JCX07Ci0JCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgcHJvZ3Jlc3MgZGlhbG9nIGJ1dCBkb2VzIG5vdCBvcGVuIGl0IGltbWVkaWF0ZWx5LgotCQkgKiAKLQkJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IFNoZWxsCi0JCSAqIEBwYXJhbSBzdHlsZSBvbmUgb2YgQ09QWSwgTU9WRQotCQkgKi8KLQkJcHVibGljIFByb2dyZXNzRGlhbG9nKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCQlzaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuVElUTEUgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCXNoZWxsLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInByb2dyZXNzRGlhbG9nLiIgKyBvcGVyYXRpb25LZXlOYW1lW3N0eWxlXSArICIudGl0bGUiKSk7Ci0JCQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG5ldyBTaGVsbEFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQkJCWlzQ2FuY2VsbGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInByb2dyZXNzRGlhbG9nLiIgKyBvcGVyYXRpb25LZXlOYW1lW3N0eWxlXSArICIuZGVzY3JpcHRpb24iKSk7Ci0JCQkKLQkJCXByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5XUkFQKTsKLQkJCXByb2dyZXNzQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCXByb2dyZXNzQmFyLnNldE1pbmltdW0oMCk7Ci0JCQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKDApOwotCQkJCi0JCQlkZXRhaWxMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkhPUklaT05UQUwpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWRldGFpbExhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJCi0JCQljYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCQljYW5jZWxCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQljYW5jZWxCdXR0b24uc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygicHJvZ3Jlc3NEaWFsb2cuY2FuY2VsQnV0dG9uLnRleHQiKSk7Ci0JCQljYW5jZWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpc0NhbmNlbGxlZCA9IHRydWU7Ci0JCQkJCWNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkvKioKLQkJICogU2V0cyB0aGUgZGV0YWlsIHRleHQgdG8gc2hvdyB0aGUgZmlsZW5hbWUgYWxvbmcgd2l0aCBhIHN0cmluZwotCQkgKiByZXByZXNlbnRpbmcgdGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQgb24gdGhhdCBmaWxlLgotCQkgKiAKLQkJICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gYmUgZGV0YWlsZWQKLQkJICogQHBhcmFtIG9wZXJhdGlvbiBvbmUgb2YgQ09QWSwgREVMRVRFCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXREZXRhaWxGaWxlKEZpbGUgZmlsZSwgaW50IG9wZXJhdGlvbikgewotCQkJZGV0YWlsTGFiZWwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygicHJvZ3Jlc3NEaWFsb2cuIiArIG9wZXJhdGlvbktleU5hbWVbb3BlcmF0aW9uXSArICIub3BlcmF0aW9uIiwKLQkJCQluZXcgT2JqZWN0W10geyBmaWxlIH0pKTsKLQkJfQotCQkvKioKLQkJICogUmV0dXJucyB0cnVlIGlmIHRoZSBDYW5jZWwgYnV0dG9uIHdhcyBiZWVuIGNsaWNrZWQuCi0JCSAqIAotCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIENhbmNlbCBidXR0b24gd2FzIGNsaWNrZWQuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLQkJCXJldHVybiBpc0NhbmNlbGxlZDsKLQkJfQotCQkvKioKLQkJICogU2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgdG8gYmUgcGVyZm9ybWVkLgotCQkgKiAKLQkJICogQHBhcmFtIHdvcmsgdGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRUb3RhbFdvcmtVbml0cyhpbnQgd29yaykgewotCQkJcHJvZ3Jlc3NCYXIuc2V0TWF4aW11bSh3b3JrKTsKLQkJfQotCQkvKioKLQkJICogQWRkcyB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgdG8gYmUgcGVyZm9ybWVkLgotCQkgKiAKLQkJICogQHBhcmFtIHdvcmsgdGhlIG51bWJlciBvZiB3b3JrIHVuaXRzIHRvIGFkZAotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkV29ya1VuaXRzKGludCB3b3JrKSB7Ci0JCQlzZXRUb3RhbFdvcmtVbml0cyhwcm9ncmVzc0Jhci5nZXRNYXhpbXVtKCkgKyB3b3JrKTsKLQkJfQotCQkvKioKLQkJICogU2V0cyB0aGUgcHJvZ3Jlc3Mgb2YgY29tcGxldGlvbiBvZiB0aGUgdG90YWwgd29yayB1bml0cy4KLQkJICogCi0JCSAqIEBwYXJhbSB3b3JrIHRoZSB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyBjb21wbGV0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzKGludCB3b3JrKSB7Ci0JCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24od29yayk7Ci0JCQl3aGlsZSAoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkge30gLy8gZW5hYmxlIGV2ZW50IHByb2Nlc3NpbmcKLQkJfQotCQkvKioKLQkJICogQWRkcyB0byB0aGUgcHJvZ3Jlc3Mgb2YgY29tcGxldGlvbiBvZiB0aGUgdG90YWwgd29yayB1bml0cy4KLQkJICogCi0JCSAqIEBwYXJhbSB3b3JrIHRoZSBudW1iZXIgb2Ygd29yayB1bml0cyBjb21wbGV0ZWQgdG8gYWRkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRQcm9ncmVzcyhpbnQgd29yaykgewotCQkJc2V0UHJvZ3Jlc3MocHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCkgKyB3b3JrKTsKLQkJfQotCQkvKioKLQkJICogT3BlbnMgdGhlIGRpYWxvZy4KLQkJICovCi0JCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCQlzaGVsbC5wYWNrKCk7Ci0JCQlmaW5hbCBTaGVsbCBwYXJlbnRTaGVsbCA9IChTaGVsbCkgc2hlbGwuZ2V0UGFyZW50KCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHBhcmVudFNoZWxsLmdldEJvdW5kcygpOwotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHNoZWxsLmdldEJvdW5kcygpOwotCQkJYm91bmRzLnggPSByZWN0LnggKyAocmVjdC53aWR0aCAtIGJvdW5kcy53aWR0aCkgLyAyOwotCQkJYm91bmRzLnkgPSByZWN0LnkgKyAocmVjdC5oZWlnaHQgLSBib3VuZHMuaGVpZ2h0KSAvIDI7Ci0JCQlzaGVsbC5zZXRCb3VuZHMoYm91bmRzKTsKLQkJCXNoZWxsLm9wZW4oKTsKLQkJfQotCQkvKioKLQkJICogQ2xvc2VzIHRoZSBkaWFsb2cgYW5kIGRpc3Bvc2VzIGl0cyByZXNvdXJjZXMuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlzaGVsbCA9IG51bGw7Ci0JCQltZXNzYWdlTGFiZWwgPSBudWxsOwotCQkJZGV0YWlsTGFiZWwgPSBudWxsOwotCQkJcHJvZ3Jlc3NCYXIgPSBudWxsOwotCQkJY2FuY2VsQnV0dG9uID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvSWNvbkNhY2hlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL0ljb25DYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTRkYzk2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvSWNvbkNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5maWxldmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIE1hbmFnZXMgaWNvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbi4KLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGFzIHdlIGNvdWxkIGVhc2lseSBlbmQgdXAgY3JlYXRpbmcgdGhvdXNhbmRzIG9mIGljb25zCi0gKiBiZWFyaW5nIHRoZSBzYW1lIGltYWdlLgotICovCi1jbGFzcyBJY29uQ2FjaGUgewotCS8vIFN0b2NrIGltYWdlcwotCXB1YmxpYyBmaW5hbCBpbnQKLQkJc2hlbGxJY29uID0gMCwKLQkJaWNvbkNsb3NlZERyaXZlID0gMSwKLQkJaWNvbkNsb3NlZEZvbGRlciA9IDIsCi0JCWljb25GaWxlID0gMywKLQkJaWNvbk9wZW5Ecml2ZSA9IDQsCi0JCWljb25PcGVuRm9sZGVyID0gNSwKLQkJY21kQ29weSA9IDYsCi0JCWNtZEN1dCA9IDcsCi0JCWNtZERlbGV0ZSA9IDgsCi0JCWNtZFBhcmVudCA9IDksCi0JCWNtZFBhc3RlID0gMTAsCi0JCWNtZFByaW50ID0gMTEsCi0JCWNtZFJlZnJlc2ggPSAxMiwKLQkJY21kUmVuYW1lID0gMTMsCi0JCWNtZFNlYXJjaCA9IDE0OwotCXB1YmxpYyBmaW5hbCBTdHJpbmdbXSBzdG9ja0ltYWdlTG9jYXRpb25zID0gewotCQkiZ2VuZXJpY19leGFtcGxlLmdpZiIsCi0JCSJpY29uX0Nsb3NlZERyaXZlLmdpZiIsCi0JCSJpY29uX0Nsb3NlZEZvbGRlci5naWYiLAotCQkiaWNvbl9GaWxlLmdpZiIsCi0JCSJpY29uX09wZW5Ecml2ZS5naWYiLAotCQkiaWNvbl9PcGVuRm9sZGVyLmdpZiIsCi0JCSJjbWRfQ29weS5naWYiLAotCQkiY21kX0N1dC5naWYiLAotCQkiY21kX0RlbGV0ZS5naWYiLAotCQkiY21kX1BhcmVudC5naWYiLAotCQkiY21kX1Bhc3RlLmdpZiIsCi0JCSJjbWRfUHJpbnQuZ2lmIiwKLQkJImNtZF9SZWZyZXNoLmdpZiIsCi0JCSJjbWRfUmVuYW1lLmdpZiIsCi0JCSJjbWRfU2VhcmNoLmdpZiIKLQl9OwotCXB1YmxpYyBJbWFnZSBzdG9ja0ltYWdlc1tdOwotCQotCS8vIFN0b2NrIGN1cnNvcnMKLQlwdWJsaWMgZmluYWwgaW50Ci0JCWN1cnNvckRlZmF1bHQgPSAwLAotCQljdXJzb3JXYWl0ID0gMTsKLQlwdWJsaWMgQ3Vyc29yIHN0b2NrQ3Vyc29yc1tdOwotCS8vIENhY2hlZCBpY29ucwotCXByaXZhdGUgSGFzaHRhYmxlIGljb25DYWNoZTsgLyogbWFwIFByb2dyYW0gdG8gSW1hZ2UgKi8KLQkKLQlwdWJsaWMgSWNvbkNhY2hlKCkgewotCX0KLQkvKioKLQkgKiBMb2FkcyB0aGUgcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0UmVzb3VyY2VzKERpc3BsYXkgZGlzcGxheSkgewotCQlpZiAoc3RvY2tJbWFnZXMgPT0gbnVsbCkgewotCQkJc3RvY2tJbWFnZXMgPSBuZXcgSW1hZ2Vbc3RvY2tJbWFnZUxvY2F0aW9ucy5sZW5ndGhdOwotCQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9ja0ltYWdlTG9jYXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSBjcmVhdGVTdG9ja0ltYWdlKGRpc3BsYXksIHN0b2NrSW1hZ2VMb2NhdGlvbnNbaV0pOwotCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCWZyZWVSZXNvdXJjZXMoKTsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLQkJCQkJCUZpbGVWaWV3ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpKTsKLQkJCQl9Ci0JCQkJc3RvY2tJbWFnZXNbaV0gPSBpbWFnZTsKLQkJCX0KLQkJfQkKLQkJaWYgKHN0b2NrQ3Vyc29ycyA9PSBudWxsKSB7Ci0JCQlzdG9ja0N1cnNvcnMgPSBuZXcgQ3Vyc29yW10gewotCQkJCW51bGwsCi0JCQkJbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpCi0JCQl9OwotCQl9Ci0JCWljb25DYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWlmIChzdG9ja0ltYWdlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0b2NrSW1hZ2VzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBzdG9ja0ltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJc3RvY2tJbWFnZXMgPSBudWxsOwotCQl9Ci0JCWlmIChpY29uQ2FjaGUgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBpdCA9IGljb25DYWNoZS5lbGVtZW50cygpOyBpdC5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGl0Lm5leHRFbGVtZW50KCk7Ci0JCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWlmIChzdG9ja0N1cnNvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9ja0N1cnNvcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBDdXJzb3IgY3Vyc29yID0gc3RvY2tDdXJzb3JzW2ldOwotCQkJCWlmIChjdXJzb3IgIT0gbnVsbCkgY3Vyc29yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXN0b2NrQ3Vyc29ycyA9IG51bGw7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIHN0b2NrIGltYWdlCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgaWNvbgotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlU3RvY2tJbWFnZShEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBwYXRoKSB7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IEljb25DYWNoZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChwYXRoKTsKLQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEgKHN0cmVhbSk7Ci0JCUltYWdlRGF0YSBtYXNrID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2sgKCk7Ci0JCUltYWdlIHJlc3VsdCA9IG5ldyBJbWFnZSAoZGlzcGxheSwgaW1hZ2VEYXRhLCBtYXNrKTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSAoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UgKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogR2V0cyBhbiBpbWFnZSBmb3IgYSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2dyYW0KLQkgKgotCSAqIEBwYXJhbSBwcm9ncmFtIHRoZSBQcm9ncmFtCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb25Gcm9tUHJvZ3JhbShQcm9ncmFtIHByb2dyYW0pIHsKLQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGljb25DYWNoZS5nZXQocHJvZ3JhbSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gcHJvZ3JhbS5nZXRJbWFnZURhdGEoKTsKLQkJCWlmIChpbWFnZURhdGEgIT0gbnVsbCkgewotCQkJCWltYWdlID0gbmV3IEltYWdlKG51bGwsIGltYWdlRGF0YSwgaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKSk7Ci0JCQkJaWNvbkNhY2hlLnB1dChwcm9ncmFtLCBpbWFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCWltYWdlID0gc3RvY2tJbWFnZXNbaWNvbkZpbGVdOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9Db3B5LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0NvcHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Mjc0YjA3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfQ3V0LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0N1dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViOTQ4YjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0RlbGV0ZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9EZWxldGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjY0NzY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX0RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QYXJlbnQuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFyZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIyNzhlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QYXJlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFzdGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUGFzdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWUwYWIyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1ByaW50LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGRmYThjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9QcmludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9SZWZyZXNoLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDYzYzIzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUmVuYW1lLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1JlbmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1YjEzMjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9jbWRfUmVuYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1NlYXJjaC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2NtZF9TZWFyY2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZGMzZWJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvY21kX1NlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2dlbmVyaWNfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2dlbmVyaWNfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5ZmI2YjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9nZW5lcmljX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZERyaXZlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWREcml2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0ZTUzMGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZERyaXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9DbG9zZWRGb2xkZXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZEZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlYjZlZDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0Nsb3NlZEZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fRmlsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiODZkMDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX0ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Ecml2ZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkRyaXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2IyYjYzMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9maWxldmlld2VyL2ljb25fT3BlbkRyaXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRm9sZGVyLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ZpbGV2aWV3ZXIvaWNvbl9PcGVuRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTljNzc3MzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZmlsZXZpZXdlci9pY29uX09wZW5Gb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQWR2YW5jZWRHcmFwaGljcy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQWR2YW5jZWRHcmFwaGljcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWFiMWMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FkdmFuY2VkR3JhcGhpY3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi0vKiAKLSAqIERyYXdpbmcgd2l0aCB0cmFuc2Zvcm1hdGlvbnMsIHBhdGhzIGFuZCBhbHBoYSBibGVuZGluZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgQWR2YW5jZWRHcmFwaGljcyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19ncmFwaGljcyIpOwotCQotCXN0YXRpYyBJbWFnZSBsb2FkSW1hZ2UgKERldmljZSBkZXZpY2UsIENsYXNzIGNsYXp6LCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0gKHN0cmluZyk7Ci0JCWlmIChzdHJlYW0gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWltYWdlID0gbmV3IEltYWdlIChkZXZpY2UsIHN0cmVhbSk7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlzdHJlYW0uY2xvc2UgKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkge30KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIFNoZWxsIG9wZW4oZmluYWwgRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoIkFkdmFuY2VkR3JhcGhpY3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQkJcGF0aC5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULk9LKTsKLQkJCWRpYWxvZy5zZXRUZXh0KFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoIldhcm5pbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoIkxpYk5vdEZvdW5kIikpOyAvLyROT04tTkxTLTEkCi0JCQlkaWFsb2cub3BlbigpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRm9udERhdGEgZmQgPSBzaGVsbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJZmluYWwgRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCA5NiwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBsb2FkSW1hZ2UoZGlzcGxheSwgQWR2YW5jZWRHcmFwaGljcy5jbGFzcywgImlybWFvcy5qcGciKTsKLQkJZmluYWwgUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7CQkJCQotCQkJCVRyYW5zZm9ybSB0ciA9IG5ldyBUcmFuc2Zvcm0oZGlzcGxheSk7Ci0JCQkJdHIudHJhbnNsYXRlKHJlY3Qud2lkdGggLyA0LCByZWN0LmhlaWdodCAvIDIpOwotCQkJCXRyLnJvdGF0ZSgtMzApOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZ2Muc2V0QWxwaGEoMTAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHIpOwotCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQkJCXBhdGguYWRkU3RyaW5nKCJTV1QiLCAwLCAwLCBmb250KTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCQkJZ2MuZmlsbFBhdGgocGF0aCk7Ci0JCQkJZ2MuZHJhd1BhdGgocGF0aCk7Ci0JCQkJdHIuZGlzcG9zZSgpOwotCQkJCXBhdGguZGlzcG9zZSgpOwotCQkJfQkJCQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShyZWN0LndpZHRoLCByZWN0LmhlaWdodCkpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJZm9udC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwkKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IEFkdmFuY2VkR3JhcGhpY3MoKS5vcGVuKGRpc3BsYXkpOwotCQl3aGlsZSAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FscGhhVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BbHBoYVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkwOGFkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0FscGhhVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIGFscGhhIGJsZW5kaW5nLiBJdCBkcmF3cyB2YXJpb3VzIHNoYXBlcyBhbmQgaW1hZ2VzIGFzCi0gKiBhbHBoYSB2YWx1ZXMgY2hhbmdlLgotICovCi1wdWJsaWMgY2xhc3MgQWxwaGFUYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQkvKioKLQkgKiBWYWx1ZSB1c2VkIGluIHNldEFscGhhIEFQSSBjYWxsLiBHb2VzIGZyb20gMCB0byAyNTUgYW5kIHRoZW4gc3RhcnRzIG92ZXIuCi0JICovCi0JaW50IGFscGhhVmFsdWU7Ci0JCi0JLyoqCi0JICogVmFsdWUgdXNlZCBpbiBzZXRBbHBoYSBBUEkgY2FsbC4gR29lcyBmcm9tIDAgdG8gMjU1LCB0aGVuIGZyb20gMjU1IHRvIDAKLQkgKiBhbmQgdGhlbiBzdGFydHMgb3Zlci4KLQkgKi8KLQlpbnQgYWxwaGFWYWx1ZTI7Ci0KLQlib29sZWFuIHJlYWNoZWRNYXggPSBmYWxzZTsKLQlpbnQgZGlhbWV0ZXI7Ci0JCi0JLyoqIHJhbmRvbSBudW1iZXJzIHVzZWQgZm9yIHBvc2l0aW9uaW5nICJTV1QiICovCi0JaW50IHJhbmRYLCByYW5kWTsKLQlJbWFnZSBhbHBoYUltZzEsIGFscGhhSW1nMjsKLQotCXB1YmxpYyBBbHBoYVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCQlzdXBlcihleGFtcGxlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWxwaGEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWxwaGEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbHBoYURlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIGludCBnZXRJbml0aWFsQW5pbWF0aW9uVGltZSgpIHsKLQkJcmV0dXJuIDIwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYWxwaGFJbWcxICE9IG51bGwpIHsKLQkJCWFscGhhSW1nMS5kaXNwb3NlKCk7Ci0JCQlhbHBoYUltZzEgPSBudWxsOwotCQl9Ci0JCWlmIChhbHBoYUltZzIgIT0gbnVsbCkgewotCQkJYWxwaGFJbWcyLmRpc3Bvc2UoKTsKLQkJCWFscGhhSW1nMiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlhbHBoYVZhbHVlID0gKGFscGhhVmFsdWUrNSklMjU1OwotCQkKLQkJYWxwaGFWYWx1ZTIgPSByZWFjaGVkTWF4ID8gYWxwaGFWYWx1ZTIgLSA1IDogYWxwaGFWYWx1ZTIgKyA1OwotCQkJCi0JCWlmIChhbHBoYVZhbHVlMiA9PSAyNTUpIHsKLQkJCXJlYWNoZWRNYXggPSB0cnVlOwotCQl9IGVsc2UgaWYgKGFscGhhVmFsdWUyID09IDApIHsKLQkJCXJlYWNoZWRNYXggPSBmYWxzZTsKLQkJfQotCQkKLQkJZGlhbWV0ZXIgPSAoZGlhbWV0ZXIgKyAxMCklKHdpZHRoID4gaGVpZ2h0ID8gd2lkdGggOiBoZWlnaHQpOwotCX0KLQotCS8qKiAKLQkgKiBQYWludCB0aGUgcmVjZWl2ZXIgaW50byB0aGUgc3BlY2lmaWVkIEdDLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0KLQkJaWYgKGFscGhhSW1nMSA9PSBudWxsKSB7Ci0JCQlhbHBoYUltZzEgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiYWxwaGFfaW1nMS5wbmciKTsKLQkJCWFscGhhSW1nMiA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJhbHBoYV9pbWcyLnBuZyIpOwkKLQkJfQotCi0JCVJlY3RhbmdsZSByZWN0ID0gYWxwaGFJbWcxLmdldEJvdW5kcygpOwotCQkKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSk7Ci0JCWdjLmRyYXdJbWFnZShhbHBoYUltZzEsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgCi0JCQkJd2lkdGgvMiwgaGVpZ2h0LzIsIHdpZHRoLzQsIGhlaWdodC80KTsKLQkJCi0JCWdjLmRyYXdJbWFnZShhbHBoYUltZzEsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgCi0JCQkJMCwgMCwgd2lkdGgvNCwgaGVpZ2h0LzQpOwotCi0JCWdjLnNldEFscGhhKDI1NS1hbHBoYVZhbHVlKTsKLQkJZ2MuZHJhd0ltYWdlKGFscGhhSW1nMiwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAKLQkJCQl3aWR0aC8yLCAwLCB3aWR0aC80LCBoZWlnaHQvNCk7Ci0JCQotCQlnYy5kcmF3SW1hZ2UoYWxwaGFJbWcyLCByZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIAotCQkJCTAsIDMqaGVpZ2h0LzQsIHdpZHRoLzQsIGhlaWdodC80KTsKLQkJCi0JCS8vIHBlbnRhZ29uCi0JCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX01BR0VOVEEpKTsKLQkJZ2MuZmlsbFBvbHlnb24obmV3IGludCBbXSB7d2lkdGgvMTAsIGhlaWdodC8yLCAzKndpZHRoLzEwLCBoZWlnaHQvMi13aWR0aC82LCA1KndpZHRoLzEwLCBoZWlnaHQvMiwgCi0JCQkJNCp3aWR0aC8xMCwgaGVpZ2h0LzIrd2lkdGgvNiwgMip3aWR0aC8xMCwgaGVpZ2h0LzIrd2lkdGgvNn0pOwotCi0JCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQotCQkvLyBzcXVhcmUKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUod2lkdGgvMiwgaGVpZ2h0LTc1LCA3NSwgNzUpOwotCQkKLQkJLy8gdHJpYW5nbGUKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSArIDE1KTsKLQkJZ2MuZmlsbFBvbHlnb24obmV3IGludFtde3dpZHRoLzIrNzUsIGhlaWdodC0oMio3NSksIHdpZHRoLzIrNzUsIGhlaWdodC03NSwgd2lkdGgvMisoMio3NSksIGhlaWdodC03NX0pOwotCQkKLQkJLy8gdHJpYW5nbGUKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSArIDMwKTsKLQkJZ2MuZmlsbFBvbHlnb24obmV3IGludFtde3dpZHRoLzIrODAsIGhlaWdodC0oMio3NSksIHdpZHRoLzIrKDIqNzUpLCBoZWlnaHQtKDIqNzUpLCB3aWR0aC8yKygyKjc1KSwgaGVpZ2h0LTgwfSk7Ci0JCQotCQkvLyB0cmlhbmdsZQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlICsgNDUpOwotCQlnYy5maWxsUG9seWdvbihuZXcgaW50W117d2lkdGgvMisoMio3NSksIGhlaWdodC0oMio3NSksIHdpZHRoLzIrKDMqNzUpLCBoZWlnaHQtKDIqNzUpLCB3aWR0aC8yKygzKjc1KSwgaGVpZ2h0LSgzKjc1KX0pOwotCQkKLQkJLy8gdHJpYW5nbGUKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSArIDYwKTsKLQkJZ2MuZmlsbFBvbHlnb24obmV3IGludFtde3dpZHRoLzIrKDIqNzUpLCBoZWlnaHQtKCgyKjc1KSs1KSwgd2lkdGgvMisoMio3NSksIGhlaWdodC0oMyo3NSksIHdpZHRoLzIrKCgzKjc1KS01KSwgaGVpZ2h0LSgzKjc1KX0pOwotCQkKLQkJLy8gc3F1YXJlCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUgKyA3NSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUod2lkdGgvMisoMyo3NSksIGhlaWdodC0oNCo3NSksIDc1LCA3NSk7Ci0JCQotCQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQkJCi0JCS8vIGNpcmNsZSBpbiB0b3AgcmlnaHQgY29ybmVyCi0JCWdjLnNldEFscGhhKGFscGhhVmFsdWUyKTsKLQkJZ2MuZmlsbE92YWwod2lkdGgtMTAwLCAwLCAxMDAsIDEwMCk7Ci0JCQotCQkvLyB0cmlhbmdsZQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlICsgOTApOwotCQlnYy5maWxsUG9seWdvbihuZXcgaW50W117d2lkdGgtMzAwLCAxMCwgd2lkdGgtMTAwLCAxMCwgd2lkdGgtMjc1LCA1MH0pOwotCQotCQkvLyB0cmlhbmdsZQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlICsgMTA1KTsKLQkJZ2MuZmlsbFBvbHlnb24obmV3IGludFtde3dpZHRoLTEwLCAxMDAsIHdpZHRoLTEwLCAzMDAsIHdpZHRoLTUwLCAyNzV9KTsKLQkJCi0JCS8vIHF1YWRyaWxhdGVyYWwgc2hhcGUKLQkJZ2Muc2V0QWxwaGEoYWxwaGFWYWx1ZSArIDEyMCk7Ci0JCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnRbXXt3aWR0aC0xMDAsIDEwMCwgd2lkdGgtMjAwLCAxNTAsIHdpZHRoLTIwMCwgMjAwLCB3aWR0aC0xNTAsIDIwMH0pOwotCQkKLQkJLy8gYmx1ZSBjaXJjbGVzCi0JCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCWludCBzaXplID0gNTA7Ci0JCWludCBhbHBoYSA9IDIwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCWdjLnNldEFscGhhKGFscGhhVmFsdWUgKyBhbHBoYSk7Ci0JCQlpZiAoaSAlIDIgPiAwKSB7Ci0JCQkJZ2MuZmlsbE92YWwod2lkdGgtKChpKzEpKnNpemUpLCBoZWlnaHQtc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWdjLmZpbGxPdmFsKHdpZHRoLSgoaSsxKSpzaXplKSwgaGVpZ2h0LSgzKnNpemUvMiksIHNpemUsIHNpemUpOwotCQkJfQotCQkJYWxwaGEgPSBhbHBoYSArIDIwOwotCQl9Ci0JCQotCQkvLyBTV1Qgc3RyaW5nIGFwcGVhcmluZyByYW5kb21seQotCQlnYy5zZXRBbHBoYShhbHBoYVZhbHVlMik7Ci0JCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKTsKLQkJRm9udCBmb250ID0gY3JlYXRlRm9udChkZXZpY2UsIDEwMCwgU1dULk5PTkUpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQkKLQkJUG9pbnQgdGV4dFNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JCWludCB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS54OwotCQlpbnQgdGV4dEhlaWdodCA9IHRleHRTaXplLnk7Ci0JCQotCQlpZiAoYWxwaGFWYWx1ZTIgPT0gMCl7Ci0JCQlyYW5kWCA9IChpbnQpKHdpZHRoKk1hdGgucmFuZG9tKCkpOwotCQkJcmFuZFkgPSAoaW50KShoZWlnaHQqTWF0aC5yYW5kb20oKSk7Ci0JCQlyYW5kWCA9IChyYW5kWCA+IHRleHRXaWR0aCkgPyByYW5kWCAtIHRleHRXaWR0aCA6IHJhbmRYOwotCQkJcmFuZFkgPSAocmFuZFkgPiB0ZXh0SGVpZ2h0KSA/IHJhbmRZIC0gdGV4dEhlaWdodCA6IHJhbmRZOwotCQl9Ci0JCQotCQlnYy5kcmF3U3RyaW5nKHRleHQsIHJhbmRYLCByYW5kWSwgdHJ1ZSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQkKLQkJLy8gZ3JheSBkb251dAotCQlnYy5zZXRBbHBoYSgxMDApOwotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoLmFkZEFyYygod2lkdGgtZGlhbWV0ZXIpLzIsIChoZWlnaHQtZGlhbWV0ZXIpLzIsIGRpYW1ldGVyLCBkaWFtZXRlciwgMCwgMzYwKTsKLQkJcGF0aC5jbG9zZSgpOwotCQlwYXRoLmFkZEFyYygod2lkdGgtZGlhbWV0ZXIrMjUpLzIsIChoZWlnaHQtZGlhbWV0ZXIrMjUpLzIsIGRpYW1ldGVyLTI1LCBkaWFtZXRlci0yNSwgMCwgMzYwKTsKLQkJcGF0aC5jbG9zZSgpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSkpOwotCQlnYy5maWxsUGF0aChwYXRoKTsKLQkJZ2MuZHJhd1BhdGgocGF0aCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZm9udCB1c2luZyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBpdC4KLQkgKiBUaGlzIG1ldGhvZCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHJlc2lkZW50IHBsYXRmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBmYWNlCi0JICogCQkJVGhlIG5hbWUgb2YgdGhlIGZvbnQKLQkgKiBAcGFyYW0gcG9pbnRzCi0JICogCQkJVGhlIHNpemUgb2YgdGhlIGZvbnQgaW4gcG9pbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAJCQlUaGUgc3R5bGUgdG8gYmUgYXBwbGllZCB0byB0aGUgZm9udAotCSAqLwotCXN0YXRpYyBGb250IGNyZWF0ZUZvbnQoRGV2aWNlIGRldmljZSwgaW50IHBvaW50cywgaW50IHN0eWxlKSB7CQkKLQkJaWYoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQkJcmV0dXJuIG5ldyBGb250KGRldmljZSwgIlZlcmRhbmEiLCBwb2ludHMsIHN0eWxlKTsJCi0JCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQkJcmV0dXJuIG5ldyBGb250KGRldmljZSwgIlRpbWVzIiwgcG9pbnRzLCBzdHlsZSk7CQkKLQkJfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQkJcmV0dXJuIG5ldyBGb250KGRldmljZSwgIkJhZWttdWsgQmF0YW5nIiwgcG9pbnRzLCBzdHlsZSk7CQkKLQkJfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQkJcmV0dXJuIG5ldyBGb250KGRldmljZSwgIlZlcmRhbmEiLCBwb2ludHMsIHN0eWxlKTsKLQkJfSBlbHNlIHsgLy8gcGhvdG9uCi0JCQlyZXR1cm4gbmV3IEZvbnQoZGV2aWNlLCAiVmVyZGFuYSIsIHBvaW50cywgc3R5bGUpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BbmltYXRlZEdyYXBoaWNzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9BbmltYXRlZEdyYXBoaWNzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNDQyZjMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQW5pbWF0ZWRHcmFwaGljc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgR3JhcGhpY3NUYWIgY2xhc3MgdG8gY3JlYXRlIGFuaW1hdGVkIGdyYXBoaWNzLgotICogKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbmltYXRlZEdyYXBoaWNzVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi0JVG9vbEJhciB0b29sQmFyOwotCVRvb2xJdGVtIHBsYXlJdGVtLCBwYXVzZUl0ZW07Ci0JU3Bpbm5lciB0aW1lclNwaW5uZXI7CQkvLyB0byBpbnB1dCB0aGUgc3BlZWQgb2YgdGhlIGFuaW1hdGlvbiAKLQlwcml2YXRlIGJvb2xlYW4gYW5pbWF0ZTsJLy8gZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBhbmltYXRlIHRoZSBncmFwaGljCi0KLQlwdWJsaWMgQW5pbWF0ZWRHcmFwaGljc1RhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCQlzdXBlcihleGFtcGxlKTsKLQkJYW5pbWF0ZSA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IG9mIHRoZSBjb21wb3NpdGUgdG8gUm93TGF5b3V0IGFuZCBjcmVhdGVzIHRoZSB0b29sYmFyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI2NyZWF0ZUNvbnRyb2xQYW5lbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCS8vIHNldHVwIGxheW91dAotCQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOwotCQlsYXlvdXQud3JhcCA9IHRydWU7Ci0JCWxheW91dC5zcGFjaW5nID0gODsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQkKLQkJY3JlYXRlVG9vbEJhcihwYXJlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0b29sYmFyIGNvbnRyb2xzOiBwbGF5LCBwYXVzZSBhbmQgYW5pbWF0aW9uIHRpbWVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgQSBjb21wb3NpdGUKLQkgKi8KLQl2b2lkIGNyZWF0ZVRvb2xCYXIoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQkJCQotCQl0b29sQmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuRkxBVCk7Ci0JCUxpc3RlbmVyIHRvb2xCYXJMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJCWNhc2UgU1dULlNlbGVjdGlvbjogewotCQkJCQkJaWYgKGV2ZW50LndpZGdldCA9PSBwbGF5SXRlbSkgewotCQkJCQkJCWFuaW1hdGUgPSB0cnVlOwotCQkJCQkJCXBsYXlJdGVtLnNldEVuYWJsZWQoIWFuaW1hdGUpOwotCQkJCQkJCXBhdXNlSXRlbS5zZXRFbmFibGVkKGFuaW1hdGUpOwotCQkJCQkJfSBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gcGF1c2VJdGVtKSB7Ci0JCQkJCQkJYW5pbWF0ZSA9IGZhbHNlOwotCQkJCQkJCXBsYXlJdGVtLnNldEVuYWJsZWQoIWFuaW1hdGUpOwotCQkJCQkJCXBhdXNlSXRlbS5zZXRFbmFibGVkKGFuaW1hdGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCS8vIHBsYXkgdG9vbCBpdGVtCi0JCXBsYXlJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJcGxheUl0ZW0uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBsYXkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGxheUl0ZW0uc2V0SW1hZ2UoZXhhbXBsZS5sb2FkSW1hZ2UoZGlzcGxheSwgInBsYXkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXBsYXlJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRvb2xCYXJMaXN0ZW5lcik7Ci0JCQotCQkvLyBwYXVzZSB0b29sIGl0ZW0KLQkJcGF1c2VJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJcGF1c2VJdGVtLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXVzZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlwYXVzZUl0ZW0uc2V0SW1hZ2UoZXhhbXBsZS5sb2FkSW1hZ2UoZGlzcGxheSwgInBhdXNlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlwYXVzZUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdG9vbEJhckxpc3RlbmVyKTsKLQkJCi0JCS8vIHRpbWVyIHNwaW5uZXIKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpOwotCQlsYWJlbC5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQW5pbWF0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCXRpbWVyU3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JCXRpbWVyU3Bpbm5lci5zZXRNYXhpbXVtKDEwMDApOwotCQkKLQkJcGxheUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFuaW1hdGUgPSB0cnVlOwotCi0JCXRpbWVyU3Bpbm5lci5zZXRTZWxlY3Rpb24oZ2V0SW5pdGlhbEFuaW1hdGlvblRpbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqICBBbnN3ZXIgd2hldGhlciB0aGUgcmVjZWl2ZXIncyBkcmF3aW5nIHNob3VsZCBiZSBkb3VibGUgYnVmZmVyZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RG91YmxlQnVmZmVyZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBpbml0aWFsIGFuaW1hdGlvbiB0aW1lIHRvIGJlIHVzZWQgYnkgdGhlIHRhYi4gQW5pbWF0aW9uIHRpbWU6Ci0JICogbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGRyYXdpbmcgYW5kIHRoZSBuZXh0ICh0aGUgdGltZQotCSAqIGludGVydmFsIGJldHdlZW4gY2FsbHMgdG8gdGhlIG5leHQgbWV0aG9kKS4gU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8KLQkgKiByZXR1cm4gYSB2YWx1ZSB0aGF0IGlzIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSB0YWIuCi0JICovCi0JcHVibGljIGludCBnZXRJbml0aWFsQW5pbWF0aW9uVGltZSgpIHsKLQkJcmV0dXJuIDMwOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBhbmltYXRpb24gdGltZSB0aGF0IGlzIHNlbGVjdGVkIGluIHRoZSBzcGlubmVyLiBBbmltYXRpb24gdGltZToKLQkgKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gdGhlIGN1cnJlbnQgZHJhd2luZyBhbmQgdGhlIG5leHQgKHRoZSB0aW1lCi0JICogaW50ZXJ2YWwgYmV0d2VlbiBjYWxscyB0byB0aGUgbmV4dCBtZXRob2QpLiBTaG91bGQgYmUgb3ZlcnJpZGRlbiB0bwotCSAqIHJldHVybiBhIHZhbHVlIHRoYXQgaXMgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHRhYi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEFuaW1hdGlvblRpbWUoKSB7Ci0JCXJldHVybiB0aW1lclNwaW5uZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRydWUgaWYgdGhlIHRhYiBpcyBjdXJyZW50bHkgYW5pbWF0ZWQ7IGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRBbmltYXRpb24oKSB7Ci0JCXJldHVybiBhbmltYXRlOwotCX0KLQkKLQkvKioKLQkgKiBDYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBzdG9wIG9yIHN0YXJ0LgotCSAqIAotCSAqIEBwYXJhbSBmbGFnCi0JICogICAgICAgICAgICB0cnVlIHN0YXJ0cyB0aGUgYW5pbWF0aW9uOyBmYWxzZSBzdG9wcyB0aGUgYW5pbWF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFuaW1hdGlvbihib29sZWFuIGZsYWcpIHsKLQkJYW5pbWF0ZSA9IGZsYWc7Ci0JCXBsYXlJdGVtLnNldEVuYWJsZWQoIWZsYWcpOwotCQlwYXVzZUl0ZW0uc2V0RW5hYmxlZChmbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiBBZHZhbmNlIHRoZSBhbmltYXRpb24uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQmFsbFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQmFsbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRiZTcxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0JhbGxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5EZXZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5UcmFuc2Zvcm07Ci0KLS8qKgotICogVGhpcyB0YWIgdXNlcyBhbHBoYSBibGVuZGluZyB0byBzaW11bGF0ZSAiZ2hvc3RpbmciIG9mIGEgYmFsbCBpbiBtb3ZlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEJhbGxUYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQotCUJhbGxDb2xsZWN0aW9uW10gYmM7Ci0KLQkvKioKLQkgKiBUaGlzIGlubmVyIGNsYXNzIHNlcnZlcyBhcyBhIGNvbnRhaW5lciBmb3IgdGhlIGRhdGEgbmVlZGVkIHRvIGRpc3BsYXkgYQotCSAqIGNvbGxlY3Rpb24gb2YgYmFsbHMuCi0JICovCi0Jc3RhdGljIGNsYXNzIEJhbGxDb2xsZWN0aW9uIHsKLQkJZmxvYXQgeCwgeTsgLy8gcG9zaXRpb24gb2YgYmFsbAotCQlmbG9hdCBpbmNYLCBpbmNZOyAvLyB2YWx1ZXMgYnkgd2hpY2ggdG8gbW92ZSB0aGUgYmFsbAotCQlpbnQgYmFsbF9zaXplOyAvLyBzaXplIChkaWFtZXRlcikgb2YgdGhlIGJhbGwKLQkJaW50IGNhcGFjaXR5OyAvLyBudW1iZXIgb2YgYmFsbHMgaW4gdGhlIGNvbGxlY3Rpb24KLQkJTGlua2VkTGlzdCBwcmV2eCwgcHJldnk7IC8vIGNvbGxlY3Rpb24gb2YgcHJldmlvdXMgeCBhbmQgeSBwb3NpdGlvbnMKLQkJCQkJCQkJIC8vIG9mIGJhbGwKLQkJQ29sb3JbXSBjb2xvcnM7IC8vIGNvbG9ycyB1c2VkIGZvciB0aGlzIGJhbGwgY29sbGVjdGlvbgotCi0JCXB1YmxpYyBCYWxsQ29sbGVjdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBpbmNYLCBmbG9hdCBpbmNZLAotCQkJCWludCBiYWxsX3NpemUsIGludCBjYXBhY2l0eSwgQ29sb3JbXSBjb2xvcnMpIHsKLQkJCXRoaXMueCA9IHg7Ci0JCQl0aGlzLnkgPSB5OwotCQkJdGhpcy5pbmNYID0gaW5jWDsKLQkJCXRoaXMuaW5jWSA9IGluY1k7Ci0JCQl0aGlzLmJhbGxfc2l6ZSA9IGJhbGxfc2l6ZTsKLQkJCXRoaXMuY2FwYWNpdHkgPSBjYXBhY2l0eTsKLQkJCXByZXZ4ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCXByZXZ5ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCXRoaXMuY29sb3JzID0gY29sb3JzOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJYmNbMF0gPSBiY1sxXSA9IGJjWzJdID0gYmNbM10gPSBiY1s0XSA9IG51bGw7Ci0JfQotCi0JcHVibGljIEJhbGxUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQkJc3VwZXIoZXhhbXBsZSk7Ci0JCWJjID0gbmV3IEJhbGxDb2xsZWN0aW9uWzVdOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFscGhhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJhbGwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJhbGxEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbEFuaW1hdGlvblRpbWUoKSB7Ci0JCXJldHVybiAxMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGJjLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYmNbaV0gPT0gbnVsbCkgcmV0dXJuOwotCQkJaWYgKGJjW2ldLnByZXZ4LnNpemUoKSA9PSAwKSB7Ci0JCQkJYmNbaV0ucHJldnguYWRkTGFzdChuZXcgRmxvYXQoYmNbaV0ueCkpOwotCQkJCWJjW2ldLnByZXZ5LmFkZExhc3QobmV3IEZsb2F0KGJjW2ldLnkpKTsKLQkJCX0gZWxzZSBpZiAoYmNbaV0ucHJldnguc2l6ZSgpID09IGJjW2ldLmNhcGFjaXR5KSB7Ci0JCQkJYmNbaV0ucHJldngucmVtb3ZlRmlyc3QoKTsKLQkJCQliY1tpXS5wcmV2eS5yZW1vdmVGaXJzdCgpOwotCQkJfQotCi0JCQliY1tpXS54ICs9IGJjW2ldLmluY1g7Ci0JCQliY1tpXS55ICs9IGJjW2ldLmluY1k7Ci0KLQkJCWZsb2F0IHJhbmRvbSA9IChmbG9hdCkgTWF0aC5yYW5kb20oKTsKLQotCQkJLy8gcmlnaHQKLQkJCWlmIChiY1tpXS54ICsgYmNbaV0uYmFsbF9zaXplID4gd2lkdGgpIHsKLQkJCQliY1tpXS54ID0gd2lkdGggLSBiY1tpXS5iYWxsX3NpemU7Ci0JCQkJYmNbaV0uaW5jWCA9IHJhbmRvbSAqIC13aWR0aCAvIDE2IC0gMTsKLQkJCX0KLQkJCS8vIGxlZnQKLQkJCWlmIChiY1tpXS54IDwgMCkgewotCQkJCWJjW2ldLnggPSAwOwotCQkJCWJjW2ldLmluY1ggPSByYW5kb20gKiB3aWR0aCAvIDE2ICsgMTsKLQkJCX0KLQkJCS8vIGJvdHRvbQotCQkJaWYgKGJjW2ldLnkgKyBiY1tpXS5iYWxsX3NpemUgPiBoZWlnaHQpIHsKLQkJCQliY1tpXS55ID0gKGhlaWdodCAtIGJjW2ldLmJhbGxfc2l6ZSkgLSAyOwotCQkJCWJjW2ldLmluY1kgPSByYW5kb20gKiAtaGVpZ2h0IC8gMTYgLSAxOwotCQkJfQotCQkJLy8gdG9wCi0JCQlpZiAoYmNbaV0ueSA8IDApIHsKLQkJCQliY1tpXS55ID0gMDsKLQkJCQliY1tpXS5pbmNZID0gcmFuZG9tICogaGVpZ2h0IC8gMTYgKyAxOwotCQkJfQotCQkJYmNbaV0ucHJldnguYWRkTGFzdChuZXcgRmxvYXQoYmNbaV0ueCkpOwotCQkJYmNbaV0ucHJldnkuYWRkTGFzdChuZXcgRmxvYXQoYmNbaV0ueSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQkJRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JCWlmIChiY1swXSA9PSBudWxsKSB7Ci0JCQliY1swXSA9IG5ldyBCYWxsQ29sbGVjdGlvbigwLCAwLCA1LCA1LCAyMCwgMjAsIG5ldyBDb2xvcltdIHsgZGV2aWNlCi0JCQkJCS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pIH0pOwotCQkJYmNbMV0gPSBuZXcgQmFsbENvbGxlY3Rpb24oNTAsIDMwMCwgMTAsIC01LCA1MCwgMTAsCi0JCQkJCW5ldyBDb2xvcltdIHsgZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSB9KTsKLQkJCWJjWzJdID0gbmV3IEJhbGxDb2xsZWN0aW9uKDI1MCwgMTAwLCAtNSwgOCwgMjUsIDEyLAotCQkJCQluZXcgQ29sb3JbXSB7IGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSB9KTsKLQkJCWJjWzNdID0gbmV3IEJhbGxDb2xsZWN0aW9uKDE1MCwgNDAwLCA1LCA4LCAzNSwgMTQsCi0JCQkJCW5ldyBDb2xvcltdIHsgZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykgfSk7Ci0JCQliY1s0XSA9IG5ldyBCYWxsQ29sbGVjdGlvbigxMDAsIDI1MCwgLTUsIC0xOCwgMTAwLCA1LAotCQkJCQluZXcgQ29sb3JbXSB7IGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSkgfSk7Ci0JCX0KLQotCQlmb3IgKGludCBqID0gMDsgaiA8IGJjLmxlbmd0aDsgaisrKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJjW2pdLnByZXZ4LnNpemUoKTsgaSsrKSB7Ci0JCQkJVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQkJCQl0cmFuc2Zvcm0udHJhbnNsYXRlKCgoRmxvYXQpIGJjW2pdLnByZXZ4LmdldChiY1tqXS5wcmV2eC5zaXplKCkKLQkJCQkJCS0gKGkgKyAxKSkpLmZsb2F0VmFsdWUoKSwgKChGbG9hdCkgYmNbal0ucHJldnkKLQkJCQkJCS5nZXQoYmNbal0ucHJldnkuc2l6ZSgpIC0gKGkgKyAxKSkpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQotCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCQkJcGF0aC5hZGRBcmMoMCwgMCwgYmNbal0uYmFsbF9zaXplLCBiY1tqXS5iYWxsX3NpemUsIDAsIDM2MCk7Ci0JCQkJZ2Muc2V0QWxwaGEoMjU1IC0gaSAqICgyNTUgLyBiY1tqXS5jYXBhY2l0eSkpOwotCQkJCWdjLnNldEJhY2tncm91bmQoYmNbal0uY29sb3JzWzBdKTsKLQkJCQlnYy5maWxsUGF0aChwYXRoKTsKLQkJCQlnYy5kcmF3UGF0aChwYXRoKTsKLQkJCQlwYXRoLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0JsYWNrSG9sZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQmxhY2tIb2xlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDFhMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQmxhY2tIb2xlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBCbGFja0hvbGVUYWIgZXh0ZW5kcyBBbmltYXRlZEdyYXBoaWNzVGFiIHsKLQkKLQlpbnQgc2l6ZSA9IDE7Ci0JCi1wdWJsaWMgQmxhY2tIb2xlVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCbGFja0hvbGUiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJsYWNrSG9sZURlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoc2l6ZSA+IHdpZHRoICogMyAvIDIpIHNpemUgPSAwOwotCWVsc2Ugc2l6ZSArPSAxMDsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQlnYy5maWxsT3ZhbCgod2lkdGggLSBzaXplKSAvIDIsIChoZWlnaHQgLSBzaXplKSAvIDIsIHNpemUsIHNpemUpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ2FyZHNUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NhcmRzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjU0N2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ2FyZHNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdmFyaW91cyB0cmFuc2Zvcm1hdGlvbnMsIHN1Y2ggYXMgc2NhbGluZywgcm90YXRpb24sIGFuZAotICogdHJhbnNsYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXJkc1RhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCQotCWZsb2F0IG1vdkNsdWJYLCBtb3ZDbHViWSwgbW92RGlhbW9uZFgsIG1vdkRpYW1vbmRZLCBtb3ZIZWFydCwgbW92U3BhZGU7Ci0JZmxvYXQgaW5jX2NsdWIgPSA1LjBmOwotCWZsb2F0IGluY19kaWFtb25kID0gNS4wZjsKLQlmbG9hdCBpbmNfaGVhcnRzID0gNS4wZjsKLQlmbG9hdCBpbmNfc3BhZGUgPSA1LjBmOwotCWZsb2F0IHNjYWxlLCBzY2FsZVdpZHRoOwotCWludCByb3RhdGlvbkFuZ2xlID0gMDsKLQlmbG9hdCBzY2FsZUFyZyA9IDA7Ci0JZmxvYXQgaGVhcnRTY2FsZSA9IDAuNWY7Ci0JZmxvYXQgc3BhZGVTY2FsZSA9IDAuMzMzZjsKLQlpbnQgY2x1YldpZHRoLCBkaWFtb25kV2lkdGgsIGhlYXJ0V2lkdGgsIHNwYWRlSGVpZ2h0OyAKLQkKLQlJbWFnZSBhY2VfY2x1YiwgYWNlX3NwYWRlLCBhY2VfZGlhbW9uZCwgYWNlX2hlYXJ0czsKLQotLyoqCi0gKiBDb25zdHJ1Y3RvcgotICogQHBhcmFtIGV4YW1wbGUgQSBHcmFwaGljc0V4YW1wbGUKLSAqLwotcHVibGljIENhcmRzVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHJhbnNmb3JtIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNhcmRzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDYXJkc0Rlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAoYWNlX2NsdWIgIT0gbnVsbCkgewotCQlhY2VfY2x1Yi5kaXNwb3NlKCk7Ci0JCWFjZV9jbHViID0gbnVsbDsKLQkJYWNlX3NwYWRlLmRpc3Bvc2UoKTsKLQkJYWNlX3NwYWRlID0gbnVsbDsKLQkJYWNlX2RpYW1vbmQuZGlzcG9zZSgpOwotCQlhY2VfZGlhbW9uZCA9IG51bGw7Ci0JCWFjZV9oZWFydHMuZGlzcG9zZSgpOwotCQlhY2VfaGVhcnRzID0gbnVsbDsKLQl9Ci19Ci1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCXJvdGF0aW9uQW5nbGUgPSAocm90YXRpb25BbmdsZSsxMCklMzYwOwotCi0JLy8gc2NhbGVWYWwgZ29lcyBmcm9tIDAgdG8gMSwgdGhlbiAxIHRvIDAsIHRoZW4gc3RhcnRzIG92ZXIKLQlzY2FsZUFyZyA9IChmbG9hdCkoKHNjYWxlQXJnID09IDEpID8gc2NhbGVBcmcgLSAwLjEgOiBzY2FsZUFyZyArIDAuMSk7Ci0Jc2NhbGUgPSAoZmxvYXQpTWF0aC5jb3Moc2NhbGVBcmcpOwotCQotCW1vdkNsdWJYICs9IGluY19jbHViOwotCW1vdkRpYW1vbmRYICs9IGluY19kaWFtb25kOwotCW1vdkhlYXJ0ICs9IGluY19oZWFydHM7Ci0JbW92U3BhZGUgKz0gaW5jX3NwYWRlOwotCQotCXNjYWxlV2lkdGggPSAoZmxvYXQpICgobW92Q2x1YlkvaGVpZ2h0KSowLjM1ICsgMC4xNSk7Ci0JbW92Q2x1YlkgPSAyKmhlaWdodC81ICogKGZsb2F0KU1hdGguc2luKDAuMDEqbW92Q2x1YlggLSA5MCkgKyAyKmhlaWdodC81OwotICAgIG1vdkRpYW1vbmRZID0gMipoZWlnaHQvNSAqIChmbG9hdClNYXRoLmNvcygwLjAxKm1vdkRpYW1vbmRYKSArIDIqaGVpZ2h0LzU7Ci0gICAgCi0gICAgaWYgKG1vdkNsdWJYICsgY2x1YldpZHRoKnNjYWxlV2lkdGggPiB3aWR0aCkgewotICAgIAltb3ZDbHViWCA9IHdpZHRoIC0gY2x1YldpZHRoKnNjYWxlV2lkdGg7Ci0gICAgICAgIGluY19jbHViID0gLWluY19jbHViOwotICAgIH0KLSAgICBpZiAobW92Q2x1YlggPCAwKSB7Ci0gICAgICAgIG1vdkNsdWJYID0gMDsKLSAgICAgICAgaW5jX2NsdWIgPSAtaW5jX2NsdWI7Ci0gICAgfQotICAgIGlmIChtb3ZEaWFtb25kWCArIGRpYW1vbmRXaWR0aCpzY2FsZVdpZHRoID4gd2lkdGgpIHsKLQkgICAgbW92RGlhbW9uZFggPSB3aWR0aCAtIGRpYW1vbmRXaWR0aCpzY2FsZVdpZHRoOwotICAgICAgICBpbmNfZGlhbW9uZCA9IC1pbmNfZGlhbW9uZDsKLSAgICB9Ci0gICAgaWYgKG1vdkRpYW1vbmRYIDwgMCkgewotCSAgICBtb3ZEaWFtb25kWCA9IDA7Ci0gICAgICAgIGluY19kaWFtb25kID0gLWluY19kaWFtb25kOwotICAgIH0KLSAgICBpZiAobW92SGVhcnQgKyBoZWFydFdpZHRoKmhlYXJ0U2NhbGUgPiB3aWR0aCkgewotICAgIAltb3ZIZWFydCA9IHdpZHRoIC0gaGVhcnRXaWR0aCpoZWFydFNjYWxlOwotICAgIAlpbmNfaGVhcnRzID0gLWluY19oZWFydHM7Ci0gICAgfQotICAgIGlmIChtb3ZIZWFydCA8IDApIHsKLSAgICAJbW92SGVhcnQgPSAwOwotICAgIAlpbmNfaGVhcnRzID0gLWluY19oZWFydHM7Ci0gICAgfQotICAgIGlmIChtb3ZTcGFkZSArIHNwYWRlSGVpZ2h0KnNwYWRlU2NhbGUgPiBoZWlnaHQpIHsKLSAgICAJbW92U3BhZGUgPSBoZWlnaHQgLSBzcGFkZUhlaWdodCpzcGFkZVNjYWxlOwotICAgIAlpbmNfc3BhZGUgPSAtaW5jX3NwYWRlOwotICAgIH0KLSAgICBpZiAobW92U3BhZGUgPCAwKSB7Ci0gICAgCW1vdlNwYWRlID0gMDsKLSAgICAJaW5jX3NwYWRlID0gLWluY19zcGFkZTsKLSAgICB9Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JaWYgKGFjZV9jbHViID09IG51bGwpIHsKLQkJYWNlX2NsdWIgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiYWNlX2NsdWIuanBnIik7Ci0JCWFjZV9zcGFkZSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJhY2Vfc3BhZGUuanBnIik7Ci0JCWFjZV9kaWFtb25kID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImFjZV9kaWFtb25kLmpwZyIpOwotCQlhY2VfaGVhcnRzID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImFjZV9oZWFydHMuanBnIik7Ci0JfQotCQotCWNsdWJXaWR0aCA9IGFjZV9jbHViLmdldEJvdW5kcygpLndpZHRoOwotCWRpYW1vbmRXaWR0aCA9IGFjZV9kaWFtb25kLmdldEJvdW5kcygpLndpZHRoOwotCWhlYXJ0V2lkdGggPSBhY2VfaGVhcnRzLmdldEJvdW5kcygpLndpZHRoOwotCXNwYWRlSGVpZ2h0ID0gYWNlX3NwYWRlLmdldEJvdW5kcygpLmhlaWdodDsKLQotCVRyYW5zZm9ybSB0cmFuc2Zvcm07Ci0JCi0JLy8gYWNlIG9mIGNsdWJzCQkKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgoaW50KW1vdkNsdWJYLCAoaW50KW1vdkNsdWJZKTsJCi0JdHJhbnNmb3JtLnNjYWxlKHNjYWxlV2lkdGgsIHNjYWxlV2lkdGgpOwotCQotCS8vIHJvdGF0ZSBvbiBjZW50ZXIgb2YgaW1hZ2UKLQlSZWN0YW5nbGUgcmVjdCA9IGFjZV9jbHViLmdldEJvdW5kcygpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUocmVjdC53aWR0aC8yLCByZWN0LmhlaWdodC8yKTsKLQl0cmFuc2Zvcm0ucm90YXRlKHJvdGF0aW9uQW5nbGUpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoLXJlY3Qud2lkdGgvMiwgLXJlY3QuaGVpZ2h0LzIpOwotCi0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQlnYy5kcmF3SW1hZ2UoYWNlX2NsdWIsIDAsIDApOwotCQotCS8vIGFjZSBvZiBkaWFtb25kcwotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKChpbnQpbW92RGlhbW9uZFgsIChpbnQpbW92RGlhbW9uZFkpOwotCXRyYW5zZm9ybS5zY2FsZShzY2FsZVdpZHRoLCBzY2FsZVdpZHRoKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCWdjLmRyYXdJbWFnZShhY2VfZGlhbW9uZCwgMCwgMCk7Ci0KLQkvLyBhY2Ugb2YgaGVhcnRzCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUobW92SGVhcnQsIGhlaWdodC8yKTsKLQl0cmFuc2Zvcm0uc2NhbGUoaGVhcnRTY2FsZSwgMC41ZipzY2FsZSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQlnYy5kcmF3SW1hZ2UoYWNlX2hlYXJ0cywgMCwgMCk7Ci0JCi0JLy8gYWNlIG9mIHNwYWRlcwotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKG1vdlNwYWRlLCBtb3ZTcGFkZSk7Ci0JdHJhbnNmb3JtLnNjYWxlKDAuNWYqc2NhbGUsIHNwYWRlU2NhbGUpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JZ2MuZHJhd0ltYWdlKGFjZV9zcGFkZSwgMCwgMCk7Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NvbG9yTGlzdGVuZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NvbG9yTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyZDgwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Db2xvckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLS8qKgotICogVXNlZCB0byBwZXJmb3JtIGFuIGFjdGlvbiBhZnRlciBhbiBpdGVtIGluIGEgTWVudSBoYXMgYmVlbiBzZWxlY3RlZC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuQ29sb3JNZW51LmphdmEKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzQmFja2dyb3VuZC5qYXZhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sb3JMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpOwotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9Db2xvck1lbnUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NvbG9yTWVudS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVkMDdjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NvbG9yTWVudS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHV0aWxpemVzIHRoZSBmYWN0b3J5IGRlc2lnbiBwYXR0ZXJuIHRvIGNyZWF0ZSBtZW51cyB0aGF0IG1heQotICogY29udGFpbiBjb2xvciBpdGVtcywgcGF0dGVybiBpdGVtcyBhbmQgZ3JhZGllbnQgaXRlbXMuIFRvIGNyZWF0ZSBhIG1lbnU6Ci0gKiBmaXJzdCBzZXQgdGhlIG1lbnUgaXRlbXMgdGhhdCB5b3Ugd2lzaCB0byBoYXZlIGFwcGVhciBpbiB0aGUgbWVudSBieSBjYWxsaW5nCi0gKiB0aGUgc2V0dGVycyAoc2V0Q29sb3JJdGVtcygpLCBzZXRQYXR0ZXJuSXRlbXMoKSwgc2V0R3JhZGllbnRJdGVtcygpKSwgYW5kCi0gKiB0aGVuIGNhbGwgY3JlYXRlTWVudSgpIHRvIGdldCBhbiBpbnN0YW5jZSBvZiBhIG1lbnUuIEJ5IGRlZmF1bHQsIHRoZSBtZW51Ci0gKiB3aWxsIGNvbnRhaW4gY29sb3IgaXRlbXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xvck1lbnUgewotCi0JYm9vbGVhbiBlbmFibGVDb2xvckl0ZW1zLCBlbmFibGVQYXR0ZXJuSXRlbXMsIGVuYWJsZUdyYWRpZW50SXRlbXM7Ci0JCi0JcHVibGljIENvbG9yTWVudSgpIHsKLQkJZW5hYmxlQ29sb3JJdGVtcyA9IHRydWU7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3QgdGhlIGNvbG9yIG1lbnUgaXRlbXMgd2lsbCBhcHBlYXIgaW4KLQkgKiB0aGUgbWVudS4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlCi0JICogICAgICAgICAgICBBIGJvb2xlYW4gZmxhZyAtIHRydWUgdG8gbWFrZSB0aGUgY29sb3IgbWVudSBpdGVtcyB2aXNpYmxlIGluCi0JICogICAgICAgICAgICB0aGUgbWVudTsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbG9ySXRlbXMoYm9vbGVhbiBlbmFibGUpIHsKLQkJZW5hYmxlQ29sb3JJdGVtcyA9IGVuYWJsZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIGNvbG9yIG1lbnUgaXRlbXMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgbWVudTsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29sb3JJdGVtcygpIHsKLQkJcmV0dXJuIGVuYWJsZUNvbG9ySXRlbXM7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3QgdGhlIHBhdHRlcm4gbWVudSBpdGVtcyB3aWxsIGFwcGVhcgotCSAqIGluIHRoZSBtZW51LgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGUKLQkgKiAgICAgICAgICAgIEEgYm9vbGVhbiBmbGFnIC0gdHJ1ZSB0byBtYWtlIHRoZSBwYXR0ZXJuIG1lbnUgaXRlbXMgdmlzaWJsZQotCSAqICAgICAgICAgICAgaW4gdGhlIG1lbnU7IGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuSXRlbXMoYm9vbGVhbiBlbmFibGUpIHsKLQkJZW5hYmxlUGF0dGVybkl0ZW1zID0gZW5hYmxlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgcGF0dGVybiBtZW51IGl0ZW1zIGFyZSBjb250YWluZWQgaW4gdGhlIG1lbnU7IGZhbHNlIG90aGVyd2lzZS4KLQkgKiAqLwotCXB1YmxpYyBib29sZWFuIGdldFBhdHRlcm5JdGVtcygpIHsKLQkJcmV0dXJuIGVuYWJsZVBhdHRlcm5JdGVtczsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0aGUgZ3JhZGllbnQgbWVudSBpdGVtcyB3aWxsIGFwcGVhcgotCSAqIGluIHRoZSBtZW51LgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGUKLQkgKiAgICAgICAgICAgIEEgYm9vbGVhbiBmbGFnIC0gdHJ1ZSB0byBtYWtlIHRoZSBncmFkaWVudCBtZW51IGl0ZW1zIHZpc2libGUKLQkgKiAgICAgICAgICAgIGluIHRoZSBtZW51OyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JhZGllbnRJdGVtcyhib29sZWFuIGVuYWJsZSkgewotCQllbmFibGVHcmFkaWVudEl0ZW1zID0gZW5hYmxlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgZ3JhZGllbnQgbWVudSBpdGVtcyBhcmUgY29udGFpbmVkIGluIHRoZSBtZW51OyBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0R3JhZGllbnRJdGVtcygpIHsKLQkJcmV0dXJuIGVuYWJsZUdyYWRpZW50SXRlbXM7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIG1lbnUgYmFzZWQgb24gdGhlIHNldHRpbmdzIHByb3ZpZGVkIHZpYQotCSAqIHNldENvbG9ySXRlbXMoKSwgc2V0UGF0dGVybkl0ZW1zKCkgYW5kIHNldEdyYWRpZW50SXRlbXMoKQotCSAqIAotCSAqIEByZXR1cm4gQSBtZW51IGJhc2VkIG9uIHRoZSBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyBNZW51IGNyZWF0ZU1lbnUoQ29udHJvbCBwYXJlbnQsIENvbG9yTGlzdGVuZXIgY2wpIHsKLQkJTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkKLQkJTWVudUl0ZW1MaXN0ZW5lciBtZW51SXRlbUxpc3RlbmVyID0gY3JlYXRlTWVudUl0ZW1MaXN0ZW5lcihwYXJlbnQpOwotCQltZW51LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG1lbnVJdGVtTGlzdGVuZXIpOwotCQltZW51LmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBtZW51SXRlbUxpc3RlbmVyKTsKLQkJbWVudUl0ZW1MaXN0ZW5lci5zZXRDb2xvckxpc3RlbmVyKGNsKTsKLQotCQlpZiAoZW5hYmxlQ29sb3JJdGVtcykgewotCQkJYWRkQ29sb3JJdGVtcyhtZW51LCBtZW51SXRlbUxpc3RlbmVyLCBtZW51SXRlbUxpc3RlbmVyLmdldE1lbnVSZXNvdXJjZXMoKSk7Ci0JCX0KLQkJaWYgKGVuYWJsZVBhdHRlcm5JdGVtcykgewotCQkJYWRkUGF0dGVybkl0ZW1zKG1lbnUsIG1lbnVJdGVtTGlzdGVuZXIsIG1lbnVJdGVtTGlzdGVuZXIuZ2V0TWVudVJlc291cmNlcygpKTsKLQkJfQotCQlpZiAoZW5hYmxlR3JhZGllbnRJdGVtcykgewotCQkJYWRkR3JhZGllbnRJdGVtcyhtZW51LCBtZW51SXRlbUxpc3RlbmVyKTsKLQkJfQotCQlyZXR1cm4gbWVudTsKLQl9Ci0JCi0JLyoqIEFkZHMgdGhlIGNvbG9ycyBpdGVtcyB0byB0aGUgbWVudS4gKi8KLQlwcml2YXRlIHZvaWQgYWRkQ29sb3JJdGVtcyhNZW51IG1lbnUsIE1lbnVJdGVtTGlzdGVuZXIgbWVudUxpc3RlbmVyLAotCQkJQXJyYXlMaXN0IG1lbnVSZXNvdXJjZXMpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbWVudS5nZXREaXNwbGF5KCk7Ci0JCQotCQlpZiAobWVudS5nZXRJdGVtQ291bnQoKSAhPSAwKSB7Ci0JCQluZXcgTWVudUl0ZW0obWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCX0KLQkJCi0JCS8vIGNvbG9yIG5hbWVzCi0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tdewotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJXaGl0ZSIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJsYWNrIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVkIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JlZW4iKSwgLy8kTk9OLU5MUy0xJAotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJCbHVlIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiWWVsbG93IiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3lhbiIpLCAvLyROT04tTkxTLTEkCi0JCX07Ci0JCQotCQkvLyBjb2xvcnMgbmVlZGVkIGZvciB0aGUgYmFja2dyb3VuZCBtZW51Ci0JCUNvbG9yW10gY29sb3JzID0gbmV3IENvbG9yW117Ci0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQ1lBTiksCi0JCX07Ci0JCi0JCS8vIGFkZCBzdGFuZGFyZCBjb2xvciBpdGVtcyB0byBtZW51Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KG5hbWVzW2ldKTsKLQkJCWl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbWVudUxpc3RlbmVyKTsKLQkJCUNvbG9yIGNvbG9yID0gY29sb3JzW2ldOwotCQkJR3JhcGhpY3NCYWNrZ3JvdW5kIGdiID0gbmV3IEdyYXBoaWNzQmFja2dyb3VuZCgpOwotCQkJSW1hZ2UgaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUuY3JlYXRlSW1hZ2UoZGlzcGxheSwgY29sb3IpOwotCQkJZ2Iuc2V0QmdDb2xvcjEoY29sb3IpOwotCQkJZ2Iuc2V0QmdJbWFnZShpbWFnZSk7Ci0JCQlnYi5zZXRUaHVtYk5haWwoaW1hZ2UpOwotCQkJbWVudVJlc291cmNlcy5hZGQoaW1hZ2UpOwotCQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQlpdGVtLnNldERhdGEoZ2IpOwotCQl9Ci0JCQotCQkvLyBhZGQgY3VzdG9tIGNvbG9yIGl0ZW0gdG8gbWVudQotCQltZW51TGlzdGVuZXIuY3VzdG9tQ29sb3JNSSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCW1lbnVMaXN0ZW5lci5jdXN0b21Db2xvck1JLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXN0b21Db2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TGlzdGVuZXIuY3VzdG9tQ29sb3JNSS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBtZW51TGlzdGVuZXIpOwotCQlHcmFwaGljc0JhY2tncm91bmQgZ2IgPSBuZXcgR3JhcGhpY3NCYWNrZ3JvdW5kKCk7Ci0JCW1lbnVMaXN0ZW5lci5jdXN0b21Db2xvck1JLnNldERhdGEoZ2IpOwkJCi0JfQotCQotCS8qKiBBZGRzIHRoZSBwYXR0ZXJuIGl0ZW1zIHRvIHRoZSBtZW51LiAqLwotCXByaXZhdGUgdm9pZCBhZGRQYXR0ZXJuSXRlbXMoTWVudSBtZW51LCBNZW51SXRlbUxpc3RlbmVyIG1lbnVMaXN0ZW5lciwKLQkJCUFycmF5TGlzdCBtZW51UmVzb3VyY2VzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG1lbnUuZ2V0RGlzcGxheSgpOwotCQkKLQkJaWYgKG1lbnUuZ2V0SXRlbUNvdW50KCkgIT0gMCkgewotCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQl9Ci0JCQotCQkvLyBwYXR0ZXJuIG5hbWVzCi0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tdewotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXR0ZXJuMSIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdHRlcm4yIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGF0dGVybjMiKSwgLy8kTk9OLU5MUy0xJAotCQl9OwotCQkKLQkJLy8gcGF0dGVybiBpbWFnZXMKLQkJSW1hZ2VbXSBpbWFnZXMgPSBuZXcgSW1hZ2VbXXsKLQkJCWxvYWRJbWFnZShkaXNwbGF5LCAicGF0dGVybjEuanBnIiwgbWVudVJlc291cmNlcyksCQotCQkJbG9hZEltYWdlKGRpc3BsYXksICJwYXR0ZXJuMi5qcGciLCBtZW51UmVzb3VyY2VzKSwKLQkJCWxvYWRJbWFnZShkaXNwbGF5LCAicGF0dGVybjMuanBnIiwgbWVudVJlc291cmNlcyksCi0JCX07Ci0JCQotCQkvLyBhZGQgdGhlIHByZS1kZWZpbmVkIHBhdHRlcm5zIHRvIHRoZSBtZW51Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KG5hbWVzW2ldKTsKLQkJCWl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbWVudUxpc3RlbmVyKTsKLQkJCUltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJR3JhcGhpY3NCYWNrZ3JvdW5kIGdiID0gbmV3IEdyYXBoaWNzQmFja2dyb3VuZCgpOwkJCQotCQkJZ2Iuc2V0QmdJbWFnZShpbWFnZSk7Ci0JCQlnYi5zZXRUaHVtYk5haWwoaW1hZ2UpOwotCQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCQlpdGVtLnNldERhdGEoZ2IpOwotCQl9Ci0JCQotCQkvLyBhZGQgdGhlIGN1c3RvbSBwYXR0ZXJuIGl0ZW0JCi0JCW1lbnVMaXN0ZW5lci5jdXN0b21QYXR0ZXJuTUkgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQltZW51TGlzdGVuZXIuY3VzdG9tUGF0dGVybk1JLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXN0b21QYXR0ZXJuIikpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVMaXN0ZW5lci5jdXN0b21QYXR0ZXJuTUkuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbWVudUxpc3RlbmVyKTsKLQkJR3JhcGhpY3NCYWNrZ3JvdW5kIGdiID0gbmV3IEdyYXBoaWNzQmFja2dyb3VuZCgpOwotCQltZW51TGlzdGVuZXIuY3VzdG9tUGF0dGVybk1JLnNldERhdGEoZ2IpOwkJCQotCX0KLQkKLQkvKiogQWRkcyB0aGUgZ3JhZGllbnQgbWVudSBpdGVtLiAqLwotCXByaXZhdGUgdm9pZCBhZGRHcmFkaWVudEl0ZW1zKE1lbnUgbWVudSwgTWVudUl0ZW1MaXN0ZW5lciBtZW51TGlzdGVuZXIpIHsKLQkJaWYgKG1lbnUuZ2V0SXRlbUNvdW50KCkgIT0gMCkgewotCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQl9Ci0JCW1lbnVMaXN0ZW5lci5jdXN0b21HcmFkaWVudE1JID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJbWVudUxpc3RlbmVyLmN1c3RvbUdyYWRpZW50TUkuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRpZW50IikpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVMaXN0ZW5lci5jdXN0b21HcmFkaWVudE1JLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG1lbnVMaXN0ZW5lcik7Ci0JCUdyYXBoaWNzQmFja2dyb3VuZCBnYiA9IG5ldyBHcmFwaGljc0JhY2tncm91bmQoKTsKLQkJbWVudUxpc3RlbmVyLmN1c3RvbUdyYWRpZW50TUkuc2V0RGF0YShnYik7Ci0JfQotCQotCS8qKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBsaXN0ZW5lciBmb3IgbWVudSBpdGVtcy4gKi8KLQlwcml2YXRlIE1lbnVJdGVtTGlzdGVuZXIgY3JlYXRlTWVudUl0ZW1MaXN0ZW5lcihmaW5hbCBDb250cm9sIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE1lbnVJdGVtTGlzdGVuZXIocGFyZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBJbWFnZSB1c2luZyBvbiB0aGUgcGF0aCBvZiBhbiBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheQotCSAqICAgICAgICAgICAgQSBEaXNwbGF5Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIG9mIHRoZSBpbWFnZSBmaWxlCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqICAgICAgICAgICAgVGhlIGxpc3Qgb2YgcmVzb3VyY2VzIG9mIHRoZSBtZW51Ci0JICovCi0JcHJpdmF0ZSBJbWFnZSBsb2FkSW1hZ2UoRGlzcGxheSBkaXNwbGF5LCBTdHJpbmcgbmFtZSwgQXJyYXlMaXN0IHJlc291cmNlcykgewotCQlJbWFnZSBpbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGlzcGxheSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCBuYW1lKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHJlc291cmNlcy5hZGQoaW1hZ2UpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQW4gaW5uZXIgY2xhc3MgdXNlZCBhcyBhIGxpc3RlbmVyIGZvciBNZW51SXRlbXMgYWRkZWQgdG8gdGhlIG1lbnUuCi0JICovCi0Jc3RhdGljIGNsYXNzIE1lbnVJdGVtTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCU1lbnVJdGVtIGN1c3RvbUNvbG9yTUksIGN1c3RvbVBhdHRlcm5NSSwgY3VzdG9tR3JhZGllbnRNSTsJLy8gY3VzdG9tIG1lbnUgaXRlbXMKLQkJQ29udHJvbCBwYXJlbnQ7Ci0JCUltYWdlIGN1c3RvbUltYWdlLCBjdXN0b21JbWFnZVRodW1iOwotCQlDb2xvciBjdXN0b21Db2xvcjsKLQkJR3JhcGhpY3NCYWNrZ3JvdW5kIGJhY2tncm91bmQ7CS8vIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhY2tncm91bmQKLQkJQ29sb3JMaXN0ZW5lciBjb2xvckxpc3RlbmVyOwotCQlBcnJheUxpc3QgcmVzb3VyY2VzOwotCQkKLQkJcHVibGljIE1lbnVJdGVtTGlzdGVuZXIoQ29udHJvbCBwYXJlbnQpewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7IAotCQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCS8qKgotCQkgKiBNZXRob2QgdXNlZCB0byBzZXQgdGhlIENvbG9yTGlzdGVuZXIKLQkJICogCi0JCSAqIEBwYXJhbSBjbAotCQkgKiAgICAgICAgICAgIEEgQ29sb3JMaXN0ZW5lcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5Db2xvckxpc3RlbmVyLmphdmEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldENvbG9yTGlzdGVuZXIoQ29sb3JMaXN0ZW5lciBjbCkgewotCQkJdGhpcy5jb2xvckxpc3RlbmVyID0gY2w7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBcnJheUxpc3QgZ2V0TWVudVJlc291cmNlcygpIHsKLQkJCXJldHVybiByZXNvdXJjZXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0KLQkJCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJKChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5TZWxlY3Rpb246Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gZXZlbnQuZGlzcGxheTsKLQkJCQlNZW51SXRlbSBpdGVtID0gKE1lbnVJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJaWYgKGN1c3RvbUNvbG9yTUkgPT0gaXRlbSkgewotCQkJCQlDb2xvckRpYWxvZyBkaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2cocGFyZW50LmdldFNoZWxsKCkpOwotCQkJCQlpZiAoY3VzdG9tQ29sb3IgIT0gbnVsbCAmJiAhY3VzdG9tQ29sb3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlkaWFsb2cuc2V0UkdCKGN1c3RvbUNvbG9yLmdldFJHQigpKTsKLQkJCQkJfQotCQkJCQlSR0IgcmdiID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWlmIChjdXN0b21Db2xvciAhPSBudWxsKSBjdXN0b21Db2xvci5kaXNwb3NlKCk7Ci0JCQkJCWN1c3RvbUNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCQkJCWlmIChjdXN0b21QYXR0ZXJuTUkgIT0gbnVsbCkgY3VzdG9tUGF0dGVybk1JLnNldEltYWdlKG51bGwpOwotCQkJCQlpZiAoY3VzdG9tR3JhZGllbnRNSSAhPSBudWxsKSBjdXN0b21HcmFkaWVudE1JLnNldEltYWdlKG51bGwpOwotCQkJCQlpZiAoY3VzdG9tSW1hZ2UgIT0gbnVsbCkgY3VzdG9tSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQljdXN0b21JbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5jcmVhdGVJbWFnZShkaXNwbGF5LCBjdXN0b21Db2xvcik7Ci0JCQkJCUdyYXBoaWNzQmFja2dyb3VuZCBnYiA9IG5ldyBHcmFwaGljc0JhY2tncm91bmQoKTsKLQkJCQkJZ2Iuc2V0QmdJbWFnZShjdXN0b21JbWFnZSk7Ci0JCQkJCWdiLnNldFRodW1iTmFpbChjdXN0b21JbWFnZSk7Ci0JCQkJCWdiLnNldEJnQ29sb3IxKGN1c3RvbUNvbG9yKTsKLQkJCQkJaXRlbS5zZXREYXRhKGdiKTsKLQkJCQkJaXRlbS5zZXRJbWFnZShjdXN0b21JbWFnZSk7Ci0JCQkJCXJlc291cmNlcy5hZGQoY3VzdG9tQ29sb3IpOwotCQkJCQlyZXNvdXJjZXMuYWRkKGN1c3RvbUltYWdlKTsKLQkJCQl9IGVsc2UgaWYgKGN1c3RvbVBhdHRlcm5NSSA9PSBpdGVtKSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cocGFyZW50LmdldFNoZWxsKCkpOwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi5qcGciLCAiKi5naWYiLAkiKi4qIiB9KTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAobmFtZSA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWlmIChjdXN0b21Db2xvck1JICE9IG51bGwpIGN1c3RvbUNvbG9yTUkuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJCWlmIChjdXN0b21HcmFkaWVudE1JICE9IG51bGwpIGN1c3RvbUdyYWRpZW50TUkuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJCWlmIChjdXN0b21Db2xvciAhPSBudWxsKSBjdXN0b21Db2xvci5kaXNwb3NlKCk7Ci0JCQkJCWlmIChjdXN0b21JbWFnZSAhPSBudWxsKSBjdXN0b21JbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWlmIChjdXN0b21JbWFnZVRodW1iICE9IG51bGwpIGN1c3RvbUltYWdlVGh1bWIuZGlzcG9zZSgpOwotCQkJCQljdXN0b21JbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBuYW1lKTsKLQkJCQkJY3VzdG9tSW1hZ2VUaHVtYiA9IEdyYXBoaWNzRXhhbXBsZS5jcmVhdGVUaHVtYm5haWwoZGlzcGxheSwgbmFtZSk7Ci0JCQkJCUdyYXBoaWNzQmFja2dyb3VuZCBnYiA9IG5ldyBHcmFwaGljc0JhY2tncm91bmQoKTsKLQkJCQkJZ2Iuc2V0QmdJbWFnZShjdXN0b21JbWFnZSk7Ci0JCQkJCWdiLnNldFRodW1iTmFpbChjdXN0b21JbWFnZVRodW1iKTsKLQkJCQkJaXRlbS5zZXREYXRhKGdiKTsKLQkJCQkJaXRlbS5zZXRJbWFnZShjdXN0b21JbWFnZVRodW1iKTsKLQkJCQkJcmVzb3VyY2VzLmFkZChjdXN0b21JbWFnZVRodW1iKTsKLQkJCQl9IGVsc2UgaWYgKGN1c3RvbUdyYWRpZW50TUkgPT0gaXRlbSkgewotCQkJCQlHcmFkaWVudERpYWxvZyBkaWFsb2cgPSBuZXcgR3JhZGllbnREaWFsb2cocGFyZW50LmdldFNoZWxsKCkpOwotCQkJCQlpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpICE9IG51bGwpCi0JCQkJCQkJZGlhbG9nLnNldEZpcnN0UkdCKGJhY2tncm91bmQuZ2V0QmdDb2xvcjEoKS5nZXRSR0IoKSk7Ci0JCQkJCQlpZiAoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMigpICE9IG51bGwpCi0JCQkJCQkJZGlhbG9nLnNldFNlY29uZFJHQihiYWNrZ3JvdW5kLmdldEJnQ29sb3IyKCkuZ2V0UkdCKCkpOwkJCQkJCQotCQkJCQl9CQkJCQkKLQkJCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gU1dULk9LKSByZXR1cm47Ci0JCQkJCUNvbG9yIGNvbG9yQSA9IG5ldyBDb2xvcihkaXNwbGF5LCBkaWFsb2cuZ2V0Rmlyc3RSR0IoKSk7Ci0JCQkJCUNvbG9yIGNvbG9yQiA9IG5ldyBDb2xvcihkaXNwbGF5LCBkaWFsb2cuZ2V0U2Vjb25kUkdCKCkpOwotCQkJCQlpZiAoY29sb3JBID09IG51bGwgfHwgY29sb3JCID09IG51bGwpIHJldHVybjsKLQkJCQkJaWYgKGN1c3RvbUNvbG9yTUkgIT0gbnVsbCkgY3VzdG9tQ29sb3JNSS5zZXRJbWFnZShudWxsKTsKLQkJCQkJaWYgKGN1c3RvbVBhdHRlcm5NSSAhPSBudWxsKSBjdXN0b21QYXR0ZXJuTUkuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJCWlmIChjdXN0b21Db2xvciAhPSBudWxsKSBjdXN0b21Db2xvci5kaXNwb3NlKCk7Ci0JCQkJCWlmIChjdXN0b21JbWFnZSAhPSBudWxsKSBjdXN0b21JbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWN1c3RvbUltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmNyZWF0ZUltYWdlKGRpc3BsYXksIGNvbG9yQSwgCi0JCQkJCQkJY29sb3JCLCAxNiwgMTYpOwotCQkJCQlHcmFwaGljc0JhY2tncm91bmQgZ2IgPSBuZXcgR3JhcGhpY3NCYWNrZ3JvdW5kKCk7Ci0JCQkJCWdiLnNldEJnSW1hZ2UoY3VzdG9tSW1hZ2UpOwotCQkJCQlnYi5zZXRUaHVtYk5haWwoY3VzdG9tSW1hZ2UpOwotCQkJCQlnYi5zZXRCZ0NvbG9yMShjb2xvckEpOwotCQkJCQlnYi5zZXRCZ0NvbG9yMihjb2xvckIpOwotCQkJCQlpdGVtLnNldERhdGEoZ2IpOwotCQkJCQlpdGVtLnNldEltYWdlKGN1c3RvbUltYWdlKTsKLQkJCQkJcmVzb3VyY2VzLmFkZChjb2xvckEpOwotCQkJCQlyZXNvdXJjZXMuYWRkKGNvbG9yQik7Ci0JCQkJCXJlc291cmNlcy5hZGQoY3VzdG9tSW1hZ2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChjdXN0b21Db2xvck1JICE9IG51bGwpIGN1c3RvbUNvbG9yTUkuc2V0SW1hZ2UobnVsbCk7Ci0JCQkJCWlmIChjdXN0b21QYXR0ZXJuTUkgIT0gbnVsbCkgY3VzdG9tUGF0dGVybk1JLnNldEltYWdlKG51bGwpOwotCQkJCQlpZiAoY3VzdG9tR3JhZGllbnRNSSAhPSBudWxsKSBjdXN0b21HcmFkaWVudE1JLnNldEltYWdlKG51bGwpOwotCQkJCX0KLQkJCQliYWNrZ3JvdW5kID0gKEdyYXBoaWNzQmFja2dyb3VuZCkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJY29sb3JMaXN0ZW5lci5zZXRDb2xvcihiYWNrZ3JvdW5kKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0NvdW50RG93blRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ291bnREb3duVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODM1MzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvQ291bnREb3duVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgcHJlc2VudHMgYSBjb3VudCBkb3duIGZyb20gNSB0byAxLCB0aGVuIGRpc3BsYXlzIFNXVC4KLSAqICovCi1wdWJsaWMgY2xhc3MgQ291bnREb3duVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0KLQlmaW5hbCBpbnQgc3RhcnROdW1iZXIgPSA1OwkJCS8vIG51bWJlciBhdCB3aGljaCB0byBzdGFydCB0aGUgY291bnRkb3duCi0JaW50IG5leHROdW1iZXIgPSBzdGFydE51bWJlcjsJCS8vIG5leHQgbnVtYmVyIHRvIGJlIGRpc3BsYXllZAotCWludCBhbmdsZSA9IC05MDsJCQkJCS8vIGFuZ2xlIHVzZWQgdG8gcm90YXRlIHRoZSBiYXIKLQotCVNwaW5uZXIgbGluZVdpZHRoU3Bpbm5lcjsJCQkvLyBzcGlubmVyIGZvciBsaW5lIHdpZHRoCi0JQ29tYm8gYWxpYXNDb21ibywgbGluZUNhcENvbWJvOwkJLy8gY29tYm8gZm9yIGFsaWFzIHR5cGUgYW5kIGxpbmUgY2FwCi0JaW50IGFudGlhbGlhcywgbGluZUNhcDsJCQkJLy8gYW50aWFsaWFzIGFuZCBsaW5lY2FwIHZhbHVlcwotCWludFtdIGNhcFZhbHVlcyA9IHsgU1dULkNBUF9GTEFULCBTV1QuQ0FQX1NRVUFSRSwgU1dULkNBUF9ST1VORCB9OwotCWludFtdIGFsaWFzVmFsdWVzID0geyBTV1QuREVGQVVMVCwgU1dULk9GRiwgU1dULk9OIH07Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBleGFtcGxlCi0JICogICAgICAgICAgICBBIEdyYXBoaWNzRXhhbXBsZQotCSAqLwotCXB1YmxpYyBDb3VudERvd25UYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQkJc3VwZXIoZXhhbXBsZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgY29udHJvbHMgc3BlY2lmaWMgdG8gdGhlIHRhYi4gVGhlIGNhbGwgdG8gdGhlCi0JICogY3JlYXRlQ29udHJvbFBhbmVsIG1ldGhvZCBpbiB0aGUgc3VwZXIgY2xhc3MgY3JlYXRlIHRoZSBjb250cm9scyB0aGF0IGFyZQotCSAqIGRlZmluZWQgaW4gdGhlIHN1cGVyIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbFBhbmVsKHBhcmVudCk7Ci0KLQkJaWYgKG5leHROdW1iZXIgPCAxKQotCQkJbmV4dE51bWJlciA9IHN0YXJ0TnVtYmVyOwotCi0JCS8vIGFkZCBzZWxlY3Rpb24gbGlzdGVuZXIgdG8gcmVzZXQgbmV4dE51bWJlciBhZnRlcgotCQkvLyB0aGUgc2VxdWVuY2UgaGFzIGNvbXBsZXRlZAotCQlwbGF5SXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChuZXh0TnVtYmVyIDwgMSkKLQkJCQkJbmV4dE51bWJlciA9IHN0YXJ0TnVtYmVyOwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgY29tcDsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCi0JCS8vIGNyZWF0ZSBzcGlubmVyIGZvciBsaW5lIHdpZHRoCi0JCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJMaW5lV2lkdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGluZVdpZHRoU3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JCWxpbmVXaWR0aFNwaW5uZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJbGluZVdpZHRoU3Bpbm5lci5zZXRNaW5pbXVtKDEpOwotCQlsaW5lV2lkdGhTcGlubmVyLnNldE1heGltdW0oMTAwKTsKLQkJbGluZVdpZHRoU3Bpbm5lci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmICghcGF1c2VJdGVtLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgZHJvcCBkb3duIGNvbWJvIGZvciBhbnRpYWxpYXNpbmcKLQkJY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkFudGlhbGlhc2luZyIpKTsgLy8kTk9OLU5MUy0xJAotCQlhbGlhc0NvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCQlhbGlhc0NvbWJvLmFkZCgiREVGQVVMVCIpOwotCQlhbGlhc0NvbWJvLmFkZCgiT0ZGIik7Ci0JCWFsaWFzQ29tYm8uYWRkKCJPTiIpOwotCQlhbGlhc0NvbWJvLnNlbGVjdCgwKTsKLQkJYW50aWFsaWFzID0gYWxpYXNWYWx1ZXNbMF07Ci0JCWFsaWFzQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlhbnRpYWxpYXMgPSBhbGlhc1ZhbHVlc1thbGlhc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJCWlmICghcGF1c2VJdGVtLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgZHJvcCBkb3duIGNvbWJvIGZvciBsaW5lIGNhcAotCQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiTGluZUNhcCIpKTsgLy8kTk9OLU5MUy0xJAotCQlsaW5lQ2FwQ29tYm8gPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTik7Ci0JCWxpbmVDYXBDb21iby5hZGQoIkZMQVQiKTsKLQkJbGluZUNhcENvbWJvLmFkZCgiU1FVQVJFIik7Ci0JCWxpbmVDYXBDb21iby5hZGQoIlJPVU5EIik7Ci0JCWxpbmVDYXBDb21iby5zZWxlY3QoMCk7Ci0JCWxpbmVDYXAgPSBjYXBWYWx1ZXNbMF07Ci0JCWxpbmVDYXBDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWxpbmVDYXAgPSBjYXBWYWx1ZXNbbGluZUNhcENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJCWlmICghcGF1c2VJdGVtLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNaXNjIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvdW50ZG93biIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvdW50ZG93bkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI2dldEFuaW1hdGlvblRpbWUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbEFuaW1hdGlvblRpbWUoKSB7Ci0JCXJldHVybiAyODsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI25leHQoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQotCQlpZiAoYW5nbGUgPT0gMjcwKSB7Ci0JCQluZXh0TnVtYmVyLS07Ci0JCQlpZiAobmV4dE51bWJlciA8IDEpIHsKLQkJCQkvLyBzdG9wIGFuaW1hdGlvbgotCQkJCXNldEFuaW1hdGlvbihmYWxzZSk7Ci0JCQl9Ci0JCQlhbmdsZSA9IC05MDsKLQkJfQotCQlhbmdsZSArPSAxMDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0KLQkJLy8gZGlhbWV0ZXIgb2YgdGhlIGNpcmNsZSBpbiBwaXhlbHMKLQkJaW50IGRpYW1ldGVyID0gKCh3aWR0aCA8IGhlaWdodCkgPyB3aWR0aCAtIDI1IDogaGVpZ2h0IC0gMjUpOwotCi0JCWlmICghZ2V0QW5pbWF0aW9uKCkgJiYgbmV4dE51bWJlciA9PSAwKSB7Ci0JCQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udEZhY2UoMSksIGRpYW1ldGVyLzIsCi0JCQkJCVNXVC5OT05FKTsKLQkJCWdjLnNldEZvbnQoZm9udCk7Ci0KLQkJCS8vIGRpc3BsYXkgIlNXVCIKLQkJCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0JMVUUpKTsKLQkJCWdjLnNldFRleHRBbnRpYWxpYXMoU1dULk9OKTsKLQotCQkJLy8gZGV0ZXJtaW5lIHRoZSBkaW1lbnNpb25zIG9mIHRoZSB3b3JkCi0JCQlTdHJpbmcgdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU1dUIik7Ci0JCQlQb2ludCBwb2ludCA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQkJCWludCB0ZXh0V2lkdGggPSBwb2ludC54OwotCQkJaW50IHRleHRIZWlnaHQgPSBwb2ludC55OwotCQkJZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtdGV4dFdpZHRoKS8yLAotCQkJCQkoaGVpZ2h0LXRleHRIZWlnaHQpLzIsIHRydWUpOwotCQkJZm9udC5kaXNwb3NlKCk7Ci0KLQkJfSBlbHNlIHsKLQotCQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnRGYWNlKDApLAotCQkJCQk2KmRpYW1ldGVyLzEwLCBTV1QuTk9ORSk7Ci0JCQlnYy5zZXRGb250KGZvbnQpOwotCi0JCQkvLyBzZXQgYXR0cmlidXRlcyBmcm9tIGNvbnRyb2xzCi0JCQlnYy5zZXRMaW5lV2lkdGgobGluZVdpZHRoU3Bpbm5lci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlnYy5zZXRMaW5lQ2FwKGxpbmVDYXApOyAvLyByb3VuZCBsaW5lIGVuZHMKLQkJCWdjLnNldEFudGlhbGlhcyhhbnRpYWxpYXMpOyAvLyBzbW9vdGggamFnZ2VkIGVkZ2VzCi0JCQlnYy5zZXRUZXh0QW50aWFsaWFzKGFudGlhbGlhcyk7IC8vIHNtb290aCBqYWdnZWQgZWRnZXMKLQotCQkJLy8gZHJhdyB0aGUgY2lyY2xlcwotCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJCXBhdGguYWRkQXJjKCh3aWR0aC1kaWFtZXRlcikvMiwgKGhlaWdodC1kaWFtZXRlcikvMiwKLQkJCQkJZGlhbWV0ZXIsIGRpYW1ldGVyLCAwLCAzNjApOwotCQkJcGF0aC5hZGRBcmMoKHdpZHRoLWRpYW1ldGVyKzUwKS8yLAotCQkJCQkoaGVpZ2h0LWRpYW1ldGVyKzUwKS8yLCBkaWFtZXRlci01MCwgZGlhbWV0ZXItNTAsCi0JCQkJCTAsIDM2MCk7Ci0JCQlnYy5kcmF3UGF0aChwYXRoKTsKLQkJCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJcGF0aC5kaXNwb3NlKCk7Ci0KLQkJCVBvaW50IHBvaW50ID0gZ2Muc3RyaW5nRXh0ZW50KG5ldyBJbnRlZ2VyKG5leHROdW1iZXIpLnRvU3RyaW5nKCkpOwotCQkJaW50IHRleHRXaWR0aCA9IHBvaW50Lng7Ci0JCQlpbnQgdGV4dEhlaWdodCA9IHBvaW50Lnk7Ci0KLQkJCS8vIGRyYXcgdGhlIG51bWJlcgotCQkJZ2MuZHJhd1N0cmluZyhuZXcgSW50ZWdlcihuZXh0TnVtYmVyKS50b1N0cmluZygpLAotCQkJCQkod2lkdGgtdGV4dFdpZHRoKS8yLCAoaGVpZ2h0LXRleHRIZWlnaHQpLzIsIHRydWUpOwotCi0JCQkvLyBkcmF3IHRoZSByb3RhdGluZyBhcm0KLQkJCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JCQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLzIsIGhlaWdodC8yKTsKLQkJCXRyYW5zZm9ybS5yb3RhdGUoYW5nbGUpOwotCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQlnYy5kcmF3TGluZSgwLCAwLCBkaWFtZXRlci8yLCAwKTsKLQkJCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0KLQkJCWZvbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIHZhbGlkIGZvbnQgZm9yIHRoZSByZXNpZGVudCBwbGF0Zm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGluZGV4IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmb250IGZhY2UKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtRm9udEZhY2UoaW50IGluZGV4KSB7Ci0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIkNvdXJpZXIiLCAiSW1wYWN0IiB9W2luZGV4XTsKLQkJfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIkNvdXJpZXIiLCAiVVJXIEdvdGhpYyBMIiB9W2luZGV4XTsKLQkJfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJDb3VyaWVyIiwgIkJhZWttdWsgSGVhZGxpbmUiIH1baW5kZXhdOwotCQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIkNvdXJpZXIiLCAiSW1wYWN0IiB9W2luZGV4XTsKLQkJfSBlbHNlIHsgLy8gcGhvdG9uLCBldGMgLi4uCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIkNvdXJpZXIiLCAiVmVyZGFuYSIgfVtpbmRleF07Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXJ2ZXNTV1RUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1cnZlc1NXVFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZlN2FhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1cnZlc1NXVFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIHByZXNlbnRzIGN1YmljIGFuZCBxdWFkcmF0aWMgY3VydmVzIHRoYXQgY2FuIGJlIGRyYXduLiBBcyBhCi0gKiBkZW1vbnN0cmF0aW9uLCBjdWJpYyBhbmQgcXVhZHJhdGljIGN1cnZlcyBhcmUgdXNlZCB0byBzcGVsbCBvdXQgIlNXVCIuCi0gKiBUaGUgdXNlciBtYXkgcmVwb3NpdGlvbiB0aGUgY3ViaWMgYW5kIHF1YWRyYXRpYyBoYW5kbGVzLiAKLSAqLwotcHVibGljIGNsYXNzIEN1cnZlc1NXVFRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQkvKiogVGhlc2UgcmVjdGFuZ2xlcyByZXByZXNlbnQgdGhlIGhhbmRsZXMgb24gdGhlIGN1cnZlcy4gKi8KLQlwcml2YXRlIFJlY3RhbmdsZSBzUmVjdDEsIHNSZWN0Miwgd1JlY3QxLCB3UmVjdDIsIHRUb3BSZWN0MSwgdFRvcFJlY3QyLCAKLQkJCXRCb3R0b21SZWN0MSwgdEJvdHRvbVJlY3QyOwotCQotCS8qKiBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBwb3NpdGlvbnMgb2YgdGhlIGN1cnZlcy4gKi8KLQlwcml2YXRlIGZsb2F0IHNYUG9zLCBzWVBvcywgd1hQb3MsIHdZUG9zLCB0b3BUWFBvcywgdG9wVFlQb3MsIAotCQkJYm90VFhQb3MsIGJvdFRZUG9zOwotCQotCS8qKiBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSB4IGFuZCB5IGRpc3BsYWNlbWVudCBvZiBlYWNoIGhhbmRsZS4gKi8KLQlwcml2YXRlIGZsb2F0IHNEaWZmWDEsIHNEaWZmWTEsIHNEaWZmWDIsIHNEaWZmWTI7Ci0JcHJpdmF0ZSBmbG9hdCB3RGlmZlgxLCB3RGlmZlkxLCB3RGlmZlgyLCB3RGlmZlkyOwotCXByaXZhdGUgZmxvYXQgdFRvcERpZmZYMSwgdFRvcERpZmZZMSwgdFRvcERpZmZYMiwgdFRvcERpZmZZMjsKLQlwcml2YXRlIGZsb2F0IHRCb3REaWZmWDEsIHRCb3REaWZmWTEsIHRCb3REaWZmWDIsIHRCb3REaWZmWTI7Ci0JCi0JLyoqIFRoZXNlIGFyZSBmbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIgb3Igbm90IGEgaGFuZGxlIGhhcyBiZWVuIG1vdmVkLiAqLwotCXByaXZhdGUgYm9vbGVhbiBzTGVmdFB0TW92ZWQsIHNSaWdodFB0TW92ZWQsIHdQdDFNb3ZlZCwgd1B0Mk1vdmVkLAotCQkJdFRvcFB0MU1vdmVkLCB0VG9wUHQyTW92ZWQsIHRCb3RQdDFNb3ZlZCwgdEJvdFB0Mk1vdmVkOwotCQotCXByaXZhdGUgTW91c2VNb3ZlTGlzdGVuZXIgbW91c2VNb3ZlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBDdXJzb3IgY3Vyc29yOwotCQotCS8qKiB0cnVlIGlmIGhvdmVyaW5nIG92ZXIgYSBoYW5kbGUsIGZhbHNlIG90aGVyd2lzZSAqLwotCXByaXZhdGUgYm9vbGVhbiBob3ZlcmluZyA9IGZhbHNlOwotCQotCS8qKiB0cnVlIGlmIGxlZnQgbW91c2UgYnV0dG9uIGlzIGhlbGQgZG93biwgZmFsc2Ugb3RoZXJ3aXNlICovCi0JcHJpdmF0ZSBib29sZWFuIG1vdXNlRG93biA9IGZhbHNlOwotCi0JCi1wdWJsaWMgQ3VydmVzU1dUVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci0Jc1JlY3QxID0gbmV3IFJlY3RhbmdsZSgtNzUsIDUwLCA1LCA1KTsKLQlzUmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDc1LCAxMDAsIDUsIDUpOwotCXNEaWZmWDEgPSBzRGlmZlkxID0gMDsKLQlzRGlmZlgyID0gc0RpZmZZMiA9IDA7Ci0Jd1JlY3QxID0gbmV3IFJlY3RhbmdsZSg4MCwgMzAwLCA1LCA1KTsKLQl3UmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDEyMCwgMzAwLCA1LCA1KTsKLQl3RGlmZlgxID0gd0RpZmZZMSA9IHdEaWZmWDIgPSB3RGlmZlkyID0gMDsKLQl0VG9wUmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDMzLCAtMjAsIDUsIDUpOwotCXRUb3BSZWN0MiA9IG5ldyBSZWN0YW5nbGUoNjYsIDIwLCA1LCA1KTsKLQl0VG9wRGlmZlgxID0gdFRvcERpZmZZMSA9IHRUb3BEaWZmWDIgPSB0VG9wRGlmZlkyID0gMDsKLQl0Qm90dG9tUmVjdDEgPSBuZXcgUmVjdGFuZ2xlKC0zMywgNTAsIDUsIDUpOwotCXRCb3R0b21SZWN0MiA9IG5ldyBSZWN0YW5nbGUoMzMsIDEwMCwgNSwgNSk7Ci0JdEJvdERpZmZYMSA9IHRCb3REaWZmWTEgPSB0Qm90RGlmZlgyID0gdEJvdERpZmZZMiA9IDA7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VydmVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VydmVzU1dURGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgYm9vbGVhbiBnZXREb3VibGVCdWZmZXJlZCgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobW91c2VMaXN0ZW5lciAhPSBudWxsKQotCQlleGFtcGxlLmNhbnZhcy5yZW1vdmVNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotCQotCWlmIChtb3VzZU1vdmVMaXN0ZW5lciAhPSBudWxsKQotCQlleGFtcGxlLmNhbnZhcy5yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lcihtb3VzZU1vdmVMaXN0ZW5lcik7Ci0JCi0JaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0JCWN1cnNvci5kaXNwb3NlKCk7Ci0JCWN1cnNvciA9IG51bGw7Ci0JfQotfQotCi0JLyoqCi0JICogVGhpcyBoZWxwZXIgbWV0aG9kIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGN1cnNvciBpcyBwb3NpdGlvbmVkCi0JICogb3ZlciBhIGhhbmRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgQSBNb3VzZUV2ZW50Ci0JICogQHJldHVybiB0cnVlIGlmIGN1cnNvciBpcyBwb3NpdGlvbmVkIG92ZXIgYSBoYW5kbGU7IGZhbHNlIG90aGVyd2lzZQotCSAqLwotcHJpdmF0ZSBib29sZWFuIGlzSG92ZXJpbmcoTW91c2VFdmVudCBlKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZShzUmVjdDEueCArIChpbnQpc1hQb3MgLSAxLCBzUmVjdDEueSArIChpbnQpc1lQb3MgLSAxLCBzUmVjdDEud2lkdGgrMiwgc1JlY3QxLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKHNSZWN0Mi54ICsgKGludClzWFBvcyAtIDEsIHNSZWN0Mi55ICsgKGludClzWVBvcyAtIDEsIHNSZWN0Mi53aWR0aCsyLCBzUmVjdDIuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSB3MSA9IG5ldyBSZWN0YW5nbGUod1JlY3QxLnggKyAoaW50KXdYUG9zIC0gMSwgd1JlY3QxLnkgKyAoaW50KXdZUG9zIC0gMSwgd1JlY3QxLndpZHRoKzIsIHdSZWN0MS5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIHcyID0gbmV3IFJlY3RhbmdsZSh3UmVjdDIueCArIChpbnQpd1hQb3MgLSAxLCB3UmVjdDIueSArIChpbnQpd1lQb3MgLSAxLCB3UmVjdDIud2lkdGgrMiwgd1JlY3QyLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgdFRvcDEgPSBuZXcgUmVjdGFuZ2xlKHRUb3BSZWN0MS54ICsgKGludCl0b3BUWFBvcyAtIDEsIHRUb3BSZWN0MS55ICsgKGludCl0b3BUWVBvcyAtIDEsIHRUb3BSZWN0MS53aWR0aCsyLCB0VG9wUmVjdDEuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSB0VG9wMiA9IG5ldyBSZWN0YW5nbGUodFRvcFJlY3QyLnggKyAoaW50KXRvcFRYUG9zIC0gMSwgdFRvcFJlY3QyLnkgKyAoaW50KXRvcFRZUG9zIC0gMSwgdFRvcFJlY3QyLndpZHRoKzIsIHRUb3BSZWN0Mi5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIHRCb3QxID0gbmV3IFJlY3RhbmdsZSh0Qm90dG9tUmVjdDEueCArIChpbnQpYm90VFhQb3MgLSAxLCB0Qm90dG9tUmVjdDEueSArIChpbnQpYm90VFlQb3MgLSAxLCB0Qm90dG9tUmVjdDEud2lkdGgrMiwgdEJvdHRvbVJlY3QxLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgdEJvdDIgPSBuZXcgUmVjdGFuZ2xlKHRCb3R0b21SZWN0Mi54ICsgKGludClib3RUWFBvcyAtIDEsIHRCb3R0b21SZWN0Mi55ICsgKGludClib3RUWVBvcyAtIDEsIHRCb3R0b21SZWN0Mi53aWR0aCsyLCB0Qm90dG9tUmVjdDIuaGVpZ2h0KzIpOwotCQotCXJldHVybiAoIHIxLmNvbnRhaW5zKGUueCwgZS55KSB8fCByMi5jb250YWlucyhlLngsIGUueSkgCi0JCSB8fCB3MS5jb250YWlucyhlLngsIGUueSkgfHwgdzIuY29udGFpbnMoZS54LCBlLnkpIAotCQkgfHwgdFRvcDEuY29udGFpbnMoZS54LCBlLnkpIHx8IHRUb3AyLmNvbnRhaW5zKGUueCwgZS55KSAKLQkJIHx8IHRCb3QxLmNvbnRhaW5zKGUueCwgZS55KSB8fCB0Qm90Mi5jb250YWlucyhlLngsIGUueSkgKTsKLX0KLS8qKiAKLSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdXNlZCB0byBjb250cm9sIHRoZSBkcmF3aW5nLgotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCWlmIChjdXJzb3IgPT0gbnVsbCkgeyAKLQkJY3Vyc29yID0gbmV3IEN1cnNvcihwYXJlbnQuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0hBTkQpOwotCX0KLQotCW1vdXNlTW92ZUxpc3RlbmVyID0gbmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkKLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKGhvdmVyaW5nICYmIG1vdXNlRG93bikgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihjdXJzb3IpOwotCQkJfSBlbHNlIGlmIChpc0hvdmVyaW5nKGUpKSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCQkJaG92ZXJpbmcgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IobnVsbCk7Ci0JCQkJaG92ZXJpbmcgPSBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKHNMZWZ0UHRNb3ZlZCkgewotCQkJCXNEaWZmWDEgPSBzRGlmZlgxICsgZS54IC0gKGludClzWFBvcyAtIHNSZWN0MS54OwotCQkJCXNEaWZmWTEgPSBzRGlmZlkxICsgZS55IC0gKGludClzWVBvcyAtIHNSZWN0MS55OwotCQkJCXNSZWN0MS54ID0gZS54IC0gKGludClzWFBvczsKLQkJCQlzUmVjdDEueSA9IGUueSAtIChpbnQpc1lQb3M7Ci0JCQl9IGVsc2UgaWYgKHNSaWdodFB0TW92ZWQpIHsKLQkJCQlzRGlmZlgyID0gc0RpZmZYMiArIGUueCAtIChpbnQpc1hQb3MgLSBzUmVjdDIueDsKLQkJCQlzRGlmZlkyID0gc0RpZmZZMiArIGUueSAtIChpbnQpc1lQb3MgLSBzUmVjdDIueTsKLQkJCQlzUmVjdDIueCA9IGUueCAtIChpbnQpc1hQb3M7Ci0JCQkJc1JlY3QyLnkgPSBlLnkgLSAoaW50KXNZUG9zOwotCQkJfSBlbHNlIGlmICh3UHQxTW92ZWQpIHsKLQkJCQl3RGlmZlgxID0gd0RpZmZYMSArIGUueCAtIChpbnQpd1hQb3MgLSB3UmVjdDEueDsKLQkJCQl3RGlmZlkxID0gd0RpZmZZMSArIGUueSAtIChpbnQpd1lQb3MgLSB3UmVjdDEueTsKLQkJCQl3UmVjdDEueCA9IGUueCAtIChpbnQpd1hQb3M7Ci0JCQkJd1JlY3QxLnkgPSBlLnkgLSAoaW50KXdZUG9zOwkJCQkKLQkJCX0gZWxzZSBpZiAod1B0Mk1vdmVkKSB7Ci0JCQkJd0RpZmZYMiA9IHdEaWZmWDIgKyBlLnggLSAoaW50KXdYUG9zIC0gd1JlY3QyLng7Ci0JCQkJd0RpZmZZMiA9IHdEaWZmWTIgKyBlLnkgLSAoaW50KXdZUG9zIC0gd1JlY3QyLnk7Ci0JCQkJd1JlY3QyLnggPSBlLnggLSAoaW50KXdYUG9zOwotCQkJCXdSZWN0Mi55ID0gZS55IC0gKGludCl3WVBvczsJCi0JCQl9IGVsc2UgaWYgKHRUb3BQdDFNb3ZlZCkgewotCQkJCXRUb3BEaWZmWDEgPSB0VG9wRGlmZlgxICsgZS54IC0gKGludCl0b3BUWFBvcyAtIHRUb3BSZWN0MS54OwotCQkJCXRUb3BEaWZmWTEgPSB0VG9wRGlmZlkxICsgZS55IC0gKGludCl0b3BUWVBvcyAtIHRUb3BSZWN0MS55OwotCQkJCXRUb3BSZWN0MS54ID0gZS54IC0gKGludCl0b3BUWFBvczsKLQkJCQl0VG9wUmVjdDEueSA9IGUueSAtIChpbnQpdG9wVFlQb3M7CQotCQkJfSBlbHNlIGlmICh0VG9wUHQyTW92ZWQpIHsKLQkJCQl0VG9wRGlmZlgyID0gdFRvcERpZmZYMiArIGUueCAtIChpbnQpdG9wVFhQb3MgLSB0VG9wUmVjdDIueDsKLQkJCQl0VG9wRGlmZlkyID0gdFRvcERpZmZZMiArIGUueSAtIChpbnQpdG9wVFlQb3MgLSB0VG9wUmVjdDIueTsKLQkJCQl0VG9wUmVjdDIueCA9IGUueCAtIChpbnQpdG9wVFhQb3M7Ci0JCQkJdFRvcFJlY3QyLnkgPSBlLnkgLSAoaW50KXRvcFRZUG9zOwotCQkJfSBlbHNlIGlmICh0Qm90UHQxTW92ZWQpIHsKLQkJCQl0Qm90RGlmZlgxID0gdEJvdERpZmZYMSArIGUueCAtIChpbnQpYm90VFhQb3MgLSB0Qm90dG9tUmVjdDEueDsKLQkJCQl0Qm90RGlmZlkxID0gdEJvdERpZmZZMSArIGUueSAtIChpbnQpYm90VFlQb3MgLSB0Qm90dG9tUmVjdDEueTsKLQkJCQl0Qm90dG9tUmVjdDEueCA9IGUueCAtIChpbnQpYm90VFhQb3M7Ci0JCQkJdEJvdHRvbVJlY3QxLnkgPSBlLnkgLSAoaW50KWJvdFRZUG9zOwkKLQkJCX0gZWxzZSBpZiAodEJvdFB0Mk1vdmVkKSB7Ci0JCQkJdEJvdERpZmZYMiA9IHRCb3REaWZmWDIgKyBlLnggLSAoaW50KWJvdFRYUG9zIC0gdEJvdHRvbVJlY3QyLng7Ci0JCQkJdEJvdERpZmZZMiA9IHRCb3REaWZmWTIgKyBlLnkgLSAoaW50KWJvdFRZUG9zIC0gdEJvdHRvbVJlY3QyLnk7Ci0JCQkJdEJvdHRvbVJlY3QyLnggPSBlLnggLSAoaW50KWJvdFRYUG9zOwotCQkJCXRCb3R0b21SZWN0Mi55ID0gZS55IC0gKGludClib3RUWVBvczsKLQkJCX0KLQkJCWV4YW1wbGUucmVkcmF3KCk7CQkJCi0JCX0KLQl9OwotCQotCW1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkge30KLQotCQkvKioKLQkJICogU2VudCB3aGVuIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vdXNlIGJ1dHRvbiBwcmVzcwotCQkgKi8KLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgeyAgCi0JCQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKHNSZWN0MS54ICsgKGludClzWFBvcyAtIDEsIHNSZWN0MS55ICsgKGludClzWVBvcyAtIDEsIHNSZWN0MS53aWR0aCsyLCBzUmVjdDEuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZShzUmVjdDIueCArIChpbnQpc1hQb3MgLSAxLCBzUmVjdDIueSArIChpbnQpc1lQb3MgLSAxLCBzUmVjdDIud2lkdGgrMiwgc1JlY3QyLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSB3MSA9IG5ldyBSZWN0YW5nbGUod1JlY3QxLnggKyAoaW50KXdYUG9zIC0gMSwgd1JlY3QxLnkgKyAoaW50KXdZUG9zIC0gMSwgd1JlY3QxLndpZHRoKzIsIHdSZWN0MS5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgdzIgPSBuZXcgUmVjdGFuZ2xlKHdSZWN0Mi54ICsgKGludCl3WFBvcyAtIDEsIHdSZWN0Mi55ICsgKGludCl3WVBvcyAtIDEsIHdSZWN0Mi53aWR0aCsyLCB3UmVjdDIuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIHRUb3AxID0gbmV3IFJlY3RhbmdsZSh0VG9wUmVjdDEueCArIChpbnQpdG9wVFhQb3MgLSAxLCB0VG9wUmVjdDEueSArIChpbnQpdG9wVFlQb3MgLSAxLCB0VG9wUmVjdDEud2lkdGgrMiwgdFRvcFJlY3QxLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSB0VG9wMiA9IG5ldyBSZWN0YW5nbGUodFRvcFJlY3QyLnggKyAoaW50KXRvcFRYUG9zIC0gMSwgdFRvcFJlY3QyLnkgKyAoaW50KXRvcFRZUG9zIC0gMSwgdFRvcFJlY3QyLndpZHRoKzIsIHRUb3BSZWN0Mi5oZWlnaHQrMik7Ci0JCQlSZWN0YW5nbGUgdEJvdDEgPSBuZXcgUmVjdGFuZ2xlKHRCb3R0b21SZWN0MS54ICsgKGludClib3RUWFBvcyAtIDEsIHRCb3R0b21SZWN0MS55ICsgKGludClib3RUWVBvcyAtIDEsIHRCb3R0b21SZWN0MS53aWR0aCsyLCB0Qm90dG9tUmVjdDEuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIHRCb3QyID0gbmV3IFJlY3RhbmdsZSh0Qm90dG9tUmVjdDIueCArIChpbnQpYm90VFhQb3MgLSAxLCB0Qm90dG9tUmVjdDIueSArIChpbnQpYm90VFlQb3MgLSAxLCB0Qm90dG9tUmVjdDIud2lkdGgrMiwgdEJvdHRvbVJlY3QyLmhlaWdodCsyKTsKLQotCQkJaWYgKHIxLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXNMZWZ0UHRNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAocjIuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJc1JpZ2h0UHRNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAodzEuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJd1B0MU1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmICh3Mi5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQl3UHQyTW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHRUb3AxLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXRUb3BQdDFNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAodFRvcDIuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJdFRvcFB0Mk1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfSBlbHNlIGlmICh0Qm90MS5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQl0Qm90UHQxTW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHRCb3QyLmNvbnRhaW5zKGUueCwgZS55KSkgewotCQkJCXRCb3RQdDJNb3ZlZCA9IHRydWU7Ci0JCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBTZW50IHdoZW4gYSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vdXNlIGJ1dHRvbiByZWxlYXNlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJbW91c2VEb3duID0gZmFsc2U7Ci0JCQlpZiAoaXNIb3ZlcmluZyhlKSkgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihjdXJzb3IpOwotCQkJfSBlbHNlIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IobnVsbCk7Ci0JCQl9Ci0JCQlpZiAoc0xlZnRQdE1vdmVkKQotCQkJCXNMZWZ0UHRNb3ZlZCA9IGZhbHNlOwotCQkJaWYgKHNSaWdodFB0TW92ZWQpCi0JCQkJc1JpZ2h0UHRNb3ZlZCA9IGZhbHNlOwotCQkJaWYgKHdQdDFNb3ZlZCkKLQkJCQl3UHQxTW92ZWQgPSBmYWxzZTsKLQkJCWlmICh3UHQyTW92ZWQpCi0JCQkJd1B0Mk1vdmVkID0gZmFsc2U7Ci0JCQlpZiAodFRvcFB0MU1vdmVkKQotCQkJCXRUb3BQdDFNb3ZlZCA9IGZhbHNlOwkKLQkJCWlmICh0VG9wUHQyTW92ZWQpCi0JCQkJdFRvcFB0Mk1vdmVkID0gZmFsc2U7CQotCQkJaWYgKHRCb3RQdDFNb3ZlZCkKLQkJCQl0Qm90UHQxTW92ZWQgPSBmYWxzZTsJCi0JCQlpZiAodEJvdFB0Mk1vdmVkKQotCQkJCXRCb3RQdDJNb3ZlZCA9IGZhbHNlOwotCQkJCi0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfTsKLQlleGFtcGxlLmNhbnZhcy5hZGRNb3VzZU1vdmVMaXN0ZW5lcihtb3VzZU1vdmVMaXN0ZW5lcik7Ci0JZXhhbXBsZS5jYW52YXMuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udCgpLCAxNiwgU1dULklUQUxJQyk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlnYy5zZXRMaW5lV2lkdGgoMik7Ci0JCi0JVHJhbnNmb3JtIHRyYW5zZm9ybTsKLQkKLQkvLyAtLS0tLSBsZXR0ZXIgcyAtLS0tLQkKLQlzWFBvcyA9IDQqd2lkdGgvMTY7Ci0Jc1lQb3MgPSAoaGVpZ2h0LTE1MCkvMjsKLQkKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZShzWFBvcywgc1lQb3MpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0KLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19CTFVFKSk7Ci0JZ2MuZHJhd1N0cmluZyhHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1YmljIiksIDAsIDE3NSwgdHJ1ZSk7Ci0JCi0JUGF0aCBwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmN1YmljVG8oLTIwMCArIHNEaWZmWDEsIDUwICsgc0RpZmZZMSwgMjAwICsgc0RpZmZYMiwgMTAwICsgc0RpZmZZMiwgMCwgMTUwKTsKLQlnYy5kcmF3UGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLQkKLQkvLyBkcmF3IHRoZSBzcGxpbmUgcG9pbnRzCi0JZ2Muc2V0VHJhbnNmb3JtKG51bGwpOwotCWdjLmRyYXdSZWN0YW5nbGUoc1JlY3QxLnggKyAoaW50KXNYUG9zLCBzUmVjdDEueSArIChpbnQpc1lQb3MsIHNSZWN0MS53aWR0aCwgc1JlY3QxLmhlaWdodCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZShzUmVjdDIueCArIChpbnQpc1hQb3MsIHNSZWN0Mi55ICsgKGludClzWVBvcywgc1JlY3QyLndpZHRoLCBzUmVjdDIuaGVpZ2h0KTsKLQkKLQkvLyAtLS0tLSBsZXR0ZXIgdyAtLS0tLQotCXdYUG9zID0gNip3aWR0aC8xNjsKLQl3WVBvcyA9IChoZWlnaHQtMTUwKS8yOwotCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdYUG9zLCB3WVBvcyk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSkpOwotCWdjLmRyYXdTdHJpbmcoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJRdWFkcmF0aWMiKSwgMCwgLTUwLCB0cnVlKTsKLQlnYy5kcmF3U3RyaW5nKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUXVhZHJhdGljIiksIDExMCwgLTUwLCB0cnVlKTsKLQkKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLnF1YWRUbygxMDAgKyB3RGlmZlgxLCAzMDAgKyB3RGlmZlkxLCAxMDAsIDApOwotCXBhdGgucXVhZFRvKDEwMCt3RGlmZlgyLCAzMDArd0RpZmZZMiwgMjAwLCAwKTsKLQlnYy5kcmF3UGF0aChwYXRoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLQkKLQlnYy5zZXRUcmFuc2Zvcm0obnVsbCk7CQotCWdjLmRyYXdSZWN0YW5nbGUod1JlY3QxLnggKyAoaW50KXdYUG9zLCB3UmVjdDEueSArIChpbnQpd1lQb3MsIHdSZWN0MS53aWR0aCwgd1JlY3QxLmhlaWdodCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZSh3UmVjdDIueCArIChpbnQpd1hQb3MsIHdSZWN0Mi55ICsgKGludCl3WVBvcywgd1JlY3QyLndpZHRoLCB3UmVjdDIuaGVpZ2h0KTsKLQkKLQkKLQkvLyAtLS0tLSB0b3Agb2YgbGV0dGVyIHQgLS0tLS0KLQl0b3BUWFBvcyA9IDExKndpZHRoLzE2OwotCXRvcFRZUG9zID0gKGhlaWdodC0xNTApLzI7Ci0JCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUodG9wVFhQb3MsIHRvcFRZUG9zKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQlnYy5kcmF3U3RyaW5nKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3ViaWMiKSwgMjUsIC01MCwgdHJ1ZSk7Ci0JCi0JcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5jdWJpY1RvKDMzICsgdFRvcERpZmZYMSwgLTIwICsgdFRvcERpZmZZMSwgNjYgKyB0VG9wRGlmZlgyLCAyMCArIHRUb3BEaWZmWTIsIDEwMCwgMCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0KLQlnYy5zZXRUcmFuc2Zvcm0obnVsbCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZSh0VG9wUmVjdDEueCArIChpbnQpdG9wVFhQb3MsIHRUb3BSZWN0MS55ICsgKGludCl0b3BUWVBvcywgdFRvcFJlY3QxLndpZHRoLCB0VG9wUmVjdDEuaGVpZ2h0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHRUb3BSZWN0Mi54ICsgKGludCl0b3BUWFBvcywgdFRvcFJlY3QyLnkgKyAoaW50KXRvcFRZUG9zLCB0VG9wUmVjdDIud2lkdGgsIHRUb3BSZWN0Mi5oZWlnaHQpOwotCQotCi0JLy8gLS0tLS0gdmVydGljYWwgYmFyIG9mIGxldHRlciB0IC0tLS0tCi0JYm90VFhQb3MgPSAxMip3aWR0aC8xNjsKLQlib3RUWVBvcyA9IChoZWlnaHQtMTUwKS8yOwotCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoYm90VFhQb3MsIGJvdFRZUG9zKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5kcmF3U3RyaW5nKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3ViaWMiKSwgMCwgMTc1LCB0cnVlKTsKLQkKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmN1YmljVG8oLTMzICsgdEJvdERpZmZYMSwgNTAgKyB0Qm90RGlmZlkxLCAzMyArIHRCb3REaWZmWDIsIDEwMCArIHRCb3REaWZmWTIsIDAsIDE1MCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JCi0JZ2Muc2V0VHJhbnNmb3JtKG51bGwpOwotCWdjLmRyYXdSZWN0YW5nbGUodEJvdHRvbVJlY3QxLnggKyAoaW50KWJvdFRYUG9zLCB0Qm90dG9tUmVjdDEueSArIChpbnQpYm90VFlQb3MsIHRCb3R0b21SZWN0MS53aWR0aCwgdEJvdHRvbVJlY3QxLmhlaWdodCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZSh0Qm90dG9tUmVjdDIueCArIChpbnQpYm90VFhQb3MsIHRCb3R0b21SZWN0Mi55ICsgKGludClib3RUWVBvcywgdEJvdHRvbVJlY3QyLndpZHRoLCB0Qm90dG9tUmVjdDIuaGVpZ2h0KTsKLQotCWZvbnQuZGlzcG9zZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSB2YWxpZCBmb250IGZvciB0aGUgcmVzaWRlbnQgcGxhdGZvcm0uCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250KCkgewotCWlmKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gIkhlbHZldGljYSI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCXJldHVybiAiQmFla211ayBCYXRhbmciOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gIkFyaWFsIjsKLQl9IGVsc2UgeyAvLyBwaG90b24sIGV0YyAuLi4KLQkJcmV0dXJuICJWZXJkYW5hIjsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXJ2ZXNUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1cnZlc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg0MTU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1cnZlc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIHByZXNlbnRzIGN1YmljIGFuZCBxdWFkcmF0aWMgY3VydmVzIHRoYXQgY2FuIGJlIGRyYXduLgotICogVGhlIHVzZXIgbWF5IHJlcG9zaXRpb24gdGhlIGN1YmljIGFuZCBxdWFkcmF0aWMgaGFuZGxlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXJ2ZXNUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JLyoqIFRoZXNlIHJlY3RhbmdsZXMgcmVwcmVzZW50IHRoZSBoYW5kbGVzIG9uIHRoZSBjdXJ2ZXMuICovCi0JcHJpdmF0ZSBSZWN0YW5nbGUgcXVhZEhuZGwsIHF1YWRFbmRIbmRsLCBjdWJIbmRsMSwgY3ViSG5kbDIsIGN1YkVuZEhuZGw7Ci0JCi0JLyoqIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY3VydmVzLiAqLwotCXByaXZhdGUgZmxvYXQgcXVhZFhQb3MsIHF1YWRZUG9zLCBjdWJYUG9zLCBjdWJZUG9zOwotCQotCS8qKiBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSB4IGFuZCB5IGRpc3BsYWNlbWVudCBvZiBlYWNoIGhhbmRsZS4gKi8KLQlwcml2YXRlIGZsb2F0IHF1YWREaWZmWCwgcXVhZERpZmZZLCBxdWFkRW5kRGlmZlgsIHF1YWRFbmREaWZmWTsKLQlwcml2YXRlIGZsb2F0IGN1YkRpZmZYMSwgY3ViRGlmZlkxLCBjdWJEaWZmWDIsIGN1YkRpZmZZMiwgY3ViRW5kRGlmZlgsIGN1YkVuZERpZmZZOwotCQotCS8qKiBUaGVzZSBhcmUgZmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCBhIGhhbmRsZSBoYXMgYmVlbiBtb3ZlZC4gKi8KLQlwcml2YXRlIGJvb2xlYW4gcXVhZFB0TW92ZWQsIHF1YWRFbmRQdE1vdmVkLCBjdWJQdDFNb3ZlZCwgY3ViUHQyTW92ZWQsIGN1YkVuZFB0TW92ZWQ7Ci0KLQlwcml2YXRlIE1vdXNlTW92ZUxpc3RlbmVyIG1vdXNlTW92ZUxpc3RlbmVyOwotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBtb3VzZUxpc3RlbmVyOwotCXByaXZhdGUgQ3Vyc29yIGN1cnNvcjsKLQotCS8qKiB0cnVlIGlmIGhvdmVyaW5nIG92ZXIgYSBoYW5kbGUsIGZhbHNlIG90aGVyd2lzZSAqLwotCXByaXZhdGUgYm9vbGVhbiBob3ZlcmluZyA9IGZhbHNlOwotCQotCS8qKiB0cnVlIGlmIGxlZnQgbW91c2UgYnV0dG9uIGlzIGhlbGQgZG93biwgZmFsc2Ugb3RoZXJ3aXNlICovCi0JcHJpdmF0ZSBib29sZWFuIG1vdXNlRG93biA9IGZhbHNlOwotCi0JCi1wdWJsaWMgQ3VydmVzVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci0JcXVhZEhuZGwgPSBuZXcgUmVjdGFuZ2xlKDIwMCwgMTUwLCA1LCA1KTsKLQlxdWFkRW5kSG5kbCA9IG5ldyBSZWN0YW5nbGUoNDAwLCAwLCA1LCA1KTsKLQlxdWFkRGlmZlggPSBxdWFkRGlmZlkgPSBxdWFkRW5kRGlmZlggPSBxdWFkRW5kRGlmZlkgPSAwOwotCWN1YkhuZGwxID0gbmV3IFJlY3RhbmdsZSgxMzMsIC02MCwgNSwgNSk7Ci0JY3ViSG5kbDIgPSBuZXcgUmVjdGFuZ2xlKDI2NiwgNjAsIDUsIDUpOwotCWN1YkRpZmZYMSA9IGN1YkRpZmZZMSA9IGN1YkRpZmZYMiA9IGN1YkRpZmZZMiA9IDA7Ci0JY3ViRW5kSG5kbCA9IG5ldyBSZWN0YW5nbGUoNDAwLCAwLCA1LCA1KTsKLQljdWJFbmREaWZmWCA9IGN1YkVuZERpZmZZID0gMDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXJ2ZXMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VydmVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdXJ2ZXNEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBib29sZWFuIGdldERvdWJsZUJ1ZmZlcmVkKCkgewotCXJldHVybiB0cnVlOwotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtb3VzZUxpc3RlbmVyICE9IG51bGwpCi0JCWV4YW1wbGUuY2FudmFzLnJlbW92ZU1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0JCi0JaWYgKG1vdXNlTW92ZUxpc3RlbmVyICE9IG51bGwpCi0JCWV4YW1wbGUuY2FudmFzLnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKG1vdXNlTW92ZUxpc3RlbmVyKTsKLQkKLQlpZiAoY3Vyc29yICE9IG51bGwpIHsKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJY3Vyc29yID0gbnVsbDsKLQl9Ci19Ci0KLS8qKgotICogVGhpcyBoZWxwZXIgbWV0aG9kIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGN1cnNvciBpcyBwb3NpdGlvbmVkCi0gKiBvdmVyIGEgaGFuZGxlLgotICogCi0gKiBAcGFyYW0gZQotICogICAgICAgICAgICBBIE1vdXNlRXZlbnQKLSAqIEByZXR1cm4gdHJ1ZSBpZiBjdXJzb3IgaXMgcG9zaXRpb25lZCBvdmVyIGEgaGFuZGxlOyBmYWxzZSBvdGhlcndpc2UKLSAqLwotcHJpdmF0ZSBib29sZWFuIGlzSG92ZXJpbmcoTW91c2VFdmVudCBlKSB7Ci0JUmVjdGFuZ2xlIHF1YWQgPSBuZXcgUmVjdGFuZ2xlKHF1YWRIbmRsLnggKyAoaW50KXF1YWRYUG9zIC0gMSwgcXVhZEhuZGwueSArIChpbnQpcXVhZFlQb3MgLSAxLCBxdWFkSG5kbC53aWR0aCsyLCBxdWFkSG5kbC5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIHF1YWRFbmQgPSBuZXcgUmVjdGFuZ2xlKHF1YWRFbmRIbmRsLnggKyAoaW50KXF1YWRYUG9zIC0gMSwgcXVhZEVuZEhuZGwueSArIChpbnQpcXVhZFlQb3MgLSAxLCBxdWFkRW5kSG5kbC53aWR0aCsyLCBxdWFkRW5kSG5kbC5oZWlnaHQrMik7Ci0JUmVjdGFuZ2xlIGN1YjEgPSBuZXcgUmVjdGFuZ2xlKGN1YkhuZGwxLnggKyAoaW50KWN1YlhQb3MgLSAxLCBjdWJIbmRsMS55ICsgKGludCljdWJZUG9zIC0gMSwgY3ViSG5kbDEud2lkdGgrMiwgY3ViSG5kbDEuaGVpZ2h0KzIpOwotCVJlY3RhbmdsZSBjdWIyID0gbmV3IFJlY3RhbmdsZShjdWJIbmRsMi54ICsgKGludCljdWJYUG9zIC0gMSwgY3ViSG5kbDIueSArIChpbnQpY3ViWVBvcyAtIDEsIGN1YkhuZGwyLndpZHRoKzIsIGN1YkhuZGwyLmhlaWdodCsyKTsKLQlSZWN0YW5nbGUgY3ViRW5kID0gbmV3IFJlY3RhbmdsZShjdWJFbmRIbmRsLnggKyAoaW50KWN1YlhQb3MgLSAxLCBjdWJFbmRIbmRsLnkgKyAoaW50KWN1YllQb3MgLSAxLCBjdWJFbmRIbmRsLndpZHRoKzIsIGN1YkVuZEhuZGwuaGVpZ2h0KzIpOwotCi0JcmV0dXJuICggcXVhZC5jb250YWlucyhlLngsIGUueSkgfHwgcXVhZEVuZC5jb250YWlucyhlLngsIGUueSkgCi0JCSB8fCBjdWIxLmNvbnRhaW5zKGUueCwgZS55KSB8fCBjdWIyLmNvbnRhaW5zKGUueCwgZS55KSAKLQkJIHx8IGN1YkVuZC5jb250YWlucyhlLngsIGUueSkpOwotfQotLyoqIAotICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRyYXdpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JaWYgKGN1cnNvciA9PSBudWxsKSB7IAotCQljdXJzb3IgPSBuZXcgQ3Vyc29yKHBhcmVudC5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfSEFORCk7Ci0JfQotCi0JbW91c2VNb3ZlTGlzdGVuZXIgPSBuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQotCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQlpZiAoaG92ZXJpbmcgJiYgbW91c2VEb3duKSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCQl9IGVsc2UgaWYgKGlzSG92ZXJpbmcoZSkpIHsKLQkJCQlleGFtcGxlLmNhbnZhcy5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCQlob3ZlcmluZyA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihudWxsKTsKLQkJCQlob3ZlcmluZyA9IGZhbHNlOwotCQkJfQotCi0JCQlpZiAocXVhZFB0TW92ZWQpIHsKLQkJCQlxdWFkRGlmZlggPSBxdWFkRGlmZlggKyBlLnggLSAoaW50KXF1YWRYUG9zIC0gcXVhZEhuZGwueDsKLQkJCQlxdWFkRGlmZlkgPSBxdWFkRGlmZlkgKyBlLnkgLSAoaW50KXF1YWRZUG9zIC0gcXVhZEhuZGwueTsKLQkJCQlxdWFkSG5kbC54ID0gZS54IC0gKGludClxdWFkWFBvczsKLQkJCQlxdWFkSG5kbC55ID0gZS55IC0gKGludClxdWFkWVBvczsJCQkJCi0JCQl9IGVsc2UgaWYgKHF1YWRFbmRQdE1vdmVkKSB7Ci0JCQkJcXVhZEVuZERpZmZYID0gcXVhZEVuZERpZmZYICsgZS54IC0gKGludClxdWFkWFBvcyAtIHF1YWRFbmRIbmRsLng7Ci0JCQkJcXVhZEVuZERpZmZZID0gcXVhZEVuZERpZmZZICsgZS55IC0gKGludClxdWFkWVBvcyAtIHF1YWRFbmRIbmRsLnk7Ci0JCQkJcXVhZEVuZEhuZGwueCA9IGUueCAtIChpbnQpcXVhZFhQb3M7Ci0JCQkJcXVhZEVuZEhuZGwueSA9IGUueSAtIChpbnQpcXVhZFlQb3M7CQotCQkJfSBlbHNlIGlmIChjdWJQdDFNb3ZlZCkgewotCQkJCWN1YkRpZmZYMSA9IGN1YkRpZmZYMSArIGUueCAtIChpbnQpY3ViWFBvcyAtIGN1YkhuZGwxLng7Ci0JCQkJY3ViRGlmZlkxID0gY3ViRGlmZlkxICsgZS55IC0gKGludCljdWJZUG9zIC0gY3ViSG5kbDEueTsKLQkJCQljdWJIbmRsMS54ID0gZS54IC0gKGludCljdWJYUG9zOwotCQkJCWN1YkhuZGwxLnkgPSBlLnkgLSAoaW50KWN1YllQb3M7CQotCQkJfSBlbHNlIGlmIChjdWJQdDJNb3ZlZCkgewotCQkJCWN1YkRpZmZYMiA9IGN1YkRpZmZYMiArIGUueCAtIChpbnQpY3ViWFBvcyAtIGN1YkhuZGwyLng7Ci0JCQkJY3ViRGlmZlkyID0gY3ViRGlmZlkyICsgZS55IC0gKGludCljdWJZUG9zIC0gY3ViSG5kbDIueTsKLQkJCQljdWJIbmRsMi54ID0gZS54IC0gKGludCljdWJYUG9zOwotCQkJCWN1YkhuZGwyLnkgPSBlLnkgLSAoaW50KWN1YllQb3M7Ci0JCQl9IGVsc2UgaWYgKGN1YkVuZFB0TW92ZWQpIHsKLQkJCQljdWJFbmREaWZmWCA9IGN1YkVuZERpZmZYICsgZS54IC0gKGludCljdWJYUG9zIC0gY3ViRW5kSG5kbC54OwotCQkJCWN1YkVuZERpZmZZID0gY3ViRW5kRGlmZlkgKyBlLnkgLSAoaW50KWN1YllQb3MgLSBjdWJFbmRIbmRsLnk7Ci0JCQkJY3ViRW5kSG5kbC54ID0gZS54IC0gKGludCljdWJYUG9zOwotCQkJCWN1YkVuZEhuZGwueSA9IGUueSAtIChpbnQpY3ViWVBvczsKLQkJCX0KLQkJCWV4YW1wbGUucmVkcmF3KCk7CQkJCi0JCX0KLQl9OwotCQotCW1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkge30KLQotCQkvKioKLQkJICogU2VudCB3aGVuIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vdXNlIGJ1dHRvbiBwcmVzcwotCQkgKi8KLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgeyAgCi0JCQlSZWN0YW5nbGUgcXVhZCA9IG5ldyBSZWN0YW5nbGUocXVhZEhuZGwueCArIChpbnQpcXVhZFhQb3MgLSAxLCBxdWFkSG5kbC55ICsgKGludClxdWFkWVBvcyAtIDEsIHF1YWRIbmRsLndpZHRoKzIsIHF1YWRIbmRsLmhlaWdodCsyKTsKLQkJCVJlY3RhbmdsZSBxdWFkRW5kID0gbmV3IFJlY3RhbmdsZShxdWFkRW5kSG5kbC54ICsgKGludClxdWFkWFBvcyAtIDEsIHF1YWRFbmRIbmRsLnkgKyAoaW50KXF1YWRZUG9zIC0gMSwgcXVhZEVuZEhuZGwud2lkdGgrMiwgcXVhZEVuZEhuZGwuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIGN1YjEgPSBuZXcgUmVjdGFuZ2xlKGN1YkhuZGwxLnggKyAoaW50KWN1YlhQb3MgLSAxLCBjdWJIbmRsMS55ICsgKGludCljdWJZUG9zIC0gMSwgY3ViSG5kbDEud2lkdGgrMiwgY3ViSG5kbDEuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIGN1YjIgPSBuZXcgUmVjdGFuZ2xlKGN1YkhuZGwyLnggKyAoaW50KWN1YlhQb3MgLSAxLCBjdWJIbmRsMi55ICsgKGludCljdWJZUG9zIC0gMSwgY3ViSG5kbDIud2lkdGgrMiwgY3ViSG5kbDIuaGVpZ2h0KzIpOwotCQkJUmVjdGFuZ2xlIGN1YkVuZCA9IG5ldyBSZWN0YW5nbGUoY3ViRW5kSG5kbC54ICsgKGludCljdWJYUG9zIC0gMSwgY3ViRW5kSG5kbC55ICsgKGludCljdWJZUG9zIC0gMSwgY3ViRW5kSG5kbC53aWR0aCsyLCBjdWJFbmRIbmRsLmhlaWdodCsyKTsKLQkJCQotCQkJaWYgKHF1YWQuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJcXVhZFB0TW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHF1YWRFbmQuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJcXVhZEVuZFB0TW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGN1YjEuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJY3ViUHQxTW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGN1YjIuY29udGFpbnMoZS54LCBlLnkpKSB7Ci0JCQkJY3ViUHQyTW92ZWQgPSB0cnVlOwotCQkJCW1vdXNlRG93biA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGN1YkVuZC5jb250YWlucyhlLngsIGUueSkpIHsKLQkJCQljdWJFbmRQdE1vdmVkID0gdHJ1ZTsKLQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFNlbnQgd2hlbiBhIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZC4KLQkJICoKLQkJICogQHBhcmFtIGUgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW91c2UgYnV0dG9uIHJlbGVhc2UKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQltb3VzZURvd24gPSBmYWxzZTsKLQkJCWlmIChpc0hvdmVyaW5nKGUpKSB7Ci0JCQkJZXhhbXBsZS5jYW52YXMuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCQl9IGVsc2UgewotCQkJCWV4YW1wbGUuY2FudmFzLnNldEN1cnNvcihudWxsKTsKLQkJCX0KLQotCQkJaWYgKHF1YWRQdE1vdmVkKQotCQkJCXF1YWRQdE1vdmVkID0gZmFsc2U7Ci0JCQlpZiAocXVhZEVuZFB0TW92ZWQpCi0JCQkJcXVhZEVuZFB0TW92ZWQgPSBmYWxzZTsKLQkJCWlmIChjdWJQdDFNb3ZlZCkKLQkJCQljdWJQdDFNb3ZlZCA9IGZhbHNlOwkKLQkJCWlmIChjdWJQdDJNb3ZlZCkKLQkJCQljdWJQdDJNb3ZlZCA9IGZhbHNlOwotCQkJaWYgKGN1YkVuZFB0TW92ZWQpCi0JCQkJY3ViRW5kUHRNb3ZlZCA9IGZhbHNlOwotCQkJCi0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfTsKLQlleGFtcGxlLmNhbnZhcy5hZGRNb3VzZU1vdmVMaXN0ZW5lcihtb3VzZU1vdmVMaXN0ZW5lcik7Ci0JZXhhbXBsZS5jYW52YXMuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udCgpLCAxNiwgU1dULklUQUxJQyk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlnYy5zZXRMaW5lV2lkdGgoNSk7Ci0JCi0JVHJhbnNmb3JtIHRyYW5zZm9ybTsKLQotCS8vIC0tLS0tIGN1YmljIGN1cnZlIC0tLS0tCi0JY3ViWFBvcyA9IHdpZHRoLzU7Ci0JY3ViWVBvcyA9IGhlaWdodC8zOwotCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKGN1YlhQb3MsIGN1YllQb3MpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmRyYXdTdHJpbmcoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdWJpYyIpLCAyNSwgLTcwLCB0cnVlKTsKLQkKLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguY3ViaWNUbygxMzMgKyBjdWJEaWZmWDEsIC02MCArIGN1YkRpZmZZMSwgMjY2ICsgY3ViRGlmZlgyLCA2MCArIGN1YkRpZmZZMiwgNDAwICsgY3ViRW5kRGlmZlgsIDAgKyBjdWJFbmREaWZmWSk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0KLQlnYy5zZXRUcmFuc2Zvcm0obnVsbCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfQkxVRSkpOwotCWdjLmRyYXdSZWN0YW5nbGUoY3ViSG5kbDEueCArIChpbnQpY3ViWFBvcywgY3ViSG5kbDEueSArIChpbnQpY3ViWVBvcywgY3ViSG5kbDEud2lkdGgsIGN1YkhuZGwxLmhlaWdodCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZShjdWJIbmRsMi54ICsgKGludCljdWJYUG9zLCBjdWJIbmRsMi55ICsgKGludCljdWJZUG9zLCBjdWJIbmRsMi53aWR0aCwgY3ViSG5kbDIuaGVpZ2h0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlKGN1YkVuZEhuZGwueCArIChpbnQpY3ViWFBvcywgY3ViRW5kSG5kbC55ICsgKGludCljdWJZUG9zLCBjdWJFbmRIbmRsLndpZHRoLCBjdWJFbmRIbmRsLmhlaWdodCk7Ci0JCi0JLy8gLS0tLS0gcXVhZHJhdGljIGN1cnZlIC0tLS0tCi0JcXVhZFhQb3MgPSB3aWR0aC81OwotCXF1YWRZUG9zID0gMipoZWlnaHQvMzsKLQkKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZShxdWFkWFBvcywgcXVhZFlQb3MpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JZ2MuZHJhd1N0cmluZyhHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlF1YWRyYXRpYyIpLCAwLCAtNTAsIHRydWUpOwotCQotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGgucXVhZFRvKDIwMCArIHF1YWREaWZmWCwgMTUwICsgcXVhZERpZmZZLCA0MDAgKyBxdWFkRW5kRGlmZlgsIDAgKyBxdWFkRW5kRGlmZlkpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCWdjLnNldFRyYW5zZm9ybShudWxsKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSkpOwotCWdjLmRyYXdSZWN0YW5nbGUocXVhZEhuZGwueCArIChpbnQpcXVhZFhQb3MsIHF1YWRIbmRsLnkgKyAoaW50KXF1YWRZUG9zLCBxdWFkSG5kbC53aWR0aCwgcXVhZEhuZGwuaGVpZ2h0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlKHF1YWRFbmRIbmRsLnggKyAoaW50KXF1YWRYUG9zLCBxdWFkRW5kSG5kbC55ICsgKGludClxdWFkWVBvcywgcXVhZEVuZEhuZGwud2lkdGgsIHF1YWRFbmRIbmRsLmhlaWdodCk7Ci0KLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIHJlc2lkZW50IHBsYXRmb3JtLgotICovCi1zdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtRm9udCgpIHsKLQlpZihTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiKSB7Ci0JCXJldHVybiAiQXJpYWwiOwkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJtb3RpZiIpIHsKLQkJcmV0dXJuICJIZWx2ZXRpY2EiOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQlyZXR1cm4gIkJhZWttdWsgQmF0YW5nIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImNhcmJvbiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7Ci0JfSBlbHNlIHsgLy8gcGhvdG9uLCBldGMgLi4uCi0JCXJldHVybiAiVmVyZGFuYSI7Ci0JfQotfQotCi19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1c3RvbUFscGhhVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXN0b21BbHBoYVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODZmYzVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1c3RvbUFscGhhVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYWxwaGEgYmxlbmRpbmcuIEl0IGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeQotICogYSBjdXN0b20gYWxwaGEgdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21BbHBoYVRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCQotCXByaXZhdGUgU3Bpbm5lciBhbHBoYVNwaW5uZXI7Ci0JcHJpdmF0ZSBCdXR0b24gY29sb3JCdXR0b247Ci0JcHJpdmF0ZSBHcmFwaGljc0JhY2tncm91bmQgYmFja2dyb3VuZDsKLQlwcml2YXRlIE1lbnUgbWVudTsKLQlwcml2YXRlIGludCBhbmdsZTsKLQotcHVibGljIEN1c3RvbUFscGhhVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQWxwaGEiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tQWxwaGEiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkN1c3RvbUFscGhhRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotLyoqIAotICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRyYXdpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0Jc3VwZXIuY3JlYXRlQ29udHJvbFBhbmVsKHBhcmVudCk7Ci0JCi0JLy8gY3JlYXRlIGRyb3AgZG93biBjb21ibyBmb3IgY2hvb3NpbmcgY2xpcHBpbmcKLQlDb21wb3NpdGUgY29tcDsKLQkKLQkvLyBjcmVhdGUgc3Bpbm5lciBmb3IgbGluZSB3aWR0aAotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJBbHBoYSIpKTsgLy8kTk9OLU5MUy0xJAotCWFscGhhU3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JYWxwaGFTcGlubmVyLnNldE1pbmltdW0oMCk7Ci0JYWxwaGFTcGlubmVyLnNldE1heGltdW0oMjU1KTsKLQlhbHBoYVNwaW5uZXIuc2V0U2VsZWN0aW9uKDEyNyk7Ci0JYWxwaGFTcGlubmVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gY29sb3IgbWVudQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQliYWNrZ3JvdW5kID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gdGhlIDV0aCBpdGVtIGluIHRoZSBtZW51IChibHVlKQotCWJhY2tncm91bmQgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSg0KS5nZXREYXRhKCk7Ci0JCi0JLy8gY29sb3IgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UoYmFja2dyb3VuZC5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkKLQlhbmdsZSA9IChhbmdsZSsxKSUzNjA7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0KLQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCWlmIChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQuZ2V0QmdDb2xvcjEoKSk7Ci0JfSBlbHNlIGlmIChiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGJhY2tncm91bmQuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotCQotCWdjLnNldEFudGlhbGlhcyhTV1QuT04pOwotCWdjLnNldEFscGhhKGFscGhhU3Bpbm5lci5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JLy8gcm90YXRlIG9uIGNlbnRlcgotCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh3aWR0aC8yLCBoZWlnaHQvMik7Ci0JdHJhbnNmb3JtLnJvdGF0ZSgtYW5nbGUpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoLXdpZHRoLzIsIC1oZWlnaHQvMik7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQkvLyBjaG9vc2UgdGhlIHNtYWxsZXN0IGJldHdlZW4gaGVpZ2h0IGFuZCB3aWR0aAotCWludCBkaWFtZXRlciA9IChoZWlnaHQgPCB3aWR0aCkgPyBoZWlnaHQgOiB3aWR0aDsKLQkKLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkQXJjKCh3aWR0aC1kaWFtZXRlci81KS8yLCAoaGVpZ2h0LWRpYW1ldGVyLzUpLzIsIGRpYW1ldGVyLzUsIGRpYW1ldGVyLzUsIDAsIDM2MCk7Ci0JcGF0aC5hZGRBcmMoNSood2lkdGgtZGlhbWV0ZXIvOCkvMTIsIDQqKGhlaWdodC1kaWFtZXRlci84KS8xMiwgZGlhbWV0ZXIvOCwgZGlhbWV0ZXIvOCwgMCwgMzYwKTsKLQlwYXRoLmFkZEFyYyg3Kih3aWR0aC1kaWFtZXRlci84KS8xMiwgOCooaGVpZ2h0LWRpYW1ldGVyLzgpLzEyLCBkaWFtZXRlci84LCBkaWFtZXRlci84LCAwLCAzNjApOwotCXBhdGguYWRkQXJjKDYqKHdpZHRoLWRpYW1ldGVyLzEyKS8xMiwgMyooaGVpZ2h0LWRpYW1ldGVyLzEyKS8xMiwgZGlhbWV0ZXIvMTIsIGRpYW1ldGVyLzEyLCAwLCAzNjApOwotCXBhdGguYWRkQXJjKDYqKHdpZHRoLWRpYW1ldGVyLzEyKS8xMiwgOSooaGVpZ2h0LWRpYW1ldGVyLzEyKS8xMiwgZGlhbWV0ZXIvMTIsIGRpYW1ldGVyLzEyLCAwLCAzNjApOwotCXBhdGguYWRkQXJjKDExLjVmKih3aWR0aC1kaWFtZXRlci8xOCkvMjAsIDUqKGhlaWdodC1kaWFtZXRlci8xOCkvMTgsIGRpYW1ldGVyLzE4LCBkaWFtZXRlci8xOCwgMCwgMzYwKTsJCi0JcGF0aC5hZGRBcmMoOC41Ziood2lkdGgtZGlhbWV0ZXIvMTgpLzIwLCAxMyooaGVpZ2h0LWRpYW1ldGVyLzE4KS8xOCwgZGlhbWV0ZXIvMTgsIGRpYW1ldGVyLzE4LCAwLCAzNjApOwotCXBhdGguYWRkQXJjKDYyZiood2lkdGgtZGlhbWV0ZXIvMjUpLzEwMCwgMzIqKGhlaWdodC1kaWFtZXRlci8yNSkvMTAwLCBkaWFtZXRlci8yNSwgZGlhbWV0ZXIvMjUsIDAsIDM2MCk7Ci0JcGF0aC5hZGRBcmMoMzlmKih3aWR0aC1kaWFtZXRlci8yNSkvMTAwLCA2NyooaGVpZ2h0LWRpYW1ldGVyLzI1KS8xMDAsIGRpYW1ldGVyLzI1LCBkaWFtZXRlci8yNSwgMCwgMzYwKTsKLQkJCi0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JCQkKLSAgICBpZiAocGF0dGVybiAhPSBudWxsKSBwYXR0ZXJuLmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1c3RvbUZvbnRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0N1c3RvbUZvbnRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4ZDI4My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9DdXN0b21Gb250VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdmFyaW91cyB0ZXh0IGZvbnRzLiBJdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSBmb250Ci0gKiBwYXJhbWV0ZXJzIHN1Y2ggYXMgZmFjZSwgc3R5bGUgYW5kIHNpemUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21Gb250VGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi0JU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOwotCUdyYXBoaWNzQmFja2dyb3VuZCBmb250Rm9yZWdyb3VuZDsKLQlDb21ibyBmb250RmFjZUNiLCBmb250U3R5bGVDYjsKLQlTcGlubmVyIGZvbnRQb2ludFNwaW5uZXI7Ci0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCUFycmF5TGlzdCBmb250TmFtZXM7Ci0JaW50IFtdIHN0eWxlVmFsdWVzOwotCVN0cmluZyBbXSBmb250U3R5bGVzOwotCU1lbnUgbWVudTsKLQkKLXB1YmxpYyBDdXN0b21Gb250VGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci0JCi0JLy8gY3JlYXRlIGxpc3Qgb2YgZm9udHMgZm9yIHRoaXMgcGxhdGZvcm0KLQlGb250RGF0YSBbXSBmb250RGF0YSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEZvbnRMaXN0KG51bGwsIHRydWUpOwotCWZvbnROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlmb3IgKGludCBpPTA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykgewotCQkvLyByZW1vdmUgZHVwbGljYXRlcyBhbmQgc29ydAotCQlTdHJpbmcgbmV4dE5hbWUgPSBmb250RGF0YVtpXS5nZXROYW1lKCk7Ci0JCWlmICghZm9udE5hbWVzLmNvbnRhaW5zKG5leHROYW1lKSkgewotCQkJaW50IGogPSAwOwotCQkJd2hpbGUoaiA8IGZvbnROYW1lcy5zaXplKCkgJiYgbmV4dE5hbWUuY29tcGFyZVRvKChTdHJpbmcpZm9udE5hbWVzLmdldChqKSkgPiAwKSB7Ci0JCQkJaisrOwotCQkJfQotCQkJZm9udE5hbWVzLmFkZChqLCBuZXh0TmFtZSk7Ci0JCX0KLQl9Ci0JZm9udFN0eWxlcyA9IG5ldyBTdHJpbmcgW10gewotCQkJR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZWd1bGFyIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSXRhbGljIiksIC8vJE5PTi1OTFMtMSQKLQkJCUdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQm9sZCIpLCAvLyROT04tTkxTLTEkCi0JCQlHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJvbGRJdGFsaWMiKSAvLyROT04tTkxTLTEkCi0JfTsKLQlzdHlsZVZhbHVlcyA9IG5ldyBpbnQgW10ge1NXVC5OT1JNQUwsIFNXVC5JVEFMSUMsIFNXVC5CT0xELCBTV1QuQk9MRCB8IFNXVC5JVEFMSUN9OwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZvbnQiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tRm9udCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ3VzdG9tRm9udERlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCW1lbnUuZGlzcG9zZSgpOwotCQltZW51ID0gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQlDb21wb3NpdGUgbWFpbkNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCW1haW5Db21wLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQotCS8vIGNyZWF0ZSBjb21ibyBmb3IgZm9udCBmYWNlCi0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wLCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQluZXcgTGFiZWwoY29tcCwgU1dULkxFRlQpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250RmFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCWZvbnRGYWNlQ2IgPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTik7Ci0JZm9yIChpbnQgaT0wOyBpIDwgZm9udE5hbWVzLnNpemUoKTsgaSsrKSB7Ci0JCVN0cmluZyBuYW1lID0gKFN0cmluZylmb250TmFtZXMuZ2V0KGkpOwotCQlmb250RmFjZUNiLmFkZChuYW1lKTsKLQl9Ci0JZm9udEZhY2VDYi5zZWxlY3QoMCk7Ci0JZm9udEZhY2VDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNyZWF0ZSBjb21ibyBmb3IgZm9udCBzdHlsZQotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wLCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQluZXcgTGFiZWwoY29tcCwgU1dULkxFRlQpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250U3R5bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQlmb250U3R5bGVDYiA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQlmb3IgKGludCBpPTA7IGkgPCBmb250U3R5bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCWZvbnRTdHlsZUNiLmFkZChmb250U3R5bGVzW2ldKTsKLQl9Ci0JZm9udFN0eWxlQ2Iuc2VsZWN0KDApOwotCWZvbnRTdHlsZUNiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gY3JlYXRlIHNwaW5uZXIgZm9yIGZvbnQgc2l6ZSAocG9pbnRzKQotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wLCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQluZXcgTGFiZWwoY29tcCwgU1dULkxFRlQpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250U2l6ZSIpKTsgLy8kTk9OLU5MUy0xJAotCWZvbnRQb2ludFNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWZvbnRQb2ludFNwaW5uZXIuc2V0TWluaW11bSgxKTsKLQlmb250UG9pbnRTcGlubmVyLnNldE1heGltdW0oMTAwMCk7Ci0JZm9udFBvaW50U3Bpbm5lci5zZXRTZWxlY3Rpb24oMjAwKTsKLQlmb250UG9pbnRTcGlubmVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0KLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0Q29sb3JJdGVtcyh0cnVlKTsKLQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQlmb250Rm9yZWdyb3VuZCA9IGdiOwotCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gdGhlIDJuZCBpdGVtIGluIHRoZSBtZW51IChibGFjaykKLQlmb250Rm9yZWdyb3VuZCA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDEpLmdldERhdGEoKTsKLQkKLQkvLyBjcmVhdGUgY29sb3IgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCWNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JY29sb3JCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UoZm9udEZvcmVncm91bmQuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JU3RyaW5nIGZvbnRGYWNlID0gKFN0cmluZylmb250TmFtZXMuZ2V0KGZvbnRGYWNlQ2IuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JaW50IHBvaW50cyA9IGZvbnRQb2ludFNwaW5uZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JaW50IHN0eWxlID0gc3R5bGVWYWx1ZXNbZm9udFN0eWxlQ2IuZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBmb250RmFjZSwgcG9pbnRzLCBzdHlsZSk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlnYy5zZXRUZXh0QW50aWFsaWFzKFNXVC5PTik7Ci0KLQlQb2ludCBzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWludCB0ZXh0V2lkdGggPSBzaXplLng7Ci0JaW50IHRleHRIZWlnaHQgPSBzaXplLnk7Ci0KLQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCWlmIChmb250Rm9yZWdyb3VuZC5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChmb250Rm9yZWdyb3VuZC5nZXRCZ0NvbG9yMSgpKTsKLQl9IGVsc2UgaWYgKGZvbnRGb3JlZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGZvbnRGb3JlZ3JvdW5kLmdldEJnSW1hZ2UoKSk7Ci0JCWdjLnNldEZvcmVncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCX0KLQkKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC10ZXh0V2lkdGgpLzIsIChoZWlnaHQtdGV4dEhlaWdodCkvMiwgdHJ1ZSk7Ci0KLQlmb250LmRpc3Bvc2UoKTsKLQlpZiAocGF0dGVybiAhPSBudWxsKSBwYXR0ZXJuLmRpc3Bvc2UoKTsJCi19Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvRm9udEJvdW5jZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvRm9udEJvdW5jZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzQxOGNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ZvbnRCb3VuY2VUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBpcyBhbiBhbmltYXRlZCBncmFwaGljLiBJdCBwcmVzZW50cyB0aGUgd29yZCBTV1QgaW4gZGlmZmVyZW50IGZvbnRzCi0gKiBhcyBpdCBib3VuY2VzIGFyb3VuZCB0aGUgc2NyZWVuLgotICovCi1wdWJsaWMgY2xhc3MgRm9udEJvdW5jZVRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCQotCWZsb2F0IHgsIHk7Ci0JZmxvYXQgaW5jWCA9IDEwLjBmOwkJCQkvLyB1bml0cyBieSB3aGljaCB0byBtb3ZlIHRoZSB3b3JkIGFsb25nIFggYXhpcwotCWZsb2F0IGluY1kgPSA1LjBmOwkJCQkvLyB1bml0cyBieSB3aGljaCB0byBtb3ZlIHRoZSB3b3JkIGFsb25nIFkgYXhpcyAKLQlpbnQgdGV4dFdpZHRoLCB0ZXh0SGVpZ2h0OwkJLy8gd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgd29yZCBTV1QKLQlTdHJpbmcgdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU1dUIik7Ci0JaW50IGZvbnRTaXplID0gMTAwOwotCWludCBmb250RmFjZSA9IDA7IAotCWludCBmb3JlR3JkQ29sb3IsIGZpbGxDb2xvcjsJLy8gZm9udCBjb2xvcnMKLQlpbnQgZm9udFN0eWxlOwkJCQkvLyByZXByZXNlbnRzIHZhcmlvdXMgc3R5bGUgYXR0cmlidXRlcyBhcHBsaWNhYmxlIHRvIGEgRm9udAotCQotcHVibGljIEZvbnRCb3VuY2VUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250Iik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkJvdW5jZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRm9udEJvdW5jZURlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuQW5pbWF0ZWRHcmFwaGljc1RhYiNuZXh0KGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCXggKz0gaW5jWDsKLSAgICB5ICs9IGluY1k7Ci0JZmxvYXQgcmFuZG9tID0gKGZsb2F0KU1hdGgucmFuZG9tKCk7Ci0JCi0JLy8gY29sbGlzaW9uIHdpdGggcmlnaHQgc2lkZSBvZiBzY3JlZW4gCi0gICAgaWYgKHggKyB0ZXh0V2lkdGggPiB3aWR0aCkgewotICAgICAgICB4ID0gd2lkdGggLSB0ZXh0V2lkdGg7Ci0gICAgICAgIGluY1ggPSByYW5kb20gKiAtd2lkdGggLyAxNiAtIDE7Ci0gICAgICAgIGZvbnRGYWNlID0gMDsKLSAgICAgICAgZm9udFNpemUgPSAxMjU7Ci0gICAgICAgIGZpbGxDb2xvciA9IFNXVC5DT0xPUl9EQVJLX0JMVUU7ICAKLSAgICAgICAgZm9yZUdyZENvbG9yID0gU1dULkNPTE9SX1lFTExPVzsKLSAgICAgICAgZm9udFN0eWxlID0gU1dULklUQUxJQzsKLSAgICB9Ci0JLy8gY29sbGlzaW9uIHdpdGggbGVmdCBzaWRlIG9mIHNjcmVlbgotICAgIGlmICh4IDwgMCkgewotICAgICAgICB4ID0gMDsKLSAgICAgICAgaW5jWCA9IHJhbmRvbSAqIHdpZHRoIC8gMTYgKyAxOwotICAgICAgICBmb250RmFjZSA9IDE7Ci0gICAgICAgIGZvbnRTaXplID0gODA7Ci0gICAgICAgIGZpbGxDb2xvciA9IFNXVC5DT0xPUl9EQVJLX01BR0VOVEE7Ci0gICAgICAgIGZvcmVHcmRDb2xvciA9IFNXVC5DT0xPUl9DWUFOOwotICAgICAgICBmb250U3R5bGUgPSBTV1QuTk9ORTsKLSAgICB9Ci0JLy8gY29sbGlzaW9uIHdpdGggYm90dG9tIHNpZGUgb2Ygc2NyZWVuCi0gICAgaWYgKHkgKyB0ZXh0SGVpZ2h0ID4gaGVpZ2h0KSB7Ci0gICAgICAgIHkgPSAoaGVpZ2h0IC0gdGV4dEhlaWdodCktIDI7Ci0gICAgICAgIGluY1kgPSByYW5kb20gKiAtaGVpZ2h0IC8gMTYgLSAxOwotICAgICAgICBmb250RmFjZSA9IDI7Ci0gICAgICAgIGZvbnRTaXplID0gMTAwOwotICAgICAgICBmaWxsQ29sb3IgPSBTV1QuQ09MT1JfWUVMTE9XOwotICAgICAgICBmb3JlR3JkQ29sb3IgPSBTV1QuQ09MT1JfQkxBQ0s7Ci0gICAgICAgIGZvbnRTdHlsZSA9IFNXVC5CT0xEOwotICAgIH0KLQkvLyBjb2xsaXNpb24gd2l0aCB0b3Agc2lkZSBvZiBzY3JlZW4KLSAgICBpZiAoeSA8IDApIHsKLSAgICAgICAgeSA9IDA7Ci0gICAgICAgIGluY1kgPSByYW5kb20gKiBoZWlnaHQgLyAxNiArIDE7Ci0gICAgICAgIGZvbnRGYWNlID0gMzsKLSAgICAgICAgZm9udFNpemUgPSAxMjA7Ci0gICAgICAgIGZpbGxDb2xvciA9IFNXVC5DT0xPUl9HUkVFTjsKLSAgICAgICAgZm9yZUdyZENvbG9yID0gU1dULkNPTE9SX0dSQVk7Ci0gICAgICAgIGZvbnRTdHlsZSA9IFNXVC5OT05FOwotICAgIH0KLX0KLQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsIGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZShmb250RmFjZSksIGZvbnRTaXplLCBmb250U3R5bGUpOwotCWdjLnNldEZvbnQoZm9udCk7Ci0JCi0JUG9pbnQgc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQl0ZXh0V2lkdGggPSBzaXplLng7Ci0JdGV4dEhlaWdodCA9IHNpemUueTsKLQkKLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkU3RyaW5nKHRleHQsIHgsIHksIGZvbnQpOwotCi0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoZm9yZUdyZENvbG9yKSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoZmlsbENvbG9yKSk7Ci0KLQlnYy5maWxsUGF0aChwYXRoKTsKLQlnYy5kcmF3UGF0aChwYXRoKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlwYXRoLmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmb250IHVzaW5nIHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gKiBUaGlzIG1ldGhvZCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHJlc2lkZW50IHBsYXRmb3JtLgotICogCi0gKiBAcGFyYW0gaW5kZXgKLSAqIAkJCVRoZSBpbmRleCBvZiB0aGUgZm9udCB0byBiZSB1c2VkCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250RmFjZShpbnQgaW5kZXgpIHsJCi0JaWYoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IkFyaWFsIiwgIkltcGFjdCIsICJUaW1lcyIsICJWZXJkYW5hIn0gW2luZGV4XTsJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiVVJXIENoYW5jZXJ5IEwiLCAiVVJXIEdvdGhpYyBMIiwgIlRpbWVzIiwgInF1YiJ9IFtpbmRleF07CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiVVJXIENoYW5jZXJ5IEwiLCAiQmFla211ayBCYXRhbmciLCAiQmFla211ayBIZWFkbGluZSIsICJLYWNzVGl0bGVMIn0gW2luZGV4XTsKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQXJpYWwiLCAiSW1wYWN0IiwgIlRpbWVzIiwgIlZlcmRhbmEifSBbaW5kZXhdOwotCX0gZWxzZSB7IC8vIHBob3RvbiwgZXRjIC4uLgotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IkFyaWFsIiwgIkltcGFjdCIsICJUaW1lcyIsICJWZXJkYW5hIn0gW2luZGV4XTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFkaWVudERpYWxvZy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhZGllbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4YTY4NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFkaWVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgaXMgdXNlZCBmb3IgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIHNlbGVjdCB0d28gY29sb3JzIGZvciB0aGUKLSAqIGNyZWF0aW9uIG9mIGEgZ3JhZGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFkaWVudERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlDYW52YXMgY2FudmFzOwotCi0JQnV0dG9uIGNvbG9yQnV0dG9uMSwgY29sb3JCdXR0b24yOwkJLy8gY29sb3IgYnV0dG9ucwotCi0JQnV0dG9uIG9rQnV0dG9uLCBjYW5jZWxCdXR0b247Ci0KLQlNZW51IG1lbnUxLCBtZW51MjsKLQkKLQlSR0IgcmdiMSwgcmdiMjsJCQkvLyBmaXJzdCBhbmQgc2Vjb25kIGNvbG9yIHVzZWQgaW4gZ3JhZGllbnQKLQlpbnQgcmV0dXJuVmFsOyAJCQkvLyB2YWx1ZSB0byBiZSByZXR1cm5lZCBieSBvcGVuKCksIHNldCB0byBTV1QuT0sgCi0JCQkJCQkJLy8gaWYgdGhlIG9rIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkCQkKLQlBcnJheUxpc3QgcmVzb3VyY2VzOwotCQkJCi0JcHVibGljIEdyYWRpZW50RGlhbG9nKFNoZWxsIHBhcmVudCkgewkJCi0JCXRoaXMgKHBhcmVudCwgU1dULlBSSU1BUllfTU9EQUwpOwotCX0KLQkKLQlwdWJsaWMgR3JhZGllbnREaWFsb2coU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXJnYjEgPSByZ2IyID0gbnVsbDsKLQkJcmV0dXJuVmFsID0gU1dULkNBTkNFTDsKLQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBkaWFsb2cgYW5kIG9wZW5zIGl0LgotCSAqICovCi0JcHVibGljIGludCBvcGVuKCkgewotCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwoZ2V0UGFyZW50KCksIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBnZXRTdHlsZSgpKTsKLQkJZGlhbG9nLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkaWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCSAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JICAgIGRpYWxvZy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JICAgIAotCSAgICAvLyBjcmVhdGUgdGhlIGNvbnRyb2xzIGluIHRoZSBkaWFsb2cKLQkgICAgY3JlYXRlRGlhbG9nQ29udHJvbHMoZGlhbG9nKTsKLQkJCi0JCWRpYWxvZy5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IHJlc291cmNlcy5nZXQoaSk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQkJKChSZXNvdXJjZSkgb2JqKS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGlhbG9nLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7CQotCi0JCWRpYWxvZy5zZXREZWZhdWx0QnV0dG9uIChva0J1dHRvbik7Ci0JCWRpYWxvZy5wYWNrICgpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGdldFBhcmVudCgpLmdldE1vbml0b3IoKS5nZXRCb3VuZHMoKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGRpYWxvZy5nZXRCb3VuZHMoKTsKLQkJZGlhbG9nLnNldExvY2F0aW9uKHJlY3QueCArIChyZWN0LndpZHRoIC0gYm91bmRzLndpZHRoKSAvIDIsIHJlY3QueSArIChyZWN0LmhlaWdodCAtIGJvdW5kcy5oZWlnaHQpIC8gMik7Ci0JCWRpYWxvZy5zZXRNaW5pbXVtU2l6ZShib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkKLQkJZGlhbG9nLm9wZW4gKCk7Ci0JCQotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRQYXJlbnQoKS5nZXREaXNwbGF5KCk7Ci0JCXdoaWxlICghZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJCi0JCWlmIChtZW51MSAhPSBudWxsKSB7Ci0JCQltZW51MS5kaXNwb3NlKCk7Ci0JCQltZW51MSA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChtZW51MiAhPSBudWxsKSB7Ci0JCQltZW51Mi5kaXNwb3NlKCk7Ci0JCQltZW51MiA9IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gcmV0dXJuVmFsOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9scyBvZiB0aGUgZGlhbG9nLgotCSAqICovCi0JcHVibGljIHZvaWQgY3JlYXRlRGlhbG9nQ29udHJvbHMoZmluYWwgU2hlbGwgcGFyZW50KSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCQotCQkvLyBtZXNzYWdlCi0JCUxhYmVsIG1lc3NhZ2UgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7IAotCQltZXNzYWdlLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkaWVudERsZ01zZyIpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQltZXNzYWdlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJLy8gZGVmYXVsdCBjb2xvcnMgYXJlIHdoaXRlIGFuZCBibGFjawotCQlpZiAocmdiMSA9PSBudWxsIHx8IHJnYjIgPT0gbnVsbCkgewotCQkJcmdiMSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKS5nZXRSR0IoKTsKLQkJCXJnYjIgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykuZ2V0UkdCKCk7Ci0JCX0JCQkKLQotCQkvLyBjYW52YXMKLQkJY2FudmFzID0gbmV3IENhbnZhcyhwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQljYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNhbnZhcy5hZGRMaXN0ZW5lciAoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlJbWFnZSBwcmV2aWV3ID0gbnVsbDsKLQkJCQlQb2ludCBzaXplID0gY2FudmFzLmdldFNpemUoKTsKLQkJCQlDb2xvciBjb2xvcjEgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiMSk7Ci0JCQkJQ29sb3IgY29sb3IyID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYjIpOwotCQkJCXByZXZpZXcgPSBHcmFwaGljc0V4YW1wbGUuY3JlYXRlSW1hZ2UoZGlzcGxheSwgY29sb3IxLCBjb2xvcjIsIHNpemUueCwgc2l6ZS55KTsKLQkJCQlpZiAocHJldmlldyAhPSBudWxsKSB7Ci0JCQkJCWUuZ2MuZHJhd0ltYWdlIChwcmV2aWV3LCAwLCAwKTsKLQkJCQl9Ci0JCQkJcHJldmlldy5kaXNwb3NlKCk7Ci0JCQkJY29sb3IxLmRpc3Bvc2UoKTsKLQkJCQljb2xvcjIuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIGNvbXBvc2l0ZSB1c2VkIGZvciBib3RoIGNvbG9yIGJ1dHRvbnMKLQkJQ29tcG9zaXRlIGNvbG9yQnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQotCQkvLyBsYXlvdXQgYnV0dG9ucwotCQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOzsKLQkJbGF5b3V0LnR5cGUgPSBTV1QuVkVSVElDQUw7Ci0JCWxheW91dC5wYWNrID0gZmFsc2U7Ci0JCWNvbG9yQnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBwb3NpdGlvbiBjb21wb3NpdGUKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkgICAgY29sb3JCdXR0b25Db21wLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCSAgICAKLQkJQ29sb3JNZW51IGNvbG9yTWVudSA9IG5ldyBDb2xvck1lbnUoKTsKLQkJCi0JCS8vIGNvbG9yIGNvbnRyb2xzOiBmaXJzdCBjb2xvcgotCQljb2xvckJ1dHRvbjEgPSBuZXcgQnV0dG9uKGNvbG9yQnV0dG9uQ29tcCwgU1dULlBVU0gpOwotCQljb2xvckJ1dHRvbjEuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRpZW50RGxnQnV0dG9uMSIpKTsKLQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYjEpOwotCQlJbWFnZSBpbWcxID0gR3JhcGhpY3NFeGFtcGxlLmNyZWF0ZUltYWdlKGRpc3BsYXksIGNvbG9yMSk7Ci0JCWNvbG9yMS5kaXNwb3NlKCk7Ci0JCWNvbG9yQnV0dG9uMS5zZXRJbWFnZShpbWcxKTsKLQkJcmVzb3VyY2VzLmFkZChpbWcxKTsKLQkJbWVudTEgPSBjb2xvck1lbnUuY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQkJcmdiMSA9IGdiLmdldEJnQ29sb3IxKCkuZ2V0UkdCKCk7Ci0JCQkJY29sb3JCdXR0b24xLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCQlpZiAoY2FudmFzICE9IG51bGwpIGNhbnZhcy5yZWRyYXcoKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbG9yQnV0dG9uMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCQltZW51MS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQkJbWVudTEuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBjb2xvciBjb250cm9sczogc2Vjb25kIGNvbG9yIAotCQljb2xvckJ1dHRvbjIgPSBuZXcgQnV0dG9uKGNvbG9yQnV0dG9uQ29tcCwgU1dULlBVU0gpOwotCQljb2xvckJ1dHRvbjIuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRpZW50RGxnQnV0dG9uMiIpKTsKLQkJQ29sb3IgY29sb3IyID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYjIpOwotCQlJbWFnZSBpbWcyID0gR3JhcGhpY3NFeGFtcGxlLmNyZWF0ZUltYWdlKGRpc3BsYXksIGNvbG9yMik7Ci0JCWNvbG9yMi5kaXNwb3NlKCk7Ci0JCWNvbG9yQnV0dG9uMi5zZXRJbWFnZShpbWcyKTsKLQkJcmVzb3VyY2VzLmFkZChpbWcyKTsKLQkJbWVudTIgPSBjb2xvck1lbnUuY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQkJcmdiMiA9IGdiLmdldEJnQ29sb3IxKCkuZ2V0UkdCKCk7Ci0JCQkJY29sb3JCdXR0b24yLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCQlpZiAoY2FudmFzICE9IG51bGwpIGNhbnZhcy5yZWRyYXcoKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbG9yQnV0dG9uMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCQltZW51Mi5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQkJbWVudTIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBjb21wb3NpdGUgdXNlZCBmb3Igb2sgYW5kIGNhbmNlbCBidXR0b25zCi0JCUNvbXBvc2l0ZSBva0NhbmNlbENvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCS8vIGxheW91dCBidXR0b25zCi0JCVJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0JCXJvd0xheW91dC5wYWNrID0gZmFsc2U7Ci0JCXJvd0xheW91dC5tYXJnaW5Ub3AgPSA1OwotCQlva0NhbmNlbENvbXAuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0KLQkJLy8gcG9zaXRpb24gY29tcG9zaXRlCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCSAgICBva0NhbmNlbENvbXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCSAgICAvLyBPSyBidXR0b24KLQkJb2tCdXR0b24gPSBuZXcgQnV0dG9uIChva0NhbmNlbENvbXAsIFNXVC5QVVNIKTsKLQkJb2tCdXR0b24uc2V0VGV4dCgiJk9LIik7Ci0JCW9rQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJcmV0dXJuVmFsID0gU1dULk9LOwotCQkJCXBhcmVudC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIGNhbmNlbCBidXR0b24KLQkJY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbiAob2tDYW5jZWxDb21wLCBTV1QuUFVTSCk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRUZXh0KCImQ2FuY2VsIik7Ci0JCWNhbmNlbEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXBhcmVudC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgUkdCIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgotCSAqICovCi0JcHVibGljIFJHQiBnZXRGaXJzdFJHQigpIHsKLQkJcmV0dXJuIHJnYjE7CQkKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZmlyc3QgUkdCLgotCSAqIEBwYXJhbSByZ2IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXJzdFJHQihSR0IgcmdiKSB7Ci0JCXRoaXMucmdiMSA9IHJnYjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2Vjb25kIFJHQiBzZWxlY3RlZCBieSB0aGUgdXNlci4KLQkgKiAqLwotCXB1YmxpYyBSR0IgZ2V0U2Vjb25kUkdCKCkgewotCQlyZXR1cm4gcmdiMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZWNvbmQgUkdCLgotCSAqIEBwYXJhbSByZ2IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmRSR0IoUkdCIHJnYikgewotCQl0aGlzLnJnYjIgPSByZ2I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhZGllbnRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYWRpZW50VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDM0YmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhZGllbnRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZHJhd3MgYW4gaW1hZ2UgY29uc2lzdGluZyBvZiBncmFkaWVudHMgb2YgdHdvIGNvbG9ycy4KLSAqICovCi1wdWJsaWMgY2xhc3MgR3JhZGllbnRUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JCi0JVG9vbEJhciB0b29sQmFyOwotCVRvb2xJdGVtIGNvbG9ySXRlbTEsIGNvbG9ySXRlbTI7Ci0JTWVudSBtZW51MSwgbWVudTI7Ci0JR3JhcGhpY3NCYWNrZ3JvdW5kIGNvbG9yR0IxLCBjb2xvckdCMjsKLQlBcnJheUxpc3QgcmVzb3VyY2VzOwkJLy8gcmVzb3VyY2VzIHRvIGJlIGRpc3Bvc2VkIHdoZW4gdGhlIGRpcG9zZSgpIG1ldGhvZCBpcyBpbnZva2VkCi0JCi0KLXB1YmxpYyBHcmFkaWVudFRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLX0KLQotLyoqCi0gKiBEaXNwb3NlIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoaXMgdGFiLgotICogKi8KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJT2JqZWN0IG9iaiA9IHJlc291cmNlcy5nZXQoaSk7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBSZXNvdXJjZSkgCi0JCQkoKFJlc291cmNlKSBvYmopLmRpc3Bvc2UoKTsKLQl9Ci0JcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCWlmIChtZW51MSAhPSBudWxsKSB7Ci0JCW1lbnUxLmRpc3Bvc2UoKTsKLQkJbWVudTEgPSBudWxsOwotCX0KLQlpZiAobWVudTIgIT0gbnVsbCkgewotCQltZW51Mi5kaXNwb3NlKCk7Ci0JCW1lbnUyID0gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZGllbnQiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR3JhZEltYWdlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkaWVudEltYWdlRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNjcmVhdGVDb250cm9sUGFuZWwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCi0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHBhcmVudCwgU1dULkZMQVQpOwotCQotCUNvbG9yTWVudSBjb2xvck1lbnUgPSBuZXcgQ29sb3JNZW51KCk7Ci0KLQkvLyBtZW51IGZvciBjb2xvckl0ZW0xCi0JbWVudTEgPSBjb2xvck1lbnUuY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWNvbG9yR0IxID0gZ2I7Ci0JCQljb2xvckl0ZW0xLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBpbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSA1dGggaXRlbSBpbiB0aGUgbWVudSAoYmx1ZSkKLQljb2xvckdCMSA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudTEuZ2V0SXRlbSg0KS5nZXREYXRhKCk7Ci0JCi0JLy8gdG9vbGJhciBpdGVtIGZvciBjb2xvcjEKLQljb2xvckl0ZW0xID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQljb2xvckl0ZW0xLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJHcmFkaWVudFRhYkl0ZW0xIikpOwotCWNvbG9ySXRlbTEuc2V0SW1hZ2UoY29sb3JHQjEuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9ySXRlbTEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCl7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBUb29sSXRlbSB0b29sSXRlbSA9IChUb29sSXRlbSkgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgVG9vbEJhciAgdG9vbEJhciA9IHRvb2xJdGVtLmdldFBhcmVudCgpOwotCQkJUmVjdGFuZ2xlIHRvb2xJdGVtQm91bmRzID0gdG9vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHRvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sSXRlbUJvdW5kcy54LCB0b29sSXRlbUJvdW5kcy55KSk7Ci0JCQltZW51MS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgdG9vbEl0ZW1Cb3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUxLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBtZW51IGZvciBjb2xvckl0ZW0yCi0JbWVudTIgPSBjb2xvck1lbnUuY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWNvbG9yR0IyID0gZ2I7Ci0JCQljb2xvckl0ZW0yLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBpbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSAzcmQgaXRlbSBpbiB0aGUgbWVudSAocmVkKQotCWNvbG9yR0IyID0gKEdyYXBoaWNzQmFja2dyb3VuZCltZW51Mi5nZXRJdGVtKDIpLmdldERhdGEoKTsKLQkKLQkvLyB0b29sYmFyIGl0ZW0gZm9yIGNvbG9yMgotCWNvbG9ySXRlbTIgPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCWNvbG9ySXRlbTIuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYWRpZW50VGFiSXRlbTIiKSk7Ci0JY29sb3JJdGVtMi5zZXRJbWFnZShjb2xvckdCMi5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JJdGVtMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIFRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBUb29sQmFyICB0b29sQmFyID0gdG9vbEl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQlSZWN0YW5nbGUgdG9vbEl0ZW1Cb3VuZHMgPSB0b29sSXRlbS5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gdG9vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KHRvb2xJdGVtQm91bmRzLngsIHRvb2xJdGVtQm91bmRzLnkpKTsKLQkJCW1lbnUyLnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyB0b29sSXRlbUJvdW5kcy5oZWlnaHQpOwotCQkJbWVudTIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotCQotCS8vIHRvb2xiYXIgaXRlbSBmb3Igc3dhcHBpbmcgY29sb3JzCi0JVG9vbEl0ZW0gc3dhcEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCXN3YXBJdGVtLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTd2FwQ29sb3JzIikpOyAvLyROT04tTkxTLTEkCi0Jc3dhcEl0ZW0uc2V0SW1hZ2UoZXhhbXBsZS5sb2FkSW1hZ2UoZGlzcGxheSwgInN3YXAuZ2lmIikpOwotCXN3YXBJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJR3JhcGhpY3NCYWNrZ3JvdW5kIHRtcCA9IGNvbG9yR0IxOwotCQkJY29sb3JHQjEgPSBjb2xvckdCMjsKLQkJCWNvbG9yR0IyID0gdG1wOwotCQkJY29sb3JJdGVtMS5zZXRJbWFnZShjb2xvckdCMS5nZXRUaHVtYk5haWwoKSk7Ci0JCQljb2xvckl0ZW0yLnNldEltYWdlKGNvbG9yR0IyLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLX0KLQotLyoqCi0gKiBUaGlzIG1ldGhvZCBkcmF3cyB0aGUgZ3JhZGllbnQgcGF0dGVybnMgdGhhdCBtYWtlIHVwIHRoZSBpbWFnZS4gVGhlIGltYWdlCi0gKiBjb25zaXN0cyBvZiA0IHJvd3MsIGVhY2ggY29uc2lzdGluZyBvZiA0IGdyYWRpZW50IHBhdHRlcm5zICh0b3RhbCBvZiAxNikuCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JSW1hZ2UgaW1hZ2UgPSBjcmVhdGVJbWFnZShkZXZpY2UsIGNvbG9yR0IxLmdldEJnQ29sb3IxKCksIGNvbG9yR0IyLmdldEJnQ29sb3IxKCksIHdpZHRoLCBoZWlnaHQpOwotCVBhdHRlcm4gcCA9IG5ldyBQYXR0ZXJuKGRldmljZSwgaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHApOwotCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0KLQlwLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci0KLQotLyoqCi0gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGltYWdlIG1hZGUgdXAgb2YgZ3JhZGllbnQgcGF0dGVybnMuIFRoZSBpbWFnZSB0YWtlcyB1cAotICogYSBxdWFydGVyIG9mIHRoZSBhcmVhIG9mIHRoZSB0b3RhbCBkcmF3aW5nIHN1cmZhY2UuCi0gKiAKLSAqIEBwYXJhbSBkZXZpY2UKLSAqICAgICAgICAgICAgQSBEZXZpY2UKLSAqIEBwYXJhbSBjb2xvcjEKLSAqICAgICAgICAgICAgQSBDb2xvcgotICogQHBhcmFtIGNvbG9yMgotICogICAgICAgICAgICBBIENvbG9yCi0gKiBAcGFyYW0gd2lkdGgKLSAqICAgICAgICAgICAgV2lkdGggb2YgdGhlIGRyYXdpbmcgc3VyZmFjZQotICogQHBhcmFtIGhlaWdodAotICogICAgICAgICAgICBIZWlnaHQgb2YgdGhlIGRyYXdpbmcgc3VyZmFjZQotICovCi1JbWFnZSBjcmVhdGVJbWFnZShEZXZpY2UgZGV2aWNlLCBDb2xvciBjb2xvcjEsIENvbG9yIGNvbG9yMiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGV2aWNlLCB3aWR0aC8yLCBoZWlnaHQvMik7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCi0JUGF0dGVybiBwYXR0ZXJuMSA9IG5ldyBQYXR0ZXJuKGRldmljZSwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgvMmYsIHJlY3QuaGVpZ2h0LzJmLCBjb2xvcjEsIGNvbG9yMik7Ci0JZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybjEpOwkKLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLzRmLCBoZWlnaHQvNGYpOwotCXBhdGguYWRkUmVjdGFuZ2xlKHdpZHRoLzRmLCBoZWlnaHQvNGYsIHdpZHRoLzRmLCBoZWlnaHQvNGYpOwotCWdjLmZpbGxQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCVBhdHRlcm4gcGF0dGVybjIgPSBuZXcgUGF0dGVybihkZXZpY2UsIHJlY3Qud2lkdGgsIDAsIHJlY3Qud2lkdGgvMmYsIHJlY3QuaGVpZ2h0LzJmLCBjb2xvcjEsIGNvbG9yMik7Ci0JZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybjIpOwotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkUmVjdGFuZ2xlKHdpZHRoLzRmLCAwLCB3aWR0aC80ZiwgaGVpZ2h0LzRmKTsKLQlwYXRoLmFkZFJlY3RhbmdsZSgwLCBoZWlnaHQvNGYsIHdpZHRoLzRmLCBoZWlnaHQvNGYpOwotCWdjLmZpbGxQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwkKLQotCWdjLmRpc3Bvc2UoKTsKLQlwYXR0ZXJuMS5kaXNwb3NlKCk7Ci0JcGF0dGVybjIuZGlzcG9zZSgpOwotCXJldHVybiBpbWFnZTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY0FudGlhbGlhc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY0FudGlhbGlhc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJmNzAwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNBbnRpYWxpYXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYW50aWFsaWFzaW5nIGZvciBncmFwaGljcy4gQW50aWFsaWFzaW5nIGlzIHVzZWQgZm9yCi0gKiBzbW9vdGhpbmcgamFnZ2VkIGVkZ2VzIGluIGdyYXBoaWNzLiBUaGlzIHRhYiBhbGxvd3MgdGhlIHVzZXIgdG8gc2VlIHRoZQotICogZWZmZWN0cyBvZiBkaWZmZXJlbnQgYW50aWFsaWFzaW5nIHZhbHVlcy4KLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNBbnRpYWxpYXNUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLQlDb21ibyBhbGlhc0NvbWJvOwotCWludFtdIGFsaWFzVmFsdWVzID0geyBTV1QuT0ZGLCBTV1QuREVGQVVMVCwgU1dULk9OIH07Ci0JCi0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCU1lbnUgbWVudTsKLQlHcmFwaGljc0JhY2tncm91bmQgb3ZhbENvbG9yR0I7Ci0KLQkKLXB1YmxpYyBHcmFwaGljQW50aWFsaWFzVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQW50aWFsaWFzaW5nIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkdyYXBoaWNzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmdHcmFwaGljc0Rlc2MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCUNvbXBvc2l0ZSBjb21wOwotCQotCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGFudGlhbGlhc2luZwotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkFudGlhbGlhc2luZyIpKTsgLy8kTk9OLU5MUy0xJAotCWFsaWFzQ29tYm8gPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTik7Ci0JYWxpYXNDb21iby5hZGQoIk9GRiIpOwotCWFsaWFzQ29tYm8uYWRkKCJERUZBVUxUIik7Ci0JYWxpYXNDb21iby5hZGQoIk9OIik7Ci0JYWxpYXNDb21iby5zZWxlY3QoMCk7Ci0JYWxpYXNDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldENvbG9ySXRlbXModHJ1ZSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQlvdmFsQ29sb3JHQiA9IGdiOwotCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNyZWF0ZSBjb2xvciBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkKLSAgICAvLyBpbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSA1dGggaXRlbSBpbiB0aGUgbWVudSAoYmx1ZSkKLQlvdmFsQ29sb3JHQiA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDQpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCWNvbG9yQnV0dG9uLnNldEltYWdlKG92YWxDb2xvckdCLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5HcmFwaGljc1RhYiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsIGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQotCWlmIChvdmFsQ29sb3JHQiAhPSBudWxsICYmIG92YWxDb2xvckdCLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkKLQkJZ2Muc2V0QmFja2dyb3VuZChvdmFsQ29sb3JHQi5nZXRCZ0NvbG9yMSgpKTsKLQkKLQlnYy5zZXRBbnRpYWxpYXMoYWxpYXNWYWx1ZXNbYWxpYXNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXSk7Ci0KLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCWZsb2F0IG9mZnNldFggPSAyKndpZHRoLzNmLCBvZmZzZXRZID0gaGVpZ2h0LzNmOwotCWZvcihpbnQgaT0wOyBpIDwgMjU7IGkrKykgewotCQlwYXRoLmFkZEFyYyhvZmZzZXRYLSg1MCppKSwgb2Zmc2V0WS0oMjUqaSksIDUwKygxMDAqaSksIDI1Kyg1MCppKSwgMCwgMzYwKTsKLQl9Ci0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzQmFja2dyb3VuZC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NCYWNrZ3JvdW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTlmZWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NCYWNrZ3JvdW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3Igc3RvcmluZyBkYXRhIHJlbGV2YW50IHRvIGEgYmFja2dyb3VuZC4KLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNzQmFja2dyb3VuZCB7Ci0JCi0JcHJpdmF0ZSBJbWFnZSBiZ0ltYWdlOwotCXByaXZhdGUgSW1hZ2UgdGh1bWJOYWlsOwotCXByaXZhdGUgQ29sb3IgYmdDb2xvcjE7Ci0JcHJpdmF0ZSBDb2xvciBiZ0NvbG9yMjsKLQkKLQlwdWJsaWMgR3JhcGhpY3NCYWNrZ3JvdW5kKCkgewotCQliZ0ltYWdlID0gbnVsbDsKLQkJdGh1bWJOYWlsID0gbnVsbDsKLQkJYmdDb2xvcjEgPSBudWxsOwotCQliZ0NvbG9yMiA9IG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEJnSW1hZ2UoKSB7Ci0JCXJldHVybiBiZ0ltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJnSW1hZ2UoSW1hZ2UgYmdJbWFnZSkgewotCQl0aGlzLmJnSW1hZ2UgPSBiZ0ltYWdlOwotCX0KLQotCXB1YmxpYyBDb2xvciBnZXRCZ0NvbG9yMSgpIHsKLQkJcmV0dXJuIGJnQ29sb3IxOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJnQ29sb3IxKENvbG9yIGJnQ29sb3IxKSB7Ci0JCXRoaXMuYmdDb2xvcjEgPSBiZ0NvbG9yMTsKLQl9Ci0KLQlwdWJsaWMgQ29sb3IgZ2V0QmdDb2xvcjIoKSB7Ci0JCXJldHVybiBiZ0NvbG9yMjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZ0NvbG9yMihDb2xvciBiZ0NvbG9yMikgewotCQl0aGlzLmJnQ29sb3IyID0gYmdDb2xvcjI7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldFRodW1iTmFpbCgpIHsKLQkJcmV0dXJuIHRodW1iTmFpbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaHVtYk5haWwoSW1hZ2UgdGh1bWJOYWlsKSB7Ci0JCXRoaXMudGh1bWJOYWlsID0gdGh1bWJOYWlsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjE4NzguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvR3JhcGhpY3NFeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIG1haW4gY2xhc3Mgb2YgdGhlIGdyYXBoaWNzIGFwcGxpY2F0aW9uLiBWYXJpb3VzICJ0YWJzIiBhcmUKLSAqIGNyZWF0ZWQgYW5kIG1hZGUgdmlzaWJsZSBieSB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY3NFeGFtcGxlIHsKLQkJCi0JQ29tcG9zaXRlIHBhcmVudDsKLQlHcmFwaGljc1RhYltdIHRhYnM7CQkJCS8vIHRhYnMgdG8gYmUgZm91bmQgaW4gdGhlIGFwcGxpY2F0aW9uCi0JR3JhcGhpY3NUYWIgdGFiOwkJCQkvLyB0aGUgY3VycmVudCB0YWIKLQlHcmFwaGljc0JhY2tncm91bmQgYmFja2dyb3VuZDsJLy8gdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFja2dyb3VuZAotCQotCVRvb2xCYXIgdG9vbEJhcjsJCQkJLy8gdG9vbGJhciB0aGF0IGNvbnRhaW5zIGJhY2tJdGVtIGFuZCBkYkl0ZW0KLQlUcmVlIHRhYkxpc3Q7CQkJCQkvLyB0cmVlIHN0cnVjdHVyZSBvZiB0YWJzCi0JVGV4dCB0YWJEZXNjOwkJCQkJLy8gbXVsdGktbGluZSB0ZXh0IHdpZGdldCB0aGF0IGRpc3BsYXlzIGEgdGFiIGRlc2NyaXB0aW9uCi0JU2FzaCBoU2FzaCwgdlNhc2g7Ci0JQ2FudmFzIGNhbnZhczsKLQlDb21wb3NpdGUgdGFiQ29udHJvbFBhbmVsOwotCVRvb2xJdGVtIGJhY2tJdGVtLCBkYkl0ZW07CQkvLyBiYWNrZ3JvdW5kLCBkb3VibGUgYnVmZmVyIGl0ZW1zCi0JTWVudSBiYWNrTWVudTsJCQkJCS8vIGJhY2tncm91bmQgbWVudSBpdGVtCi0JCi0JQXJyYXlMaXN0IHJlc291cmNlczsJCQkvLyBzdG9yZXMgcmVzb3VyY2VzIHRoYXQgd2lsbCBiZSBkaXNwb3NlZAotCUFycmF5TGlzdCB0YWJzX2luX29yZGVyOwkJLy8gc3RvcmVzIEdyYXBoaWNzVGFicyBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFwcGVhciBpbiB0aGUgdHJlZQotCWJvb2xlYW4gYW5pbWF0ZSA9IHRydWU7CQkJLy8gd2hldGhlciBhbmltYXRpb24gc2hvdWxkIGhhcHBlbgotCi0Jc3RhdGljIGJvb2xlYW4gYWR2YW5jZUdyYXBoaWNzLCBhZHZhbmNlR3JhcGhpY3NJbml0OwotCQotCXN0YXRpYyBmaW5hbCBpbnQgTUFSR0lOID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IFNBU0hfU1BBQ0lORyA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBUSU1FUiA9IDMwOwotCXN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2dyYXBoaWNzIik7IC8vJE5PTi1OTFMtMSQKLQotLyoKLSAqIERlZmF1bHQgY29uc3RydWN0b3IgaXMgbmVlZGVkIHNvIHRoYXQgZXhhbXBsZSBsYXVuY2hlciBjYW4gY3JlYXRlIGFuIGluc3RhbmNlLiAKLSAqLwotcHVibGljIEdyYXBoaWNzRXhhbXBsZSgpIHsKLQlzdXBlcigpOwotfQotCi1wdWJsaWMgR3JhcGhpY3NFeGFtcGxlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JY3JlYXRlQ29udHJvbHMocGFyZW50KTsKLQlzZXRUYWIodGFiKTsKLQlzdGFydEFuaW1hdGlvblRpbWVyKCk7Ci19Ci0KLWJvb2xlYW4gY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkgewotCWlmIChhZHZhbmNlR3JhcGhpY3NJbml0KSByZXR1cm4gYWR2YW5jZUdyYXBoaWNzOwotCWFkdmFuY2VHcmFwaGljc0luaXQgPSB0cnVlOwotCURpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGlzcGxheSk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCVNoZWxsIHNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpLCBuZXdTaGVsbCA9IG51bGw7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSBzaGVsbCA9IG5ld1NoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9XQVJOSU5HIHwgU1dULk9LKTsKLQkJZGlhbG9nLnNldFRleHQoUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZygiV2FybmluZyIpKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuc2V0TWVzc2FnZShSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKCJMaWJOb3RGb3VuZCIpKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cub3BlbigpOwotCQlpZiAobmV3U2hlbGwgIT0gbnVsbCkgbmV3U2hlbGwuZGlzcG9zZSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiBhZHZhbmNlR3JhcGhpY3MgPSB0cnVlOwotfQotCi12b2lkIGNyZWF0ZUNvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQl0YWJzID0gY3JlYXRlVGFicygpOwotCWNyZWF0ZVRvb2xCYXIocGFyZW50KTsKLQljcmVhdGVUYWJMaXN0KHBhcmVudCk7Ci0JaFNhc2ggPSBuZXcgU2FzaChwYXJlbnQsIFNXVC5IT1JJWk9OVEFMKTsKLQljcmVhdGVUYWJEZXNjKHBhcmVudCk7CQotCXZTYXNoID0gbmV3IFNhc2gocGFyZW50LCBTV1QuVkVSVElDQUwpOwotCWNyZWF0ZUNhbnZhcyhwYXJlbnQpOwotCWNyZWF0ZUNvbnRyb2xQYW5lbChwYXJlbnQpOwotCQotCUZvcm1EYXRhIGRhdGE7Ci0JRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCgpOwotCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIE1BUkdJTik7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgTUFSR0lOKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLU1BUkdJTik7Ci0JdG9vbEJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBNQVJHSU4pOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRvb2xCYXIsIE1BUkdJTik7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh2U2FzaCwgLVNBU0hfU1BBQ0lORyk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoaFNhc2gsIC1TQVNIX1NQQUNJTkcpOwotCXRhYkxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgTUFSR0lOKTsKLQlpbnQgb2Zmc2V0ID0gcGFyZW50LmdldEJvdW5kcygpLmhlaWdodCAtIHRhYkRlc2MuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIHRhYkRlc2MuZ2V0TGluZUhlaWdodCgpICogMTApLnk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobnVsbCwgb2Zmc2V0KTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZTYXNoLCAtU0FTSF9TUEFDSU5HKTsKLQloU2FzaC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCBNQVJHSU4pOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGhTYXNoLCBTQVNIX1NQQUNJTkcpOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodlNhc2gsIC1TQVNIX1NQQUNJTkcpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLU1BUkdJTik7Ci0JdGFiRGVzYy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobnVsbCwgdGFiTGlzdC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnggKyA1MCk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbEJhciwgTUFSR0lOKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1NQVJHSU4pOwotCXZTYXNoLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZTYXNoLCBTQVNIX1NQQUNJTkcpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRvb2xCYXIsIE1BUkdJTik7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1NQVJHSU4pOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KHRhYkNvbnRyb2xQYW5lbCk7Ci0JY2FudmFzLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHZTYXNoLCBTQVNIX1NQQUNJTkcpOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtTUFSR0lOKTsKLQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1NQVJHSU4pOwotCXRhYkNvbnRyb2xQYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCXZTYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaFNhc2guZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJZXZlbnQueCA9IE1hdGgubWluIChNYXRoLm1heCAoZXZlbnQueCwgNjApLCByZWN0LndpZHRoIC0gNjApOwotCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCUZvcm1EYXRhIGRhdGEgPSAoRm9ybURhdGEpdlNhc2guZ2V0TGF5b3V0RGF0YSgpOwotCQkJCWRhdGEubGVmdC5vZmZzZXQgPSBldmVudC54OwotCQkJCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCQkJYW5pbWF0ZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWFuaW1hdGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0pOwotCWhTYXNoLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gdlNhc2guZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJZXZlbnQueSA9IE1hdGgubWluIChNYXRoLm1heCAoZXZlbnQueSwgdGFiTGlzdC5nZXRMb2NhdGlvbigpLnkgKyA2MCksIHJlY3QuaGVpZ2h0IC0gNjApOwotCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCUZvcm1EYXRhIGRhdGEgPSAoRm9ybURhdGEpaFNhc2guZ2V0TGF5b3V0RGF0YSgpOwotCQkJCWRhdGEudG9wLm9mZnNldCA9IGV2ZW50Lnk7Ci0JCQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJCX0KLQkJfQotCX0pOwotfQotCi12b2lkIGNyZWF0ZUNhbnZhcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JaW50IHN0eWxlID0gU1dULk5PX0JBQ0tHUk9VTkQ7Ci0JaWYgKGRiSXRlbS5nZXRTZWxlY3Rpb24oKSkgc3R5bGUgfD0gU1dULkRPVUJMRV9CVUZGRVJFRDsKLQljYW52YXMgPSBuZXcgQ2FudmFzKHBhcmVudCwgc3R5bGUpOwotCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7CQkJCi0JCQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCQkJaWYgKGJhY2tncm91bmQuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGJhY2tncm91bmQuZ2V0QmdDb2xvcjIoKSAhPSBudWxsKSB7IC8vIGdyYWRpZW50Ci0JCQkJCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIDAsIDAsIHJlY3Qud2lkdGgsIAotCQkJCQkJCXJlY3QuaGVpZ2h0LAotCQkJCQkJCWJhY2tncm91bmQuZ2V0QmdDb2xvcjEoKSwKLQkJCQkJCQliYWNrZ3JvdW5kLmdldEJnQ29sb3IyKCkpOwotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQkJCQl9IGVsc2UgewkvLyBzb2xpZCBjb2xvcgotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQuZ2V0QmdDb2xvcjEoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7CQkvLyBpbWFnZQotCQkJCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGJhY2tncm91bmQuZ2V0QmdJbWFnZSgpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQkJCX0KLQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdCk7Ci0JCQlHcmFwaGljc1RhYiB0YWIgPSBnZXRUYWIoKTsKLQkJCWlmICh0YWIgIT0gbnVsbCkgdGFiLnBhaW50KGdjLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQlpZiAocGF0dGVybiAhPSBudWxsKSBwYXR0ZXJuLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotfQotCi12b2lkIHJlY3JlYXRlQ2FudmFzKCkgewotCWlmIChkYkl0ZW0uZ2V0U2VsZWN0aW9uKCkgPT0gKChjYW52YXMuZ2V0U3R5bGUoKSAmIFNXVC5ET1VCTEVfQlVGRkVSRUQpICE9IDApKSByZXR1cm47Ci0JT2JqZWN0IGRhdGEgPSBjYW52YXMuZ2V0TGF5b3V0RGF0YSgpOwotCWlmIChjYW52YXMgIT0gbnVsbCkgY2FudmFzLmRpc3Bvc2UoKTsKLQljcmVhdGVDYW52YXMocGFyZW50KTsKLQljYW52YXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotfQotCi0vKioKLSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wgcGFuZWwgCi0gKiBAcGFyYW0gcGFyZW50Ci0gKi8KLXZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlHcm91cCBncm91cDsKLQl0YWJDb250cm9sUGFuZWwgPSBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQlncm91cC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJTZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotCXRhYkNvbnRyb2xQYW5lbC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLX0KLQotdm9pZCBjcmVhdGVUb29sQmFyKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQotCXRvb2xCYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5GTEFUKTsKLQkKLQlUb29sSXRlbSAgYmFjayA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JYmFjay5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJCYWNrIikpOyAvLyROT04tTkxTLTEkCi0JYmFjay5zZXRJbWFnZShsb2FkSW1hZ2UoZGlzcGxheSwgImJhY2suZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCi0JYmFjay5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgaW5kZXggPSB0YWJzX2luX29yZGVyLmluZGV4T2YodGFiKSAtIDE7Ci0JCQlpZiAoaW5kZXggPCAwKQotCQkJCWluZGV4ID0gdGFic19pbl9vcmRlci5zaXplKCkgLSAxOwotCQkJc2V0VGFiKChHcmFwaGljc1RhYil0YWJzX2luX29yZGVyLmdldChpbmRleCkpOwotCQl9Ci0JfSk7Ci0JCi0JVG9vbEl0ZW0gIG5leHQgPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCW5leHQuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygiTmV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCW5leHQuc2V0SW1hZ2UobG9hZEltYWdlKGRpc3BsYXksICJuZXh0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCW5leHQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaW50IGluZGV4ID0gKHRhYnNfaW5fb3JkZXIuaW5kZXhPZih0YWIpICsgMSkldGFic19pbl9vcmRlci5zaXplKCk7Ci0JCQlzZXRUYWIoKEdyYXBoaWNzVGFiKXRhYnNfaW5fb3JkZXIuZ2V0KGluZGV4KSk7Ci0JCX0KLQl9KTsKLQkKLQlDb2xvck1lbnUgY29sb3JNZW51ID0gbmV3IENvbG9yTWVudSgpOwotCQotCS8vIHNldHVwIGl0ZW1zIHRvIGJlIGNvbnRhaW5lZCBpbiB0aGUgYmFja2dyb3VuZCBtZW51Ci0JY29sb3JNZW51LnNldENvbG9ySXRlbXModHJ1ZSk7Ci0JY29sb3JNZW51LnNldFBhdHRlcm5JdGVtcyhjaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JY29sb3JNZW51LnNldEdyYWRpZW50SXRlbXMoY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCQotCS8vIGNyZWF0ZSB0aGUgYmFja2dyb3VuZCBtZW51Ci0JYmFja01lbnUgPSBjb2xvck1lbnUuY3JlYXRlTWVudShwYXJlbnQsIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWJhY2tncm91bmQgPSBnYjsKLQkJCWJhY2tJdGVtLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWlmIChjYW52YXMgIT0gbnVsbCkgY2FudmFzLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbWVudQotCWJhY2tncm91bmQgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKWJhY2tNZW51LmdldEl0ZW0oMCkuZ2V0RGF0YSgpOwotCQotCS8vIGJhY2tncm91bmQgdG9vbCBpdGVtCi0JYmFja0l0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCWJhY2tJdGVtLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIkJhY2tncm91bmQiKSk7IC8vJE5PTi1OTFMtMSQKLQliYWNrSXRlbS5zZXRJbWFnZShiYWNrZ3JvdW5kLmdldFRodW1iTmFpbCgpKTsKLQliYWNrSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJhY2tJdGVtKSB7Ci0JCQkJZmluYWwgVG9vbEl0ZW0gdG9vbEl0ZW0gPSAoVG9vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQlmaW5hbCBUb29sQmFyICB0b29sQmFyID0gdG9vbEl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJUmVjdGFuZ2xlIHRvb2xJdGVtQm91bmRzID0gdG9vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJUG9pbnQgcG9pbnQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEl0ZW1Cb3VuZHMueCwgdG9vbEl0ZW1Cb3VuZHMueSkpOwotCQkJCWJhY2tNZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyB0b29sSXRlbUJvdW5kcy5oZWlnaHQpOwotCQkJCWJhY2tNZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkvLyBkb3VibGUgYnVmZmVyIHRvb2wgaXRlbQotCWRiSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCWRiSXRlbS5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJEb3VibGVCdWZmZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQlkYkl0ZW0uc2V0SW1hZ2UobG9hZEltYWdlKGRpc3BsYXksICJkYi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQlkYkl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJc2V0RG91YmxlQnVmZmVyZWQoZGJJdGVtLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0pOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSB0aHVtYm5haWwgaW1hZ2UuCi0gKiAKLSAqIEBwYXJhbSBkZXZpY2UKLSAqIAkJCWEgZGV2aWNlCi0gKiBAcGFyYW0gbmFtZQotICogCQkJZmlsZW5hbWUgb2YgdGhlIGltYWdlCi0gKi8KLXN0YXRpYyBJbWFnZSBjcmVhdGVUaHVtYm5haWwoRGV2aWNlIGRldmljZSwgU3RyaW5nIG5hbWUpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkZXZpY2UsIG5hbWUpOwotCVJlY3RhbmdsZSBzcmMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlJbWFnZSByZXN1bHQgPSBudWxsOwotCWlmIChzcmMud2lkdGggIT0gMTYgfHwgc3JjLmhlaWdodCAhPSAxNikgewotCQlyZXN1bHQgPSBuZXcgSW1hZ2UoZGV2aWNlLCAxNiwgMTYpOwotCQlHQyBnYyA9IG5ldyBHQyhyZXN1bHQpOwotCQlSZWN0YW5nbGUgZGVzdCA9IHJlc3VsdC5nZXRCb3VuZHMoKTsKLQkJZ2MuZHJhd0ltYWdlKGltYWdlLCBzcmMueCwgc3JjLnksIHNyYy53aWR0aCwgc3JjLmhlaWdodCwgZGVzdC54LCBkZXN0LnksIGRlc3Qud2lkdGgsIGRlc3QuaGVpZ2h0KTsKLQkJZ2MuZGlzcG9zZSgpOwkJCQkKLQl9Ci0JaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcmV0dXJuIGltYWdlOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYW4gaW1hZ2UgYmFzZWQgb24gYSBncmFkaWVudCBwYXR0ZXJuIG1hZGUgdXAgb2YgdHdvIGNvbG9ycy4KLSAqIAotICogQHBhcmFtIGRldmljZSAtIFRoZSBEZXZpY2UKLSAqIEBwYXJhbSBjb2xvcjEgLSBUaGUgZmlyc3QgY29sb3IgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlCi0gKiBAcGFyYW0gY29sb3IyIC0gVGhlIHNlY29uZCBjb2xvciB1c2VkIHRvIGNyZWF0ZSB0aGUgaW1hZ2UKLSAqIAotICogKi8KLXN0YXRpYyBJbWFnZSBjcmVhdGVJbWFnZShEZXZpY2UgZGV2aWNlLCBDb2xvciBjb2xvcjEsIENvbG9yIGNvbG9yMiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGV2aWNlLCB3aWR0aCwgaGVpZ2h0KTsKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoIC0gMSwKLQkJCQlyZWN0LmhlaWdodCAtIDEsIGNvbG9yMSwgY29sb3IyKTsKLQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QpOwotCWdjLmRyYXdSZWN0YW5nbGUocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGggLSAxLCByZWN0LmhlaWdodCAtIDEpOwotCWdjLmRpc3Bvc2UoKTsKLQlwYXR0ZXJuLmRpc3Bvc2UoKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhbiBpbWFnZSBiYXNlZCBvbiB0aGUgY29sb3IgcHJvdmlkZWQgYW5kIHJldHVybnMgaXQuCi0gKiAKLSAqIEBwYXJhbSBkZXZpY2UgLSBUaGUgRGV2aWNlCi0gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlCi0gKiAKLSAqICovCi1zdGF0aWMgSW1hZ2UgY3JlYXRlSW1hZ2UoRGV2aWNlIGRldmljZSwgQ29sb3IgY29sb3IpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkZXZpY2UsIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShyZWN0KTsKLQlpZiAoY29sb3IuZXF1YWxzKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKSkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQl9Ci0JZ2MuZHJhd1JlY3RhbmdsZShyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCAtIDEsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0JZ2MuZGlzcG9zZSgpOwotCXJldHVybiBpbWFnZTsKLX0KLQotdm9pZCBjcmVhdGVUYWJMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQl0YWJMaXN0ID0gbmV3IFRyZWUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JQXJyYXlzLnNvcnQodGFicywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgdGFiMCwgT2JqZWN0IHRhYjEpIHsKLQkJCXJldHVybiAoKEdyYXBoaWNzVGFiKXRhYjApLmdldFRleHQoKS5jb21wYXJlVG8oKChHcmFwaGljc1RhYil0YWIxKS5nZXRUZXh0KCkpOwotCQl9Ci0JfSk7Ci0JSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewotCQlHcmFwaGljc1RhYiB0YWIgPSB0YWJzW2ldOwotCQlzZXQuYWRkKHRhYi5nZXRDYXRlZ29yeSgpKTsKLQl9Ci0JU3RyaW5nW10gY2F0ZWdvcmllcyA9IG5ldyBTdHJpbmdbc2V0LnNpemUoKV07Ci0Jc2V0LnRvQXJyYXkoY2F0ZWdvcmllcyk7Ci0JQXJyYXlzLnNvcnQoY2F0ZWdvcmllcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyB0ZXh0ID0gY2F0ZWdvcmllc1tpXTsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0YWJMaXN0LCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQl9Ci0JdGFic19pbl9vcmRlciA9IG5ldyBBcnJheUxpc3QoKTsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gdGFiTGlzdC5nZXRJdGVtcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHRhYnMubGVuZ3RoOyBqKyspIHsKLQkJCUdyYXBoaWNzVGFiIHRhYiA9IHRhYnNbal07Ci0JCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKHRhYi5nZXRDYXRlZ29yeSgpKSkgewotCQkJCVRyZWVJdGVtIGl0ZW0xID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQlpdGVtMS5zZXRUZXh0KHRhYi5nZXRUZXh0KCkpOwotCQkJCWl0ZW0xLnNldERhdGEodGFiKTsKLQkJCQl0YWJzX2luX29yZGVyLmFkZCh0YWIpOwotCQkJfQotCQl9Ci0JfQotCXRhYkxpc3QuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCUdyYXBoaWNzVGFiIGd0ID0gKEdyYXBoaWNzVGFiKWl0ZW0uZ2V0RGF0YSgpOwotCQkJCWlmIChndCA9PSB0YWIpIHJldHVybjsKLQkJCQlzZXRUYWIoKEdyYXBoaWNzVGFiKWl0ZW0uZ2V0RGF0YSgpKTsKLQkJCX0KLQkJfQotCX0pOwotfQotCi0vKioKLSAqIENyZWF0ZXMgdGhlIG11bHRpLWxpbmUgdGV4dCB3aWRnZXQgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHRhYiBkZXNjcmlwdGlvbi4gCi0gKiAqLwotdm9pZCBjcmVhdGVUYWJEZXNjKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQl0YWJEZXNjID0gbmV3IFRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCXRhYkRlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCXRhYkRlc2Muc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLX0KLQotLyoqCi0gKiBJbml0aWFsaXplcyB0aGUgR3JhcGhpY3NUYWIgaW5zdGFuY2VzIHRoYXQgd2lsbCBiZSBjb250YWluZWQgaW4gR3JhcGhpY3NFeGFtcGxlLgotICogKi8KLUdyYXBoaWNzVGFiW10gY3JlYXRlVGFicygpIHsKLQlyZXR1cm4gbmV3IEdyYXBoaWNzVGFiW10gewotCQluZXcgTGluZVRhYih0aGlzKSwKLQkJbmV3IFN0YXJQb2x5VGFiKHRoaXMpLAotCQl0YWIgPSBuZXcgSW50cm9UYWIodGhpcyksCi0JCW5ldyBCbGFja0hvbGVUYWIodGhpcyksCi0JCW5ldyBBbHBoYVRhYih0aGlzKSwKLQkJbmV3IEJhbGxUYWIodGhpcyksCi0JCW5ldyBDb3VudERvd25UYWIodGhpcyksCi0JCW5ldyBDdXJ2ZXNTV1RUYWIodGhpcyksCi0JCW5ldyBDdXJ2ZXNUYWIodGhpcyksCi0JCW5ldyBDdXN0b21Gb250VGFiKHRoaXMpLAotCQluZXcgRm9udEJvdW5jZVRhYih0aGlzKSwKLQkJbmV3IEdyYWRpZW50VGFiKHRoaXMpLAotCQluZXcgSW1hZ2VUcmFuc2Zvcm1UYWIodGhpcyksCi0JCW5ldyBTaGFwZXNUYWIodGhpcyksCi0JCW5ldyBNYXplVGFiKHRoaXMpLAotCQluZXcgUkdCVGFiKHRoaXMpLAotCQluZXcgU3BpcmFsVGFiKHRoaXMpLAotCQluZXcgQ2FyZHNUYWIodGhpcyksCi0JCW5ldyBMaW5lQ2FwVGFiKHRoaXMpLAotCQluZXcgSW50ZXJwb2xhdGlvblRhYih0aGlzKSwKLQkJbmV3IFBhdGhDbGlwcGluZ1RhYih0aGlzKSwKLQkJbmV3IFBhdGhDbGlwcGluZ0FuaW1UYWIodGhpcyksCi0JCW5ldyBMaW5lU3R5bGVUYWIodGhpcyksCi0JCW5ldyBMaW5lSm9pblRhYih0aGlzKSwKLQkJbmV3IFJlZ2lvbkNsaXBwaW5nVGFiKHRoaXMpLAotCQluZXcgQ3VzdG9tQWxwaGFUYWIodGhpcyksCi0JCW5ldyBUZXh0QW50aWFsaWFzVGFiKHRoaXMpLAotCQluZXcgR3JhcGhpY0FudGlhbGlhc1RhYih0aGlzKSwKLQkJbmV3IEltYWdlRmxpcFRhYih0aGlzKSwKLQkJbmV3IEltYWdlU2NhbGVUYWIodGhpcyksCi0JCW5ldyBQYXRoVGFiKHRoaXMpLAotCX07Ci19Ci0KLS8qKgotICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSByZWNlaXZlci4KLSAqLwotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAodGFicyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewotCQkJR3JhcGhpY3NUYWIgdGFiID0gdGFic1tpXTsKLQkJCXRhYi5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JdGFicyA9IG51bGw7Ci0JaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAocmVzb3VyY2VzLmdldChpKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJKChSZXNvdXJjZSlyZXNvdXJjZXMuZ2V0KGkpKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmVzb3VyY2VzID0gbnVsbDsKLQkKLQlpZiAoYmFja01lbnUgIT0gbnVsbCkgewotCQliYWNrTWVudS5kaXNwb3NlKCk7Ci0JCWJhY2tNZW51ID0gbnVsbDsKLQl9Ci19Ci0KLVRyZWVJdGVtIGZpbmRJdGVtQnlEYXRhKFRyZWVJdGVtW10gaXRlbXMsIE9iamVjdCBkYXRhKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCWlmIChpdGVtLmdldERhdGEoKSA9PSBkYXRhKSByZXR1cm4gaXRlbTsKLQkJaXRlbSA9IGZpbmRJdGVtQnlEYXRhKGl0ZW0uZ2V0SXRlbXMoKSwgZGF0YSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHJldHVybiBpdGVtOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBjdXJyZW50IHRhYi4KLSAqLwotcHVibGljIEdyYXBoaWNzVGFiIGdldFRhYigpIHsKLQlyZXR1cm4gdGFiOwotfQotCi0vKioKLSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0gKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotICovCi1zdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQl0cnkgewotCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBrZXk7Ci0JfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CQkJCi19Ci0KLXN0YXRpYyBJbWFnZSBsb2FkSW1hZ2UgKERldmljZSBkZXZpY2UsIENsYXNzIGNsYXp6LCBTdHJpbmcgc3RyaW5nKSB7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbSAoc3RyaW5nKTsKLQlpZiAoc3RyZWFtID09IG51bGwpIHJldHVybiBudWxsOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZSAoZGV2aWNlLCBzdHJlYW0pOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UgKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7fQotCX0KLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLUltYWdlIGxvYWRJbWFnZShEZXZpY2UgZGV2aWNlLCBTdHJpbmcgbmFtZSkgewotCUltYWdlIGltYWdlID0gbG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCBuYW1lKTsKLQlpZiAoaW1hZ2UgIT0gbnVsbCkgcmVzb3VyY2VzLmFkZChpbWFnZSk7Ci0JcmV0dXJuIGltYWdlOwotfQotCi1wdWJsaWMgU2hlbGwgb3BlbihmaW5hbCBEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJHcmFwaGljc0V4YW1wbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSA9IG5ldyBHcmFwaGljc0V4YW1wbGUoc2hlbGwpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXhhbXBsZS5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsJCi0Jc2hlbGwub3BlbigpOwotCXJldHVybiBzaGVsbDsKLX0KLQotLyoqCi0gKiBSZWRyYXdzIHRoZSBjdXJyZW50IHRhYi4KLSAqLwotcHVibGljIHZvaWQgcmVkcmF3KCkgewotCWNhbnZhcy5yZWRyYXcoKTsKLX0KLQotLyoqCi0gKiBTZXRzIHdoZXRlciB0aGUgY2FudmFzIGlzIGRvdWJsZSBidWZmZXJlZCBvciBub3QuCi0gKi8KLXB1YmxpYyB2b2lkIHNldERvdWJsZUJ1ZmZlcmVkKGJvb2xlYW4gZG91YmxlQnVmZmVyZWQpIHsKLQlkYkl0ZW0uc2V0U2VsZWN0aW9uKGRvdWJsZUJ1ZmZlcmVkKTsKLQlyZWNyZWF0ZUNhbnZhcygpOwotfQotCi0vKioKLSAqIEdyYWJzIGlucHV0IGZvY3VzLgotICovCi1wdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl0YWJMaXN0LnNldEZvY3VzKCk7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgY3VycmVudCB0YWIuCi0gKi8KLXB1YmxpYyB2b2lkIHNldFRhYihHcmFwaGljc1RhYiB0YWIpIHsKLQlDb250cm9sW10gY2hpbGRyZW4gPSB0YWJDb250cm9sUGFuZWwuZ2V0Q2hpbGRyZW4oKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuW2ldOwotCQljb250cm9sLmRpc3Bvc2UoKTsKLQl9Ci0JaWYgKHRoaXMudGFiICE9IG51bGwpIHRoaXMudGFiLmRpc3Bvc2UoKTsKLQl0aGlzLnRhYiA9IHRhYjsKLQlpZiAodGFiICE9IG51bGwpIHsKLQkJc2V0RG91YmxlQnVmZmVyZWQodGFiLmdldERvdWJsZUJ1ZmZlcmVkKCkpOwotCQl0YWIuY3JlYXRlQ29udHJvbFBhbmVsKHRhYkNvbnRyb2xQYW5lbCk7Ci0JCXRhYkRlc2Muc2V0VGV4dCh0YWIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfSBlbHNlIHsKLQkJdGFiRGVzYy5zZXRUZXh0KCIiKTsKLQl9Ci0JRm9ybURhdGEgZGF0YSA9IChGb3JtRGF0YSl0YWJDb250cm9sUGFuZWwuZ2V0TGF5b3V0RGF0YSgpOwotCWNoaWxkcmVuID0gdGFiQ29udHJvbFBhbmVsLmdldENoaWxkcmVuKCk7Ci0JaWYgKGNoaWxkcmVuLmxlbmd0aCAhPSAwKSB7Ci0JCWRhdGEudG9wID0gbnVsbDsKLQl9IGVsc2UgewotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1NQVJHSU4pOwotCX0KLQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCWlmICh0YWIgIT0gbnVsbCkgewotCQlUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRhYkxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDAgfHwgc2VsZWN0aW9uWzBdLmdldERhdGEoKSAhPSB0YWIpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBmaW5kSXRlbUJ5RGF0YSh0YWJMaXN0LmdldEl0ZW1zKCksIHRhYik7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSB0YWJMaXN0LnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtfSk7Ci0JCX0KLQl9Ci0JY2FudmFzLnJlZHJhdygpOwotfQotCi0vKioKLSAqIFN0YXJ0cyB0aGUgYW5pbWF0aW9uIGlmIHRoZSBhbmltYXRlIGZsYWcgaXMgc2V0LgotICovCi12b2lkIHN0YXJ0QW5pbWF0aW9uVGltZXIoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQlkaXNwbGF5LnRpbWVyRXhlYyhUSU1FUiwgbmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoY2FudmFzLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJaW50IHRpbWVvdXQgPSBUSU1FUjsKLQkJCUdyYXBoaWNzVGFiIHRhYiA9IGdldFRhYigpOwotCQkJaWYgKHRhYiBpbnN0YW5jZW9mIEFuaW1hdGVkR3JhcGhpY3NUYWIpIHsKLQkJCQlBbmltYXRlZEdyYXBoaWNzVGFiIGFuaW1UYWIgPSAoQW5pbWF0ZWRHcmFwaGljc1RhYikgdGFiOwkKLQkJCQlpZiAoYW5pbWF0ZSAmJiBhbmltVGFiLmdldEFuaW1hdGlvbigpKSB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gY2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCQkJYW5pbVRhYi5uZXh0KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCQkJY2FudmFzLnJlZHJhdygpOwotCQkJCQljYW52YXMudXBkYXRlKCk7Ci0JCQkJfQotCQkJCXRpbWVvdXQgPSAgYW5pbVRhYi5nZXRBbmltYXRpb25UaW1lKCk7Ci0JCQl9Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyh0aW1lb3V0LCB0aGlzKTsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBHcmFwaGljc0V4YW1wbGUoKS5vcGVuKGRpc3BsYXkpOwotCXdoaWxlIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9HcmFwaGljc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjJkYWRmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0dyYXBoaWNzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBvbmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBncmFwaGljLiBPdmVycmlkZSB0aGUgcGFpbnQoKQotICogbWV0aG9kIHRvIGNyZWF0ZSB0aGUgZHJhd2luZy4gVG8gY3JlYXRlIGFuIGFuaW1hdGVkIGdyYXBoaWMsIHVzZSB0aGUKLSAqIEFuaW1hdGVkR3JhcGhpY3NUYWIgY2xhc3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljc1RhYiB7Ci0JCi1HcmFwaGljc0V4YW1wbGUgZXhhbXBsZTsKLQotcHVibGljIEdyYXBoaWNzVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0JdGhpcy5leGFtcGxlID0gZXhhbXBsZTsKLX0KLQotLyoqIAotICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRyYXdpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci19Ci0KLS8qKiAKLSAqIERpc3Bvc2VzIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSByZWNlaXZlci4KLSAqLwotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLX0KLQotLyoqIAotICogQW5zd2VyIHRoZSByZWNlaXZlcidzIG5hbWUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGV4dCgpOwotCi0vKiogCi0gKiBBbnN3ZXIgdGhlIHJlY2VpdmVyJ3MgY2F0ZWdvcnkuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWlzYyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLS8qKgotICogIEFuc3dlciB0aGUgcmVjZWl2ZXIncyBkZXNjcmlwdGlvbi4KLSAqICovCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiAiIjsKLX0KLQotLyoqCi0gKiAgQW5zd2VyIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgZHJhd2luZyBzaG91bGQgYmUgZG91YmxlIGJ1ZmZlcmVyLgotICovCi1wdWJsaWMgYm9vbGVhbiBnZXREb3VibGVCdWZmZXJlZCgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKiAKLSAqIFBhaW50IHRoZSByZWNlaXZlciBpbnRvIHRoZSBzcGVjaWZpZWQgR0MuIAotICovCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ltYWdlRmxpcFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW1hZ2VGbGlwVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTU3OWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW1hZ2VGbGlwVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyBhbiBpbWFnZSBjYW4gYmUgZmxpcHBlZCBpbiB2YXJpb3VzIGZhc2hpb25zLiAKLSAqLwotcHVibGljIGNsYXNzIEltYWdlRmxpcFRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotcHVibGljIEltYWdlRmxpcFRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZsaXAiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZsaXBEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JSW1hZ2UgaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAiaG91c2VzLnBuZyIpOwotCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkKLQkvLyB0b3AKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoKHdpZHRoLWJvdW5kcy53aWR0aCkvMiwgKGhlaWdodC1ib3VuZHMuaGVpZ2h0KS8yKTsKLQl0cmFuc2Zvcm0uc2NhbGUoMSwgLTEpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkKLQkvLyBkcmF3IHRoZSBvcmlnaW5hbCBpbWFnZQotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JCi0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQkvLyBib3R0b20KLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgod2lkdGgtYm91bmRzLndpZHRoKS8yLCAyKmJvdW5kcy5oZWlnaHQgKyAoaGVpZ2h0LWJvdW5kcy5oZWlnaHQpLzIpOwotCXRyYW5zZm9ybS5zY2FsZSgxLCAtMSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCi0JLy8gZHJhdyB0aGUgb3JpZ2luYWwgaW1hZ2UKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JLy8gbGVmdAotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKCh3aWR0aC1ib3VuZHMud2lkdGgpLzIsIChoZWlnaHQtYm91bmRzLmhlaWdodCkvMik7Ci0JdHJhbnNmb3JtLnNjYWxlKC0xLCAxKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQkvLyBkcmF3IHRoZSBvcmlnaW5hbCBpbWFnZQotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JCi0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQkvLyByaWdodAotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKDIqYm91bmRzLndpZHRoICsgKHdpZHRoLWJvdW5kcy53aWR0aCkvMiwgKGhlaWdodC1ib3VuZHMuaGVpZ2h0KS8yKTsKLQl0cmFuc2Zvcm0uc2NhbGUoLTEsIDEpOwotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQotCS8vIGRyYXcgdGhlIG9yaWdpbmFsIGltYWdlCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQkKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCWdjLnNldFRyYW5zZm9ybShudWxsKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsICh3aWR0aC1ib3VuZHMud2lkdGgpLzIsIChoZWlnaHQtYm91bmRzLmhlaWdodCkvMik7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSB2YWxpZCBmb250IGZvciB0aGUgaG9zdCBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvbnQoKSB7Ci0JaWYoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQlyZXR1cm4gIkFyaWFsIjsJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCXJldHVybiAiSGVsdmV0aWNhIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJcmV0dXJuICJCYWVrbXVrIEJhdGFuZyI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCXJldHVybiAiQXJpYWwiOwotCX0gZWxzZSB7IC8vIHBob3RvbiwgZXRjIC4uLgotCQlyZXR1cm4gIlZlcmRhbmEiOwotCX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW1hZ2VTY2FsZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW1hZ2VTY2FsZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDVmOGNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ltYWdlU2NhbGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIGRlbW9uc3RyYXRlcyBob3cgYW4gaW1hZ2UgY2FuIGJlIHNjYWxlZC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZVNjYWxlVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi1wdWJsaWMgSW1hZ2VTY2FsZVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNjYWxlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTY2FsZURlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQlJbWFnZSBpbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJob3VzZXMucG5nIik7Ci0JCi0JUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCVJlY3RhbmdsZSBjYW52YXNCb3VuZHMgPSBleGFtcGxlLmNhbnZhcy5nZXRCb3VuZHMoKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgMCwgMCwgY2FudmFzQm91bmRzLndpZHRoLCBjYW52YXNCb3VuZHMuaGVpZ2h0KTsKLQkKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ltYWdlVHJhbnNmb3JtVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbWFnZVRyYW5zZm9ybVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTk3NzRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ltYWdlVHJhbnNmb3JtVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIHRyYW5zZm9ybWF0aW9ucywgc3VjaCBhcyBzY2FsaW5nLCByb3RhdGlvbiwgYW5kCi0gKiBpbnZlcnQuICBJdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSB2YWx1ZXMgZm9yIHNjYWxpbmcgYW5kIHJvdGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VUcmFuc2Zvcm1UYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLQlwcml2YXRlIFNwaW5uZXIgcm90YXRlU3Bpbm5lciwgc2NhbGVTcGlubmVyWCwgc2NhbGVTcGlubmVyWTsKLQlwcml2YXRlIEJ1dHRvbiBpbnZlcnRCdXR0b247Ci0KLS8qKgotICogQ29uc3RydWN0b3IKLSAqIEBwYXJhbSBleGFtcGxlIEEgR3JhcGhpY3NFeGFtcGxlCi0gKi8KLXB1YmxpYyBJbWFnZVRyYW5zZm9ybVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRyYW5zZm9ybSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbWFnZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVHJhbnNmb3JtSW1nRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi0vKioKLSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIGNvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSB0YWIuIFRoZSBjYWxsIHRvIHRoZQotICogY3JlYXRlQ29udHJvbFBhbmVsIG1ldGhvZCBpbiB0aGUgc3VwZXIgY2xhc3MgY3JlYXRlIHRoZSBjb250cm9scyB0aGF0IGFyZQotICogZGVmaW5lZCBpbiB0aGUgc3VwZXIgY2xhc3MuCi0gKiAKLSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUgCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCi0JQ29tcG9zaXRlIGNvbXA7Ci0JR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQotCS8vIGNyZWF0ZSBzcGlubmVyIGZvciB0aGUgcm90YXRpb24gYW5nbGUKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChncmlkTGF5b3V0KTsKLSAKLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJvdGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCXJvdGF0ZVNwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCXJvdGF0ZVNwaW5uZXIuc2V0U2VsZWN0aW9uKDApOwotCXJvdGF0ZVNwaW5uZXIuc2V0TWluaW11bSgwKTsKLQlyb3RhdGVTcGlubmVyLnNldE1heGltdW0oMzYwKTsKLQlyb3RhdGVTcGlubmVyLnNldEluY3JlbWVudCgxMCk7Ci0Jcm90YXRlU3Bpbm5lci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CQotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgYSBzbGlkZXIgZm9yIHNjYWxpbmcgYWxvbmcgdGhlIHggYXhpcwotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygieHNjYWxlIikpOyAvLyROT04tTkxTLTEkCi0Jc2NhbGVTcGlubmVyWCA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0Jc2NhbGVTcGlubmVyWC5zZXREaWdpdHMoMik7Ci0Jc2NhbGVTcGlubmVyWC5zZXRNaW5pbXVtKDEpOwotCXNjYWxlU3Bpbm5lclguc2V0TWF4aW11bSg1MDApOwotCXNjYWxlU3Bpbm5lclguc2V0U2VsZWN0aW9uKDc1KTsKLQlzY2FsZVNwaW5uZXJYLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCi0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNyZWF0ZSBhIHNsaWRlciBmb3Igc2NhbGluZyBhbG9uZyB0aGUgeSBheGlzCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQluZXcgTGFiZWwoY29tcCwgU1dULkNFTlRFUikuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInlzY2FsZSIpKTsgLy8kTk9OLU5MUy0xJAotCXNjYWxlU3Bpbm5lclkgPSBuZXcgU3Bpbm5lcihjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCXNjYWxlU3Bpbm5lclkuc2V0RGlnaXRzKDIpOwotCXNjYWxlU3Bpbm5lclkuc2V0TWluaW11bSgxKTsKLQlzY2FsZVNwaW5uZXJZLnNldE1heGltdW0oNTAwKTsKLQlzY2FsZVNwaW5uZXJZLnNldFNlbGVjdGlvbig3NSk7Ci0Jc2NhbGVTcGlubmVyWS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CQotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgYSBidXR0b24gZm9yICJpbnZlcnQiCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JaW52ZXJ0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuVE9HR0xFKTsKLQlpbnZlcnRCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkludmVydCIpKTsgLy8kTk9OLU5MUy0xJAotCWludmVydEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CQotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCUltYWdlIGltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImFjZV9jbHViLmpwZyIpOyAKLQotCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JCi0JLy8gc2NhbGUgaW1hZ2UKLQl0cmFuc2Zvcm0uc2NhbGUoc2NhbGVTcGlubmVyWC5nZXRTZWxlY3Rpb24oKS8xMDBmLCBzY2FsZVNwaW5uZXJZLmdldFNlbGVjdGlvbigpLzEwMGYpOwotCQotCS8vIHJvdGF0ZSBvbiBjZW50ZXIgb2YgaW1hZ2UKLQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUocmVjdC53aWR0aC8yLCByZWN0LmhlaWdodC8yKTsKLQl0cmFuc2Zvcm0ucm90YXRlKHJvdGF0ZVNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoLXJlY3Qud2lkdGgvMiwgLXJlY3QuaGVpZ2h0LzIpOwotCQotCWlmKGludmVydEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0JCXRyYW5zZm9ybS5pbnZlcnQoKTsKLQl9Ci0JCi0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQlnYy5kcmF3Um91bmRSZWN0YW5nbGUoMCwgMCwgaW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGgsIAotCQkJCQkJCQlpbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQsIDIyLCAyMik7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludGVycG9sYXRpb25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0ludGVycG9sYXRpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllZWY4Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbnRlcnBvbGF0aW9uVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgc2hvd3MgdGhlIGVmZmVjdHMgb2YgYXBwbHlpbmcgdmFyaW91cyBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobXMgdG8KLSAqIGltYWdlcyB0aGF0IGhhdmUgYmVlbiBzdHJldGNoZWQgb3Igc2hydW5rLgotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJwb2xhdGlvblRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQkKLQlDb21ibyBpbWFnZUNiOwkvLyBjb21ibyBmb3Igc2VsZWN0aW5nIGltYWdlcwotCi1wdWJsaWMgSW50ZXJwb2xhdGlvblRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkludGVycG9sYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkltYWdlSW50ZXJwb2xhdGlvbkRlc2MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQotCUNvbXBvc2l0ZSBjb21wOwotCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkKLQkvLyBjcmVhdGUgZHJvcCBkb3duIGNvbWJvIAotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiSW1hZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWltYWdlQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSG91c2UiKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlF1ZXN0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJUYXNrIikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGb250IikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDdWJlIikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKSk7IC8vJE5PTi1OTFMtMSQKLQlpbWFnZUNiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk92YWxzIikpOyAvLyROT04tTkxTLTEkCi0JaW1hZ2VDYi5zZWxlY3QoMCk7Ci0JaW1hZ2VDYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JZmxvYXQgc2NhbGVYID0gMTBmOwotCWZsb2F0IHNjYWxlWSA9IDEwZjsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0Jc3dpdGNoIChpbWFnZUNiLmdldFNlbGVjdGlvbkluZGV4KCkpIHsKLQkKLQljYXNlIDA6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImhvbWVfbmF2LmdpZiIpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImhlbHAuZ2lmIik7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJaW1hZ2UgPSBHcmFwaGljc0V4YW1wbGUubG9hZEltYWdlKGRldmljZSwgR3JhcGhpY3NFeGFtcGxlLmNsYXNzLCAidGFzay5naWYiKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJmb250LmdpZiIpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgImN1YmUucG5nIik7Ci0JCXNjYWxlWCA9IDAuNzVmOwotCQlzY2FsZVkgPSAwLjVmOwotCQlicmVhazsKLQljYXNlIDU6Ci0JCWltYWdlID0gR3JhcGhpY3NFeGFtcGxlLmxvYWRJbWFnZShkZXZpY2UsIEdyYXBoaWNzRXhhbXBsZS5jbGFzcywgInN3dC5wbmciKTsKLQkJc2NhbGVYID0gMC40ZjsKLQkJc2NhbGVZID0gMC44ZjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQlpbWFnZSA9IEdyYXBoaWNzRXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCBHcmFwaGljc0V4YW1wbGUuY2xhc3MsICJvdmFscy5wbmciKTsKLQkJc2NhbGVYID0gMS4xZjsKLQkJc2NhbGVZID0gMC41ZjsKLQkJYnJlYWs7Ci0JfQotCQotCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkKLQkvLyBkcmF3IHRoZSBvcmlnaW5hbCBpbWFnZQotCWdjLmRyYXdJbWFnZShpbWFnZSwgKHdpZHRoLWJvdW5kcy53aWR0aCkvMiwgMjApOwkKLQkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udCgpLCAyMCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQkKLQkvLyB3cml0ZSBzb21lIHRleHQgYmVsb3cgdGhlIG9yaWdpbmFsIGltYWdlCi0JU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk9yaWdpbmFsSW1nIik7IC8vJE5PTi1OTFMtMSQKLQlQb2ludCBzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwkKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDI1ICsgYm91bmRzLmhlaWdodCwgdHJ1ZSk7Ci0JCi0JVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKCh3aWR0aCAtIChib3VuZHMud2lkdGggKiBzY2FsZVggKyAxMCkgKiA0KSAvIDIsIDI1ICsgYm91bmRzLmhlaWdodCArIHNpemUueSArCi0JCQkJKGhlaWdodCAtICgyNSArIGJvdW5kcy5oZWlnaHQgKyBzaXplLnkgKyBib3VuZHMuaGVpZ2h0KnNjYWxlWSkpIC8gMik7Ci0JdHJhbnNmb3JtLnNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKLQotCS8vIC0tLSBkcmF3IHN0cmluZ3MgLS0tCi0JZmxvYXRbXSBwb2ludCA9IG5ldyBmbG9hdFsyXTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJOb25lIik7IC8vJE5PTi1OTFMtMSQKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwkKLQlwb2ludFswXSA9IChzY2FsZVgqYm91bmRzLndpZHRoICsgNSAtIHNpemUueCkvKDIqc2NhbGVYKTsKLQlwb2ludFsxXSA9IGJvdW5kcy5oZWlnaHQ7Ci0JdHJhbnNmb3JtLnRyYW5zZm9ybShwb2ludCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAoaW50KXBvaW50WzBdLCAoaW50KXBvaW50WzFdLCB0cnVlKTsKLQkKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMb3ciKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JcG9pbnRbMF0gPSAoc2NhbGVYKmJvdW5kcy53aWR0aCArIDUgLSBzaXplLngpLygyKnNjYWxlWCkgKyBib3VuZHMud2lkdGg7Ci0JcG9pbnRbMV0gPSBib3VuZHMuaGVpZ2h0OwotCXRyYW5zZm9ybS50cmFuc2Zvcm0ocG9pbnQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKGludClwb2ludFswXSwgKGludClwb2ludFsxXSwgdHJ1ZSk7Ci0JCi0JdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlwb2ludFswXSA9IChzY2FsZVgqYm91bmRzLndpZHRoICsgNSAtIHNpemUueCkvKDIqc2NhbGVYKSArIDIqYm91bmRzLndpZHRoOwotCXBvaW50WzFdID0gYm91bmRzLmhlaWdodDsKLQl0cmFuc2Zvcm0udHJhbnNmb3JtKHBvaW50KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsIChpbnQpcG9pbnRbMF0sIChpbnQpcG9pbnRbMV0sIHRydWUpOwotCQotCXRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkhpZ2giKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JcG9pbnRbMF0gPSAoc2NhbGVYKmJvdW5kcy53aWR0aCArIDUgLSBzaXplLngpLygyKnNjYWxlWCkgKyAzKmJvdW5kcy53aWR0aDsKLQlwb2ludFsxXSA9IGJvdW5kcy5oZWlnaHQ7Ci0JdHJhbnNmb3JtLnRyYW5zZm9ybShwb2ludCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAoaW50KXBvaW50WzBdLCAoaW50KXBvaW50WzFdLCB0cnVlKTsKLQotCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0KLQkvLyAtLS0gZHJhdyBpbWFnZXMgLS0tCi0JCi0JLy8gbm8gaW50ZXJwb2xhdGlvbgotCWdjLnNldEludGVycG9sYXRpb24oU1dULk5PTkUpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JCi0JLy8gbG93IGludGVycG9sYXRpb24KLQlnYy5zZXRJbnRlcnBvbGF0aW9uKFNXVC5MT1cpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgYm91bmRzLndpZHRoLCAwKTsKLQotCS8vIGRlZmF1bHQgaW50ZXJwb2xhdGlvbgotCWdjLnNldEludGVycG9sYXRpb24oU1dULkRFRkFVTFQpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMipib3VuZHMud2lkdGgsIDApOwotCQotCS8vIGhpZ2ggaW50ZXJwb2xhdGlvbgotCWdjLnNldEludGVycG9sYXRpb24oU1dULkhJR0gpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMypib3VuZHMud2lkdGgsIDApOwotCi0JZm9udC5kaXNwb3NlKCk7Ci0JaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIGhvc3QgcGxhdGZvcm0uCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250KCkgewotCWlmKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gIkhlbHZldGljYSI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCXJldHVybiAiQmFla211ayBCYXRhbmciOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gIkFyaWFsIjsKLQl9IGVsc2UgeyAvLyBwaG90b24sIGV0YyAuLi4KLQkJcmV0dXJuICJWZXJkYW5hIjsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbnRyb1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvSW50cm9UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxNmVmZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9JbnRyb1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBJbnRyb1RhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCQotCUZvbnQgZm9udDsKLQlJbWFnZSBpbWFnZTsKLQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCWZsb2F0IHgsIHk7Ci0gICAgZmxvYXQgaW5jWCA9IDEwLjBmOwotCWZsb2F0IGluY1kgPSA1LjBmOwotCWludCB0ZXh0V2lkdGgsIHRleHRIZWlnaHQ7Ci0JU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOwotCQotcHVibGljIEludHJvVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQlpbWFnZSA9IG51bGw7Ci0JaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JZm9udCA9IG51bGw7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW50cm9kdWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiSW50cm9kdWN0aW9uRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgIHggKz0gaW5jWDsKLSAgICB5ICs9IGluY1k7Ci0JZmxvYXQgcmFuZG9tID0gKGZsb2F0KU1hdGgucmFuZG9tKCk7IAotICAgIGlmICh4ICsgdGV4dFdpZHRoID4gd2lkdGgpIHsKLSAgICAgICAgeCA9IHdpZHRoIC0gdGV4dFdpZHRoOwotICAgICAgICBpbmNYID0gcmFuZG9tICogLXdpZHRoIC8gMTYgLSAxOwotICAgIH0KLSAgICBpZiAoeCA8IDApIHsKLSAgICAgICAgeCA9IDA7Ci0gICAgICAgIGluY1ggPSByYW5kb20gKiB3aWR0aCAvIDE2ICsgMTsKLSAgICB9Ci0gICAgaWYgKHkgKyB0ZXh0SGVpZ2h0ID4gaGVpZ2h0KSB7Ci0gICAgICAgIHkgPSAoaGVpZ2h0IC0gdGV4dEhlaWdodCktIDI7Ci0gICAgICAgIGluY1kgPSByYW5kb20gKiAtaGVpZ2h0IC8gMTYgLSAxOwotICAgIH0KLSAgICBpZiAoeSA8IDApIHsKLSAgICAgICAgeSA9IDA7Ci0gICAgICAgIGluY1kgPSByYW5kb20gKiBoZWlnaHQgLyAxNiArIDE7Ci0gICAgfQotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCWltYWdlID0gZXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCAiaXJtYW9zLmpwZyIpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlGb250RGF0YSBmZCA9IGRldmljZS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJZm9udCA9IG5ldyBGb250KGRldmljZSwgZmQuZ2V0TmFtZSgpLCByZWN0LmhlaWdodCAvIDQsIFNXVC5CT0xEKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJUG9pbnQgc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQkJdGV4dFdpZHRoID0gc2l6ZS54OwotCQl0ZXh0SGVpZ2h0ID0gc2l6ZS55OwotCX0KLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkU3RyaW5nKHRleHQsIHgsIHksIGZvbnQpOwotCWdjLnNldENsaXBwaW5nKHBhdGgpOwotCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JZ2Muc2V0Q2xpcHBpbmcoKFJlY3RhbmdsZSludWxsKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZUNhcFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZUNhcFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhmZmEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVDYXBUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdmFyaW91cyBsaW5lIGNhcHMgYXBwbGljYWJsZSB0byBhIGxpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lQ2FwVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCUdyYXBoaWNzQmFja2dyb3VuZCBmb3JlZ3JvdW5kOwotCU1lbnUgbWVudTsKLQotcHVibGljIExpbmVDYXBUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lQ2FwIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lQ2FwRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkKLQlDb21wb3NpdGUgY29tcDsKLQkJCi0JLy8gY3JlYXRlIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQlmb3JlZ3JvdW5kID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGluaXRpYWxpemUgdGhlIGZvcmVncm91bmQgdG8gdGhlIDNyZCBpdGVtIGluIHRoZSBtZW51IChyZWQpCi0JZm9yZWdyb3VuZCA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDIpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UoZm9yZWdyb3VuZC5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQkvLyBkcmF3IHNpZGUgbGluZXMKLQlnYy5zZXRMaW5lV2lkdGgoMSk7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RPVCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgaGVpZ2h0LzYsIDMqd2lkdGgvMTYsIDUqaGVpZ2h0LzYpOwotCWdjLmRyYXdMaW5lKDEzKndpZHRoLzE2LCBoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDUqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JCi0JLy8gZHJhdyBsYWJlbHMKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udCgpLCAyMCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQotCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGbGF0Iik7IC8vJE5PTi1OTFMtMSQKLQlQb2ludCBzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgMypoZWlnaHQvMTIsIHRydWUpOwotCXRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNxdWFyZSIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsJCi0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCA1KmhlaWdodC8xMiwgdHJ1ZSk7Ci0JdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCA3KmhlaWdodC8xMiwgdHJ1ZSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCWlmIChmb3JlZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQuZ2V0QmdDb2xvcjEoKSk7Ci0JfSBlbHNlIGlmIChmb3JlZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGZvcmVncm91bmQuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotCQotCS8vIGRyYXcgbGluZXMgd2l0aCBjYXBzCi0JZ2Muc2V0TGluZVdpZHRoKDIwKTsKLQlnYy5zZXRMaW5lQ2FwKFNXVC5DQVBfRkxBVCk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgMipoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDIqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVDYXAoU1dULkNBUF9TUVVBUkUpOwotCWdjLmRyYXdMaW5lKDMqd2lkdGgvMTYsIDMqaGVpZ2h0LzYsIDEzKndpZHRoLzE2LCAzKmhlaWdodC82KTsKLQlnYy5zZXRMaW5lQ2FwKFNXVC5DQVBfUk9VTkQpOwotCWdjLmRyYXdMaW5lKDMqd2lkdGgvMTYsIDQqaGVpZ2h0LzYsIDEzKndpZHRoLzE2LCA0KmhlaWdodC82KTsKLQkKLQlpZiAocGF0dGVybiAhPSBudWxsKSBwYXR0ZXJuLmRpc3Bvc2UoKTsJCi19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIHZhbGlkIGZvbnQgZm9yIHRoZSByZXNpZGVudCBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvbnQoKSB7Ci0JaWYoU1dULmdldFBsYXRmb3JtKCkgPT0gIndpbjMyIikgewotCQlyZXR1cm4gIkFyaWFsIjsJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAibW90aWYiKSB7Ci0JCXJldHVybiAiSGVsdmV0aWNhIjsJCQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gImd0ayIpIHsKLQkJcmV0dXJuICJCYWVrbXVrIEJhdGFuZyI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJjYXJib24iKSB7Ci0JCXJldHVybiAiQXJpYWwiOwotCX0gZWxzZSB7IC8vIHBob3RvbiwgZXRjIC4uLgotCQlyZXR1cm4gIlZlcmRhbmEiOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVKb2luVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lSm9pblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmRjOGNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVKb2luVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIHZhcmlvdXMgbGluZSBqb2lucy4gSXQgYWxsb3dzIGEgdXNlciB0byBjaG9vc2UgZnJvbQotICogYmV2ZWwsIG1pdGVyIGFuZCByb3VuZC4KLSAqLwotcHVibGljIGNsYXNzIExpbmVKb2luVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCQotCXByaXZhdGUgQ29tYm8gam9pbkNiOwotCXByaXZhdGUgQnV0dG9uIGNvbG9yQnV0dG9uOwotCXByaXZhdGUgR3JhcGhpY3NCYWNrZ3JvdW5kIHNoYXBlQ29sb3I7Ci0JcHJpdmF0ZSBNZW51IG1lbnU7Ci0JcHJpdmF0ZSBpbnQgW10gam9pblZhbHVlcyA9IG5ldyBpbnQgW10ge1NXVC5KT0lOX0JFVkVMLCBTV1QuSk9JTl9NSVRFUiwgU1dULkpPSU5fUk9VTkR9OwotCi1wdWJsaWMgTGluZUpvaW5UYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lSm9pbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGluZUpvaW5EZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKG1lbnUgIT0gbnVsbCkgewotCQltZW51LmRpc3Bvc2UoKTsKLQkJbWVudSA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQotCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGNob29zaW5nIGNsaXBwaW5nCi0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJMaW5lSm9pbiIpKTsgLy8kTk9OLU5MUy0xJAotCWpvaW5DYiA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQlqb2luQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJiZXZlbCIpKTsgLy8kTk9OLU5MUy0xJAotCWpvaW5DYi5hZGQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIm1pdGVyIikpOyAvLyROT04tTkxTLTEkCi0Jam9pbkNiLmFkZChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygicm91bmQiKSk7IC8vJE5PTi1OTFMtMSQKLQlqb2luQ2Iuc2VsZWN0KDEpOwotCWpvaW5DYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNvbG9yIG1lbnUKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0UGF0dGVybkl0ZW1zKGV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJc2hhcGVDb2xvciA9IGdiOwkJCi0JCQljb2xvckJ1dHRvbi5zZXRJbWFnZShnYi5nZXRUaHVtYk5haWwoKSk7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0KLQkvLyBpbml0aWFsaXplIHRoZSBzaGFwZSBjb2xvciB0byB0aGUgNHRoIGl0ZW0gaW4gdGhlIG1lbnUgKGdyZWVuKQotCXNoYXBlQ29sb3IgPShHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDMpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCWNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JY29sb3JCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZShzaGFwZUNvbG9yLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotCi19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0KLQlnYy5zZXRMaW5lV2lkdGgoMjApOwotCWdjLnNldExpbmVKb2luKGpvaW5WYWx1ZXNbam9pbkNiLmdldFNlbGVjdGlvbkluZGV4KCldKTsKLQkKLQkvLyBzZXQgdGhlIGZvcmVncm91bmQgY29sb3Igb3IgcGF0dGVybgotCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JaWYgKHNoYXBlQ29sb3IuZ2V0QmdDb2xvcjEoKSAhPSBudWxsKSB7Ci0JCWdjLnNldEZvcmVncm91bmQoc2hhcGVDb2xvci5nZXRCZ0NvbG9yMSgpKTsKLQl9IGVsc2UgaWYgKHNoYXBlQ29sb3IuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgc2hhcGVDb2xvci5nZXRCZ0ltYWdlKCkpOwotCQlnYy5zZXRGb3JlZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQl9Ci0JCi0JLy8gZHJhdyB0aGUgc2hhcGUKLQlQYXRoIHBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGgubW92ZVRvKHdpZHRoLzIsIDI1KTsKLQlwYXRoLmxpbmVUbygyKndpZHRoLzMsIGhlaWdodC8zKTsKLQlwYXRoLmxpbmVUbyh3aWR0aC0yNSwgaGVpZ2h0LzIpOwotCXBhdGgubGluZVRvKDIqd2lkdGgvMywgMipoZWlnaHQvMyk7Ci0JcGF0aC5saW5lVG8od2lkdGgvMiwgaGVpZ2h0LTI1KTsKLQlwYXRoLmxpbmVUbyh3aWR0aC8zLCAyKmhlaWdodC8zKTsKLQlwYXRoLmxpbmVUbygyNSwgaGVpZ2h0LzIpOwotCXBhdGgubGluZVRvKHdpZHRoLzMsIGhlaWdodC8zKTsKLQlwYXRoLmxpbmVUbyh3aWR0aC8yLCAyNSk7Ci0JcGF0aC5jbG9zZSgpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCWlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvTGluZVN0eWxlVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lU3R5bGVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4YzdhMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lU3R5bGVUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgbGluZSBzdHlsZXMgYXBwbGljYWJsZSB0byBhIGxpbmUuICBJdCBzaG93cyB0aGUgdXNlIG9mIHRoZQotICogPGNvZGU+R0Muc2V0TGluZVN0eWxlKCk8L2NvZGU+IG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIExpbmVTdHlsZVRhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCUJ1dHRvbiBjb2xvckJ1dHRvbjsKLQlHcmFwaGljc0JhY2tncm91bmQgbGluZUNvbG9yOwotCU1lbnUgbWVudTsKLQlTcGlubmVyIGxpbmVXaWR0aFNwaW5uZXI7Ci0KLXB1YmxpYyBMaW5lU3R5bGVUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lU3R5bGVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lU3R5bGVzRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkKLQlDb21wb3NpdGUgY29tcDsKLQkKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJMaW5lV2lkdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQlsaW5lV2lkdGhTcGlubmVyID0gbmV3IFNwaW5uZXIoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsaW5lV2lkdGhTcGlubmVyLnNldFNlbGVjdGlvbigxMCk7Ci0JbGluZVdpZHRoU3Bpbm5lci5zZXRNaW5pbXVtKDEpOwotCWxpbmVXaWR0aFNwaW5uZXIuc2V0TWF4aW11bSgzMCk7Ci0JbGluZVdpZHRoU3Bpbm5lci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQkKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0UGF0dGVybkl0ZW1zKGV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJbGluZUNvbG9yID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGNyZWF0ZSBjb2xvciBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkKLQkvLyBpbml0aWFsaXplIHRoZSBmb3JlZ3JvdW5kIHRvIHRoZSA1dGggaXRlbSBpbiB0aGUgbWVudSAoYmx1ZSkKLQlsaW5lQ29sb3IgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSg0KS5nZXREYXRhKCk7Ci0JCi0JLy8gY29sb3IgYnV0dG9uCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCWNvbG9yQnV0dG9uLnNldEltYWdlKGxpbmVDb2xvci5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCVBhdHRlcm4gcGF0dGVybiA9IG51bGw7Ci0JaWYgKGxpbmVDb2xvci5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChsaW5lQ29sb3IuZ2V0QmdDb2xvcjEoKSk7Ci0JfSBlbHNlIGlmIChsaW5lQ29sb3IuZ2V0QmdJbWFnZSgpICE9IG51bGwpIHsKLQkJcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgbGluZUNvbG9yLmdldEJnSW1hZ2UoKSk7Ci0JCWdjLnNldEZvcmVncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCX0KLQkKLQkvLyBzZXQgbGluZSB3aWR0aAotCWdjLnNldExpbmVXaWR0aChsaW5lV2lkdGhTcGlubmVyLmdldFNlbGVjdGlvbigpKTsKLQkKLQkvLyBkcmF3IGxpbmVzIHdpdGggY2FwcwotCWdjLmRyYXdMaW5lKDMqd2lkdGgvMTYsIDEqaGVpZ2h0LzYsIDEzKndpZHRoLzE2LCAxKmhlaWdodC82KTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSCk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgMipoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDIqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9ET1QpOwotCWdjLmRyYXdMaW5lKDMqd2lkdGgvMTYsIDMqaGVpZ2h0LzYsIDEzKndpZHRoLzE2LCAzKmhlaWdodC82KTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVCk7Ci0JZ2MuZHJhd0xpbmUoMyp3aWR0aC8xNiwgNCpoZWlnaHQvNiwgMTMqd2lkdGgvMTYsIDQqaGVpZ2h0LzYpOwotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9EQVNIRE9URE9UKTsKLQlnYy5kcmF3TGluZSgzKndpZHRoLzE2LCA1KmhlaWdodC82LCAxMyp3aWR0aC8xNiwgNSpoZWlnaHQvNik7Ci0JCi0JLy8gZHJhdyBsYWJlbHMKLQlGb250IGZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udCgpLCAyMCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQotCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTb2xpZCIpOyAvLyROT04tTkxTLTEkCi0JUG9pbnQgc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDEqaGVpZ2h0LzEyLCB0cnVlKTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEYXNoIik7IC8vJE5PTi1OTFMtMSQKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwkKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDMqaGVpZ2h0LzEyLCB0cnVlKTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEb3QiKTsgLy8kTk9OLU5MUy0xJAotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCA1KmhlaWdodC8xMiwgdHJ1ZSk7Ci0JdGV4dCA9IEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGFzaERvdCIpOyAvLyROT04tTkxTLTEkCi0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIDcqaGVpZ2h0LzEyLCB0cnVlKTsKLQl0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJEYXNoRG90RG90Iik7IC8vJE5PTi1OTFMtMSQKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgOSpoZWlnaHQvMTIsIHRydWUpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSB2YWxpZCBmb250IGZvciB0aGUgcmVzaWRlbnQgcGxhdGZvcm0uCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250KCkgewotCWlmKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3aW4zMiIpIHsKLQkJcmV0dXJuICJBcmlhbCI7CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gIkhlbHZldGljYSI7CQkKLQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpID09ICJndGsiKSB7Ci0JCXJldHVybiAiQmFla211ayBCYXRhbmciOwkJCi0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gIkFyaWFsIjsKLQl9IGVsc2UgeyAvLyBwaG90b24sIGV0YyAuLi4KLQkJcmV0dXJuICJWZXJkYW5hIjsKLQl9Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL0xpbmVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1Zjg1Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9MaW5lVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCi1wdWJsaWMgTGluZVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmUiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkxpbmVEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlnYy5kcmF3TGluZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQlnYy5kcmF3TGluZSh3aWR0aCwgMCwgMCwgaGVpZ2h0KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL01hemVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL01hemVUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0ZTE0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9NYXplVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFRoaXMgdGFiIHNob3dzIHRocmVlIGNpcmNsZXMsIGVhY2ggZm9sbG93aW5nIGEgZGlmZmVyZW50IHBhdGggaW4gYSBtYXplLgotICogT25seSBvbmUgb2YgdGhlIHRocmVlIGNpcmNsZXMgZm9sbG93cyB0aGUgY29ycmVjdCBwYXRoLgotICovCi1wdWJsaWMgY2xhc3MgTWF6ZVRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCi0JaW50IG5leHRJbmRleCwgbmV4dEluZGV4MiwgbmV4dEluZGV4MzsKLQlpbnQgeGNvb3JkLCB5Y29vcmQsIHhjb29yZDIsIHljb29yZDIsIHhjb29yZDMsIHljb29yZDM7Ci0JQXJyYXlMaXN0IG5leHRDb29yZCwgbmV4dENvb3JkMiwgbmV4dENvb3JkMzsKLQlib29sZWFuIGlzRG9uZSwgaXNEb25lMiwgaXNEb25lMzsKLQlJbWFnZSBpbWFnZTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RvcgotICogQHBhcmFtIGV4YW1wbGUgQSBHcmFwaGljc0V4YW1wbGUKLSAqLwotcHVibGljIE1hemVUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLQotCS8vIGNvcnJlY3QgcGF0aAotCW5leHRDb29yZCA9IG5ldyBBcnJheUxpc3QoKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVEb3duKDIwLCAtNTAsIDIwLCAxMTAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlUmlnaHQoMzAsIDExMCwgMTMwLCAxMTAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlVXAoMTM1LCAxMDAsIDEzNSwgMTUsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlUmlnaHQoMTQwLCAxNSwgMjEwLCAxNSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVEb3duKDIxMCwgMjUsIDIxMCwgNzUsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlUmlnaHQoMjIwLCA3NSwgMzIwLCA3NSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVVcCgzMjAsIDY1LCAzMjAsIDU1LCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZVJpZ2h0KDMzMCwgNTAsIDQ3NSwgNTAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlRG93big0NzUsIDYwLCA0NzUsIDIyNSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVMZWZ0KDQ2NSwgMjI1LCAyMDAsIDIyNSwgMTApKTsKLQluZXh0Q29vcmQuYWRkQWxsKG1vdmVVcCgyMDAsIDIxNSwgMjAwLCAxODAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlTGVmdCgxOTAsIDE4MCwgMTIwLCAxODAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlRG93bigxMjAsIDE5MCwgMTIwLCAzMjAsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlUmlnaHQoMTMwLCAzMjAsIDQ3NSwgMzIwLCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZURvd24oNDc1LCAzMzAsIDQ3NSwgNDM1LCAxMCkpOwotCW5leHRDb29yZC5hZGRBbGwobW92ZUxlZnQoNDY1LCA0MzUsIDIwLCA0MzUsIDEwKSk7Ci0JbmV4dENvb3JkLmFkZEFsbChtb3ZlRG93bigyMCwgNDQ1LCAyMCwgNDk1LCAxMCkpOwotCQotCW5leHRJbmRleCA9IDA7Ci0JeGNvb3JkID0gKChJbnRlZ2VyKW5leHRDb29yZC5nZXQobmV4dEluZGV4KSkuaW50VmFsdWUoKTsKLQl5Y29vcmQgPSAoKEludGVnZXIpbmV4dENvb3JkLmdldChuZXh0SW5kZXgrMSkpLmludFZhbHVlKCk7Ci0JCi0JLy8gd3JvbmcgcGF0aCAxCi0JbmV4dENvb3JkMiA9IG5ldyBBcnJheUxpc3QoKTsKLQluZXh0Q29vcmQyLmFkZEFsbChtb3ZlRG93bigyMCwgLTI1LCAyMCwgMTEwLCAxMCkpOwotCW5leHRDb29yZDIuYWRkQWxsKG1vdmVSaWdodCgzMCwgMTEwLCAxMzAsIDExMCwgMTApKTsKLQluZXh0Q29vcmQyLmFkZEFsbChtb3ZlVXAoMTM1LCAxMDAsIDEzNSwgMTUsIDEwKSk7Ci0JbmV4dENvb3JkMi5hZGRBbGwobW92ZVJpZ2h0KDE0MCwgMTUsIDUyMCwgMTUsIDEwKSk7Ci0JbmV4dENvb3JkMi5hZGRBbGwobW92ZURvd24oNTI1LCAxNSwgNTI1LCA0ODAsIDEwKSk7Ci0JbmV4dENvb3JkMi5hZGRBbGwobW92ZUxlZnQoNTE1LCA0ODAsIDcwLCA0ODAsIDEwKSk7Ci0JCi0JbmV4dEluZGV4MiA9IDA7Ci0JeGNvb3JkMiA9ICgoSW50ZWdlciluZXh0Q29vcmQyLmdldChuZXh0SW5kZXgyKSkuaW50VmFsdWUoKTsKLQl5Y29vcmQyID0gKChJbnRlZ2VyKW5leHRDb29yZDIuZ2V0KG5leHRJbmRleDIrMSkpLmludFZhbHVlKCk7Ci0JCi0JLy8gd3JvbmcgcGF0aCAyCi0JbmV4dENvb3JkMyA9IG5ldyBBcnJheUxpc3QoKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlRG93bigyMCwgMCwgMjAsIDExMCwgMTApKTsKLQluZXh0Q29vcmQzLmFkZEFsbChtb3ZlUmlnaHQoMzAsIDExMCwgMTMwLCAxMTAsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVVwKDEzNSwgMTAwLCAxMzUsIDE1LCAxMCkpOwotCW5leHRDb29yZDMuYWRkQWxsKG1vdmVSaWdodCgxNDAsIDE1LCAyMTAsIDE1LCAxMCkpOwotCW5leHRDb29yZDMuYWRkQWxsKG1vdmVEb3duKDIxMCwgMjUsIDIxMCwgNzUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVJpZ2h0KDIyMCwgNzUsIDMyMCwgNzUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVVwKDMyMCwgNjUsIDMyMCwgNTUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZVJpZ2h0KDMzMCwgNTAsIDQ3NSwgNTAsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZURvd24oNDc1LCA2MCwgNDc1LCAyMjUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZUxlZnQoNDY1LCAyMjUsIDQyNSwgMjI1LCAxMCkpOwotCW5leHRDb29yZDMuYWRkQWxsKG1vdmVVcCg0MjAsIDIyNSwgNDIwLCAxNTAsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZUxlZnQoNDIwLCAxNDUsIDcwLCAxNDUsIDEwKSk7Ci0JbmV4dENvb3JkMy5hZGRBbGwobW92ZURvd24oNzAsIDE1MCwgNzAsIDMyMCwgMTApKTsKLQkKLQluZXh0SW5kZXgzID0gMDsKLQl4Y29vcmQzID0gKChJbnRlZ2VyKW5leHRDb29yZDMuZ2V0KG5leHRJbmRleDMpKS5pbnRWYWx1ZSgpOwotCXljb29yZDMgPSAoKEludGVnZXIpbmV4dENvb3JkMy5nZXQobmV4dEluZGV4MysxKSkuaW50VmFsdWUoKTsKLQkKLQlpc0RvbmUgPSBpc0RvbmUyID0gaXNEb25lMyA9IGZhbHNlOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1pc2MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWF6ZSIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWF6ZURlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIGludCBnZXRJbml0aWFsQW5pbWF0aW9uVGltZSgpIHsKLQlyZXR1cm4gNTA7Ci19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JaWYgKGltYWdlICE9IG51bGwpIHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZSA9IG51bGw7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCXN1cGVyLmNyZWF0ZUNvbnRyb2xQYW5lbChwYXJlbnQpOwotCQotCS8vIGFkZCBzZWxlY3Rpb24gbGlzdGVuZXIgdG8gcmVzZXQgbmV4dE51bWJlciBhZnRlciAKLQkvLyB0aGUgc2VxdWVuY2UgaGFzIGNvbXBsZXRlZAotCXBsYXlJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChpc0RvbmUpewotCQkJCW5leHRJbmRleCA9IG5leHRJbmRleDIgPSBuZXh0SW5kZXgzID0gMDsKLQkJCQlpc0RvbmUgPSBpc0RvbmUyID0gaXNEb25lMyA9IGZhbHNlOyAKLQkJCX0KLQkJfQotCX0pOwotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI25leHQoaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0KLQlpZiAobmV4dEluZGV4KzIgPCBuZXh0Q29vcmQuc2l6ZSgpKSB7Ci0JCW5leHRJbmRleCA9IChuZXh0SW5kZXgrMiklbmV4dENvb3JkLnNpemUoKTsKLQkJeGNvb3JkID0gKChJbnRlZ2VyKW5leHRDb29yZC5nZXQobmV4dEluZGV4KSkuaW50VmFsdWUoKTsKLQkJeWNvb3JkID0gKChJbnRlZ2VyKW5leHRDb29yZC5nZXQobmV4dEluZGV4KzEpKS5pbnRWYWx1ZSgpOwotCX0gZWxzZSB7Ci0JCS8vIHN0b3AgYW5pbWF0aW9uCi0JCXNldEFuaW1hdGlvbihmYWxzZSk7Ci0JCWlzRG9uZSA9IHRydWU7Ci0JfQotCQotCWlmIChuZXh0SW5kZXgyKzIgPCBuZXh0Q29vcmQyLnNpemUoKSkgewotCQluZXh0SW5kZXgyID0gKG5leHRJbmRleDIrMiklbmV4dENvb3JkMi5zaXplKCk7Ci0JCXhjb29yZDIgPSAoKEludGVnZXIpbmV4dENvb3JkMi5nZXQobmV4dEluZGV4MikpLmludFZhbHVlKCk7Ci0JCXljb29yZDIgPSAoKEludGVnZXIpbmV4dENvb3JkMi5nZXQobmV4dEluZGV4MisxKSkuaW50VmFsdWUoKTsKLQl9IGVsc2UgewotCQlpc0RvbmUyID0gdHJ1ZTsKLQl9Ci0JCi0JaWYgKG5leHRJbmRleDMrMiA8IG5leHRDb29yZDMuc2l6ZSgpKSB7Ci0JCW5leHRJbmRleDMgPSAobmV4dEluZGV4MysyKSVuZXh0Q29vcmQzLnNpemUoKTsKLQkJeGNvb3JkMyA9ICgoSW50ZWdlciluZXh0Q29vcmQzLmdldChuZXh0SW5kZXgzKSkuaW50VmFsdWUoKTsKLQkJeWNvb3JkMyA9ICgoSW50ZWdlciluZXh0Q29vcmQzLmdldChuZXh0SW5kZXgzKzEpKS5pbnRWYWx1ZSgpOwotCX0gZWxzZSB7Ci0JCWlzRG9uZTMgPSB0cnVlOwotCX0KLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQlpbWFnZSA9IGV4YW1wbGUubG9hZEltYWdlKGRldmljZSwgIm1hemUuYm1wIik7Ci0JfQotCS8vIGRyYXcgbWF6ZQotCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlpbnQgeCA9ICh3aWR0aCAtIGJvdW5kcy53aWR0aCkgLyAyOwotCWludCB5ID0gKGhlaWdodCAtIGJvdW5kcy5oZWlnaHQpIC8gMjsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHkpOwotCQotCS8vIGRyYXcgY29ycmVjdCBvdmFsCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmZpbGxPdmFsKHggKyB4Y29vcmQsIHkgKyB5Y29vcmQsIDE2LCAxNik7Ci0JZ2MuZHJhd092YWwoeCArIHhjb29yZCwgeSArIHljb29yZCwgMTUsIDE1KTsKLQkKLQkvLyBkcmF3IHdyb25nIG92YWwgMQotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JZ2MuZmlsbE92YWwoeCArIHhjb29yZDIsIHkgKyB5Y29vcmQyLCAxNiwgMTYpOwotCWdjLmRyYXdPdmFsKHggKyB4Y29vcmQyLCB5ICsgeWNvb3JkMiwgMTUsIDE1KTsKLQkKLQkvLyBkcmF3IHdyb25nIG92YWwgMgotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWdjLmZpbGxPdmFsKHggKyB4Y29vcmQzLCB5ICsgeWNvb3JkMywgMTYsIDE2KTsKLQlnYy5kcmF3T3ZhbCh4ICsgeGNvb3JkMywgeSArIHljb29yZDMsIDE1LCAxNSk7Ci0KLQlpZiAoaXNEb25lMikgewotCQlJbWFnZSBoZWxwSW1nID0gZXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCAiaGVscC5naWYiKTsKLQkJZ2MuZHJhd0ltYWdlKGhlbHBJbWcsIHggKyB4Y29vcmQyICsgMTYsIHkgKyB5Y29vcmQyIC0gMTYpOwotCQloZWxwSW1nLmRpc3Bvc2UoKTsKLQl9Ci0KLQlpZiAoaXNEb25lMykgewotCQlJbWFnZSBoZWxwSW1nID0gZXhhbXBsZS5sb2FkSW1hZ2UoZGV2aWNlLCAiaGVscC5naWYiKTsKLQkJZ2MuZHJhd0ltYWdlKGhlbHBJbWcsIHggKyB4Y29vcmQzICsgMTYsIHkgKyB5Y29vcmQzIC0gMTYpOwotCQloZWxwSW1nLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGxpc3Qgb2YgY29vcmRpbmF0ZXMgbW92aW5nIGluIGEgImxlZnQtbW92aW5nIiBmYXNoaW9uIGZyb20gdGhlIHN0YXJ0Ci0gKiBwb2ludCB0byB0aGUgZW5kIHBvaW50IGluY2x1c2l2ZWx5LgotICogCi0gKiBAcGFyYW0geDEKLSAqICAgICAgICAgICAgWCBjb21wb25lbnQgb2YgdGhlIHN0YXJ0IHBvaW50Ci0gKiBAcGFyYW0geTEKLSAqICAgICAgICAgICAgWSBjb21wb25lbnQgb2YgdGhlIHN0YXJ0IHBvaW50Ci0gKiBAcGFyYW0geDIKLSAqICAgICAgICAgICAgWCBjb21wb25lbnQgb2YgdGhlIGVuZCBwb2ludAotICogQHBhcmFtIHkyCi0gKiAgICAgICAgICAgIFkgY29tcG9uZW50IG9mIHRoZSBlbmQgcG9pbnQKLSAqIEBwYXJhbSBzdGVwc2l6ZQotICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHNlcGFyYXRlIGVhY2ggY29vcmRpbmF0ZQotICovCi1wcml2YXRlIEFycmF5TGlzdCBtb3ZlTGVmdChpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBzdGVwc2l6ZSkgewotCUFycmF5TGlzdCBjb29yZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MSkpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl3aGlsZSh4MSAtIHN0ZXBzaXplID4geDIpIHsKLQkJeDEgPSB4MSAtIHN0ZXBzaXplOwotCQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgxKSk7Ci0JCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl9Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MikpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTIpKTsKLQlyZXR1cm4gY29vcmRzOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBsaXN0IG9mIGNvb3JkaW5hdGVzIG1vdmluZyBpbiBhICJyaWdodC1tb3ZpbmciIGZhc2hpb24gZnJvbSB0aGUgc3RhcnQKLSAqIHBvaW50IHRvIHRoZSBlbmQgcG9pbnQgaW5jbHVzaXZlbHkuCi0gKiAKLSAqIEBwYXJhbSB4MQotICogICAgICAgICAgICBYIGNvbXBvbmVudCBvZiB0aGUgc3RhcnQgcG9pbnQKLSAqIEBwYXJhbSB5MQotICogICAgICAgICAgICBZIGNvbXBvbmVudCBvZiB0aGUgc3RhcnQgcG9pbnQKLSAqIEBwYXJhbSB4MgotICogICAgICAgICAgICBYIGNvbXBvbmVudCBvZiB0aGUgZW5kIHBvaW50Ci0gKiBAcGFyYW0geTIKLSAqICAgICAgICAgICAgWSBjb21wb25lbnQgb2YgdGhlIGVuZCBwb2ludAotICogQHBhcmFtIHN0ZXBzaXplCi0gKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgc2VwYXJhdGUgZWFjaCBjb29yZGluYXRlCi0gKi8KLXByaXZhdGUgQXJyYXlMaXN0IG1vdmVSaWdodChpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBzdGVwc2l6ZSkgewotCUFycmF5TGlzdCBjb29yZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MSkpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl3aGlsZSh4MSArIHN0ZXBzaXplIDwgeDIpIHsKLQkJeDEgPSB4MSArIHN0ZXBzaXplOwotCQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgxKSk7Ci0JCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTEpKTsKLQl9Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MikpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeTIpKTsKLQlyZXR1cm4gY29vcmRzOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBsaXN0IG9mIGNvb3JkaW5hdGVzIG1vdmluZyBpbiBhbiB1cHdhcmQgZmFzaGlvbiBmcm9tIHRoZSBzdGFydAotICogcG9pbnQgdG8gdGhlIGVuZCBwb2ludCBpbmNsdXNpdmVseS4KLSAqIAotICogQHBhcmFtIHgxCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHkxCi0gKiAgICAgICAgICAgIFkgY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHgyCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBlbmQgcG9pbnQKLSAqIEBwYXJhbSB5MgotICogICAgICAgICAgICBZIGNvbXBvbmVudCBvZiB0aGUgZW5kIHBvaW50Ci0gKiBAcGFyYW0gc3RlcHNpemUKLSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCBzZXBhcmF0ZSBlYWNoIGNvb3JkaW5hdGUKLSAqLwotcHJpdmF0ZSBBcnJheUxpc3QgbW92ZVVwKGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IHN0ZXBzaXplKSB7Ci0JQXJyYXlMaXN0IGNvb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgxKSk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MSkpOwotCXdoaWxlKHkxIC0gc3RlcHNpemUgPiB5MikgewotCQl5MSA9IHkxIC0gc3RlcHNpemU7Ci0JCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDEpKTsKLQkJY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MSkpOwotCX0KLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHgyKSk7Ci0JY29vcmRzLmFkZChuZXcgSW50ZWdlcih5MikpOwotCXJldHVybiBjb29yZHM7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGxpc3Qgb2YgY29vcmRpbmF0ZXMgbW92aW5nIGluIGEgZG93bndhcmQgZmFzaGlvbiBmcm9tIHRoZSBzdGFydAotICogcG9pbnQgdG8gdGhlIGVuZCBwb2ludCBpbmNsdXNpdmVseS4KLSAqIAotICogQHBhcmFtIHgxCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHkxCi0gKiAgICAgICAgICAgIFkgY29tcG9uZW50IG9mIHRoZSBzdGFydCBwb2ludAotICogQHBhcmFtIHgyCi0gKiAgICAgICAgICAgIFggY29tcG9uZW50IG9mIHRoZSBlbmQgcG9pbnQKLSAqIEBwYXJhbSB5MgotICogICAgICAgICAgICBZIGNvbXBvbmVudCBvZiB0aGUgZW5kIHBvaW50Ci0gKiBAcGFyYW0gc3RlcHNpemUKLSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCBzZXBhcmF0ZSBlYWNoIGNvb3JkaW5hdGUKLSAqLwotcHJpdmF0ZSBBcnJheUxpc3QgbW92ZURvd24oaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgc3RlcHNpemUpIHsKLQlBcnJheUxpc3QgY29vcmRzID0gbmV3IEFycmF5TGlzdCgpOwotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDEpKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHkxKSk7Ci0Jd2hpbGUoeTEgKyBzdGVwc2l6ZSA8IHkyKSB7Ci0JCXkxID0geTEgKyBzdGVwc2l6ZTsKLQkJY29vcmRzLmFkZChuZXcgSW50ZWdlcih4MSkpOwotCQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHkxKSk7Ci0JfQotCWNvb3Jkcy5hZGQobmV3IEludGVnZXIoeDIpKTsKLQljb29yZHMuYWRkKG5ldyBJbnRlZ2VyKHkyKSk7Ci0JcmV0dXJuIGNvb3JkczsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nQW5pbVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nQW5pbVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDNjNGVmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1BhdGhDbGlwcGluZ0FuaW1UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIGlzIGFub3RoZXIgdGFiIHRoYXQgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYSBwYXRoIGNsaXBwaW5nLgotICovCi1wdWJsaWMgY2xhc3MgUGF0aENsaXBwaW5nQW5pbVRhYiBleHRlbmRzIEFuaW1hdGVkR3JhcGhpY3NUYWIgewotCi0JcHJpdmF0ZSBCdXR0b24gY29sb3JCdXR0b247Ci0JcHJpdmF0ZSBHcmFwaGljc0JhY2tncm91bmQgYmFja2dyb3VuZDsKLQlwcml2YXRlIE1lbnUgbWVudTsKLQlwcml2YXRlIGludCByZWN0V2lkdGggPSAzMDA7Ci0JcHJpdmF0ZSBpbnQgcmVjdEhlaWdodCA9IDMwMDsKLQlwcml2YXRlIGludCBpbmNXaWR0aCA9IDU7Ci0JcHJpdmF0ZSBpbnQgaW5jSGVpZ2h0ID0gNTsKLQlwcml2YXRlIGJvb2xlYW4gdmVydGljYWwgPSBmYWxzZTsKLQlwcml2YXRlIGludCBhbmdsZTsKLQotCXB1YmxpYyBQYXRoQ2xpcHBpbmdBbmltVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0JCXN1cGVyKGV4YW1wbGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsaXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFuaW1QYXRoQ2xpcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbmltUGF0aENsaXBwaW5nRGVzYyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJbWVudS5kaXNwb3NlKCk7Ci0JCQltZW51ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdXNlZCB0byBjb250cm9sIHRoZSBkcmF3aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xQYW5lbChwYXJlbnQpOwotCi0JCS8vIGNvbG9yIG1lbnUKLQkJQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCQliYWNrZ3JvdW5kID0gZ2I7Ci0JCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gdGhlIDV0aCBpdGVtIGluIHRoZSBtZW51IChibHVlKQotCQliYWNrZ3JvdW5kID0gKEdyYXBoaWNzQmFja2dyb3VuZCkgbWVudS5nZXRJdGVtKDQpLmdldERhdGEoKTsKLQotCQkvLyBjb2xvciBidXR0b24KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCWNvbG9yQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xvckJ1dHRvbi5zZXRJbWFnZShiYWNrZ3JvdW5kLmdldFRodW1iTmFpbCgpKTsKLQkJY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJYW5nbGUgPSAoYW5nbGUgKyA1KSUzNjA7Ci0JCWlmICh2ZXJ0aWNhbCkgewotCQkJaWYgKHJlY3RIZWlnaHQgPD0gMCkgewotCQkJCWluY0hlaWdodCA9IC1pbmNIZWlnaHQ7Ci0JCQl9Ci0JCQlpZiAocmVjdEhlaWdodCA+PSBoZWlnaHQpIHsKLQkJCQlpbmNIZWlnaHQgPSAtaW5jSGVpZ2h0OwotCQkJCXZlcnRpY2FsID0gZmFsc2U7Ci0JCQl9Ci0JCQlyZWN0SGVpZ2h0ID0gcmVjdEhlaWdodCArIGluY0hlaWdodDsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWN0V2lkdGggPD0gMCkgewotCQkJCWluY1dpZHRoID0gLWluY1dpZHRoOwotCQkJfQotCQkJaWYgKHJlY3RXaWR0aCA+PSB3aWR0aCkgewotCQkJCWluY1dpZHRoID0gLWluY1dpZHRoOwotCQkJCXZlcnRpY2FsID0gdHJ1ZTsKLQkJCX0KLQkJCXJlY3RXaWR0aCA9IHJlY3RXaWR0aCArIGluY1dpZHRoOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQkJRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCQkKLQkJLy8gdG9wIHRyaWFuZ2xlCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGgubW92ZVRvKHdpZHRoLzIsIDApOwotCQlwYXRoLmxpbmVUbyh3aWR0aC8yKzEwMCwgMTczKTsKLQkJcGF0aC5saW5lVG8od2lkdGgvMi0xMDAsIDE3Myk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLzIsIDApOwotCQkKLQkJLy8gYm90dG9tIHRyaWFuZ2xlCi0JCVBhdGggcGF0aDIgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoMi5tb3ZlVG8od2lkdGgvMiwgaGVpZ2h0KTsKLQkJcGF0aDIubGluZVRvKHdpZHRoLzIrMTAwLCBoZWlnaHQtMTczKTsKLQkJcGF0aDIubGluZVRvKHdpZHRoLzItMTAwLCBoZWlnaHQtMTczKTsKLQkJcGF0aDIubGluZVRvKHdpZHRoLzIsIGhlaWdodCk7Ci0JCQotCQkvLyBsZWZ0IHRyaWFuZ2xlCi0JCVBhdGggcGF0aDMgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoMy5tb3ZlVG8oMCwgaGVpZ2h0LzIpOwotCQlwYXRoMy5saW5lVG8oMTczLCBoZWlnaHQvMi0xMDApOwotCQlwYXRoMy5saW5lVG8oMTczLCBoZWlnaHQvMisxMDApOwotCQlwYXRoMy5saW5lVG8oMCwgaGVpZ2h0LzIpOwotCQkKLQkJLy8gcmlnaHQgdHJpYW5nbGUKLQkJUGF0aCBwYXRoNCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGg0Lm1vdmVUbyh3aWR0aCwgaGVpZ2h0LzIpOwotCQlwYXRoNC5saW5lVG8od2lkdGgtMTczLCBoZWlnaHQvMi0xMDApOwotCQlwYXRoNC5saW5lVG8od2lkdGgtMTczLCBoZWlnaHQvMisxMDApOwotCQlwYXRoNC5saW5lVG8od2lkdGgsIGhlaWdodC8yKTsKLQkJCi0JCS8vIGNpcmNsZQotCQlQYXRoIHBhdGg1ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDUubW92ZVRvKCh3aWR0aC0yMDApLzIsIChoZWlnaHQtMjAwKS8yKTsKLQkJcGF0aDUuYWRkQXJjKCh3aWR0aC0yMDApLzIsIChoZWlnaHQtMjAwKS8yLCAyMDAsIDIwMCwgMCwgMzYwKTsKLQkJCi0JCS8vIHRvcCByZWN0YW5nbGUKLQkJUGF0aCBwYXRoNiA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGg2LmFkZFJlY3RhbmdsZSgod2lkdGgtNDApLzIsIDE3NSwgNDAsICgoaGVpZ2h0LTIwMCkvMiktMTc3KTsKLQkJCi0JCS8vIGJvdHRvbSByZWN0YW5nbGUKLQkJUGF0aCBwYXRoNyA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGg3LmFkZFJlY3RhbmdsZSgod2lkdGgtNDApLzIsICgoaGVpZ2h0LTIwMCkvMikrMjAyLCA0MCwgKGhlaWdodC0xNzUpLSgoKGhlaWdodC0yMDApLzIpKzIwMikpOwotCQkKLQkJLy8gbGVmdCByZWN0YW5nbGUKLQkJUGF0aCBwYXRoOCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGg4LmFkZFJlY3RhbmdsZSgxNzUsIChoZWlnaHQtNDApLzIsICgod2lkdGgtMjAwKS8yKS0xNzcsIDQwKTsKLQkJCi0JCS8vIHJpZ2h0IHJlY3RhbmdsZQotCQlQYXRoIHBhdGg5ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDkuYWRkUmVjdGFuZ2xlKCh3aWR0aC0yMDApLzIrMjAyLCAoaGVpZ2h0LTQwKS8yLCAod2lkdGgtMTc1KS0oKHdpZHRoLTIwMCkvMisyMDIpLCA0MCk7Ci0JCQotCQlwYXRoLmFkZFBhdGgocGF0aDIpOwotCQlwYXRoLmFkZFBhdGgocGF0aDMpOwotCQlwYXRoLmFkZFBhdGgocGF0aDQpOwotCQlwYXRoLmFkZFBhdGgocGF0aDUpOwotCQlwYXRoLmFkZFBhdGgocGF0aDYpOwotCQlwYXRoLmFkZFBhdGgocGF0aDcpOwotCQlwYXRoLmFkZFBhdGgocGF0aDgpOwotCQlwYXRoLmFkZFBhdGgocGF0aDkpOwotCQlnYy5zZXRDbGlwcGluZyhwYXRoKTsKLQotCQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCQlpZiAoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJCWdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpKTsKLQkJfSBlbHNlIGlmIChiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQkJfQotCi0JCWdjLnNldExpbmVXaWR0aCgyKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgod2lkdGgtcmVjdFdpZHRoKS8yLCAoaGVpZ2h0LXJlY3RIZWlnaHQpLzIsIHJlY3RXaWR0aCwgcmVjdEhlaWdodCk7Ci0JCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkKLQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkKLQkJCXBhdHRlcm4uZGlzcG9zZSgpOwotCQkKLQkJcGF0aDkuZGlzcG9zZSgpOwotCQlwYXRoOC5kaXNwb3NlKCk7Ci0JCXBhdGg3LmRpc3Bvc2UoKTsKLQkJcGF0aDYuZGlzcG9zZSgpOwotCQlwYXRoNS5kaXNwb3NlKCk7Ci0JCXBhdGg0LmRpc3Bvc2UoKTsKLQkJcGF0aDMuZGlzcG9zZSgpOwotCQlwYXRoMi5kaXNwb3NlKCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1BhdGhDbGlwcGluZ1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODcwMjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aENsaXBwaW5nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyB0byBhcHBseSBhIHBhdGggY2xpcHBpbmcgYW5kIHRoZSBlZmZlY3RzIG9mCi0gKiBhcHBseWluZyBvbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoQ2xpcHBpbmdUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JCi0JcHJpdmF0ZSBDb21ibyBjbGlwcGluZ0NiOwotCXByaXZhdGUgQnV0dG9uIGNvbG9yQnV0dG9uOwotCXByaXZhdGUgR3JhcGhpY3NCYWNrZ3JvdW5kIGJhY2tncm91bmQ7Ci0JcHJpdmF0ZSBNZW51IG1lbnU7Ci0KLXB1YmxpYyBQYXRoQ2xpcHBpbmdUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDbGlwcGluZyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXRoQ2xpcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdGhDbGlwcGluZ0Rlc2MiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotLyoqIAotICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRyYXdpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7CQotCQotCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGNob29zaW5nIGNsaXBwaW5nCi0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJDbGlwcGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IgPSBuZXcgQ29tYm8oY29tcCwgU1dULkRST1BfRE9XTik7Ci0JY2xpcHBpbmdDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDaXJjbGVzIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJSZWN0YW5nbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk92YWwiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIldvcmQiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0YXIiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlRyaWFuZ2xlcyIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRGVmYXVsdCIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2Iuc2VsZWN0KDApOwotCWNsaXBwaW5nQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjb2xvciBtZW51Ci0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldFBhdHRlcm5JdGVtcyhleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKTsKLQltZW51ID0gY20uY3JlYXRlTWVudShwYXJlbnQuZ2V0UGFyZW50KCksIG5ldyBDb2xvckxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihHcmFwaGljc0JhY2tncm91bmQgZ2IpIHsKLQkJCWJhY2tncm91bmQgPSBnYjsJCQotCQkJY29sb3JCdXR0b24uc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCi0JLy8gaW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byB0aGUgNXRoIGl0ZW0gaW4gdGhlIG1lbnUgKGJsdWUpCi0JYmFja2dyb3VuZCA9KEdyYXBoaWNzQmFja2dyb3VuZCltZW51LmdldEl0ZW0oNCkuZ2V0RGF0YSgpOwotCQotCS8vIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJDb2xvciIpKTsgLy8kTk9OLU5MUy0xJAotCWNvbG9yQnV0dG9uLnNldEltYWdlKGJhY2tncm91bmQuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JaW50IGNsaXBwaW5nID0gY2xpcHBpbmdDYi5nZXRTZWxlY3Rpb25JbmRleCgpOwotCXN3aXRjaCAoY2xpcHBpbmcpIHsKLQkKLQljYXNlIDA6CQkvLyBjaXJjbGVzCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGguYWRkQXJjKCh3aWR0aC13aWR0aC81KS8yLCAoaGVpZ2h0LWhlaWdodC81KS8yLCB3aWR0aC81LCBoZWlnaHQvNSwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoNSood2lkdGgtd2lkdGgvOCkvMTIsIDQqKGhlaWdodC1oZWlnaHQvOCkvMTIsIHdpZHRoLzgsIGhlaWdodC84LCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg3Kih3aWR0aC13aWR0aC84KS8xMiwgOCooaGVpZ2h0LWhlaWdodC84KS8xMiwgd2lkdGgvOCwgaGVpZ2h0LzgsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDYqKHdpZHRoLXdpZHRoLzEyKS8xMiwgMyooaGVpZ2h0LWhlaWdodC8xMikvMTIsIHdpZHRoLzEyLCBoZWlnaHQvMTIsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDYqKHdpZHRoLXdpZHRoLzEyKS8xMiwgOSooaGVpZ2h0LWhlaWdodC8xMikvMTIsIHdpZHRoLzEyLCBoZWlnaHQvMTIsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDExLjVmKih3aWR0aC13aWR0aC8xOCkvMjAsIDUqKGhlaWdodC1oZWlnaHQvMTgpLzE4LCB3aWR0aC8xOCwgaGVpZ2h0LzE4LCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg4LjVmKih3aWR0aC13aWR0aC8xOCkvMjAsIDEzKihoZWlnaHQtaGVpZ2h0LzE4KS8xOCwgd2lkdGgvMTgsIGhlaWdodC8xOCwgMCwgMzYwKTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCQlicmVhazsKLQljYXNlIDE6CQkvLyByZWN0YW5nbGUKLQkJcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JCXBhdGguYWRkUmVjdGFuZ2xlKDEwMCwgMTAwLCB3aWR0aC0yMDAsIGhlaWdodC0yMDApOwotCQlwYXRoLmFkZFJlY3RhbmdsZSgxMjAsIDEyMCwgd2lkdGgtMjQwLCBoZWlnaHQtMjQwKTsKLQkJcGF0aC5hZGRSZWN0YW5nbGUoMTQwLCAxNDAsIHdpZHRoLTI4MCwgaGVpZ2h0LTI4MCk7Ci0JCWdjLnNldENsaXBwaW5nKHBhdGgpOwotCQlwYXRoLmRpc3Bvc2UoKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgkJLy8gY2lyY2xlCi0JCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoLmFkZEFyYygxMDAsIDEwMCwgd2lkdGgtMjAwLCBoZWlnaHQtMjAwLCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYygod2lkdGgtd2lkdGgvNSkvMiwgKGhlaWdodC1oZWlnaHQvNSkvMiwgd2lkdGgvNSwgaGVpZ2h0LzUsIDAsIDM2MCk7Ci0JCXBhdGguYWRkQXJjKDUqKHdpZHRoLXdpZHRoLzgpLzEyLCA0KihoZWlnaHQtaGVpZ2h0LzgpLzEyLCB3aWR0aC84LCBoZWlnaHQvOCwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoNyood2lkdGgtd2lkdGgvOCkvMTIsIDgqKGhlaWdodC1oZWlnaHQvOCkvMTIsIHdpZHRoLzgsIGhlaWdodC84LCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg2Kih3aWR0aC13aWR0aC8xMikvMTIsIDMqKGhlaWdodC1oZWlnaHQvMTIpLzEyLCB3aWR0aC8xMiwgaGVpZ2h0LzEyLCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYyg2Kih3aWR0aC13aWR0aC8xMikvMTIsIDkqKGhlaWdodC1oZWlnaHQvMTIpLzEyLCB3aWR0aC8xMiwgaGVpZ2h0LzEyLCAwLCAzNjApOwotCQlwYXRoLmFkZEFyYygxMS41Ziood2lkdGgtd2lkdGgvMTgpLzIwLCA1KihoZWlnaHQtaGVpZ2h0LzE4KS8xOCwgd2lkdGgvMTgsIGhlaWdodC8xOCwgMCwgMzYwKTsKLQkJcGF0aC5hZGRBcmMoOC41Ziood2lkdGgtd2lkdGgvMTgpLzIwLCAxMyooaGVpZ2h0LWhlaWdodC8xOCkvMTgsIHdpZHRoLzE4LCBoZWlnaHQvMTgsIDAsIDM2MCk7Ci0JCWdjLnNldENsaXBwaW5nKHBhdGgpOwotCQlwYXRoLmRpc3Bvc2UoKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgkJLy8gd29yZAotCQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJU3RyaW5nIHRleHQgPSBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNXVCIpOyAvLyROT04tTkxTLTEkCi0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgIlRpbWVzIiwgMjAwLCBTV1QuTk9STUFMKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJUG9pbnQgc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQkJcGF0aC5hZGRTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgKGhlaWdodC1zaXplLnkpLzIsIGZvbnQpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCQlicmVhazsKLQljYXNlIDQ6CQkvLyBzdGFyCi0JCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoLmxpbmVUbyh3aWR0aC8yLCAwKTsKLQkJcGF0aC5saW5lVG8oNSp3aWR0aC84LCBoZWlnaHQvMyk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLCBoZWlnaHQvMyk7Ci0JCXBhdGgubGluZVRvKDMqd2lkdGgvNCwgMTAqaGVpZ2h0LzE2KTsKLQkJcGF0aC5saW5lVG8oNyp3aWR0aC84LCBoZWlnaHQpOwotCQlwYXRoLmxpbmVUbyh3aWR0aC8yLCAzKmhlaWdodC80KTsKLQkJcGF0aC5saW5lVG8od2lkdGgvOCwgaGVpZ2h0KTsKLQkJcGF0aC5saW5lVG8od2lkdGgvNCwgMTAqaGVpZ2h0LzE2KTsKLQkJcGF0aC5saW5lVG8oMCwgaGVpZ2h0LzMpOwotCQlwYXRoLmxpbmVUbygzKndpZHRoLzgsIGhlaWdodC8zKTsKLQkJcGF0aC5saW5lVG8od2lkdGgvMiwgMCk7Ci0JCQotCQlQYXRoIG92YWxQYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJb3ZhbFBhdGguYWRkQXJjKDkwLCA5MCwgd2lkdGgtMTgwLCBoZWlnaHQtMTgwLCAwLCAzNjApOwotCQkKLQkJcGF0aC5hZGRQYXRoKG92YWxQYXRoKTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCW92YWxQYXRoLmRpc3Bvc2UoKTsKLQkJcGF0aC5kaXNwb3NlKCk7Ci0JCWJyZWFrOwotCWNhc2UgNToJCS8vIHRyaWFuZ2xlcwotCQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aC5hZGRSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCXBhdGgubGluZVRvKHdpZHRoLzQsIDApOwotCQlwYXRoLmxpbmVUbyh3aWR0aC80LCBoZWlnaHQvMik7Ci0JCXBhdGgubGluZVRvKDAsIGhlaWdodC8yKTsKLQkJcGF0aC5saW5lVG8od2lkdGgvNCwgMCk7Ci0JCQotCQlQYXRoIHBhdGgyID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDIubGluZVRvKHdpZHRoLzIsIDApOwotCQlwYXRoMi5saW5lVG8od2lkdGgvNCwgaGVpZ2h0LzIpOwotCQlwYXRoMi5saW5lVG8oMyp3aWR0aC80LCBoZWlnaHQvMik7Ci0JCXBhdGgyLmxpbmVUbyh3aWR0aC8yLCAwKTsKLQkJCi0JCVBhdGggcGF0aDMgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoMy5saW5lVG8oMyp3aWR0aC80LCAwKTsKLQkJcGF0aDMubGluZVRvKDMqd2lkdGgvNCwgaGVpZ2h0LzIpOwotCQlwYXRoMy5saW5lVG8od2lkdGgsIGhlaWdodC8yKTsKLQkJcGF0aDMubGluZVRvKDMqd2lkdGgvNCwgMCk7Ci0JCQotCQlQYXRoIHBhdGg0ID0gbmV3IFBhdGgoZGV2aWNlKTsKLQkJcGF0aDQubGluZVRvKDAsIGhlaWdodCk7Ci0JCXBhdGg0LmxpbmVUbyh3aWR0aC80LCBoZWlnaHQvMik7Ci0JCXBhdGg0LmxpbmVUbyh3aWR0aC8yLCBoZWlnaHQpOwotCQlwYXRoNC5saW5lVG8oMCwgaGVpZ2h0KTsKLQkJCi0JCVBhdGggcGF0aDUgPSBuZXcgUGF0aChkZXZpY2UpOwotCQlwYXRoNS5saW5lVG8od2lkdGgvMiwgaGVpZ2h0KTsKLQkJcGF0aDUubGluZVRvKDMqd2lkdGgvNCwgaGVpZ2h0LzIpOwotCQlwYXRoNS5saW5lVG8od2lkdGgsIGhlaWdodCk7Ci0JCXBhdGg1LmxpbmVUbyh3aWR0aC8yLCBoZWlnaHQpOwotCQkKLQkJcGF0aC5hZGRQYXRoKHBhdGgyKTsKLQkJcGF0aC5hZGRQYXRoKHBhdGgzKTsKLQkJcGF0aC5hZGRQYXRoKHBhdGg0KTsKLQkJcGF0aC5hZGRQYXRoKHBhdGg1KTsKLQkJZ2Muc2V0Q2xpcHBpbmcocGF0aCk7Ci0JCQotCQlwYXRoNS5kaXNwb3NlKCk7Ci0JCXBhdGg0LmRpc3Bvc2UoKTsKLQkJcGF0aDMuZGlzcG9zZSgpOwotCQlwYXRoMi5kaXNwb3NlKCk7Ci0JCXBhdGguZGlzcG9zZSgpOwotCQlicmVhazsKLQljYXNlIDY6CQkvLyBkZWZhdWx0Ci0JCWdjLnNldENsaXBwaW5nKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlicmVhazsKLQl9Ci0JCi0JUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKLQlpZiAoYmFja2dyb3VuZC5nZXRCZ0NvbG9yMSgpICE9IG51bGwpIHsKLQkJZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kLmdldEJnQ29sb3IxKCkpOwotCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5nZXRCZ0ltYWdlKCkgIT0gbnVsbCkgewotCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBiYWNrZ3JvdW5kLmdldEJnSW1hZ2UoKSk7Ci0JCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCX0KLSAgICBnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUGF0aFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWFhYWVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1BhdGhUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBwYXRocy4gSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlZSB0aGUKLSAqIGRpZmZlcmVuY2VzIGJldHdlZW4gZmlsbGluZywgZHJhd2luZyBhbmQgY2xvc2luZyBwYXRocy4KLSAqLwotcHVibGljIGNsYXNzIFBhdGhUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0KLQlCdXR0b24gY29sb3JCdXR0b24sIGZpbGxCdXR0b24sIGRyYXdCdXR0b24sIGNsb3NlQnV0dG9uOwotCUdyYXBoaWNzQmFja2dyb3VuZCBmaWxsQ29sb3I7Ci0JTWVudSBtZW51OwotCi1wdWJsaWMgUGF0aFRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdGgiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUGF0aE9wZXIiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlBhdGhPcGVyRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51ICE9IG51bGwpIHsKLQkJbWVudS5kaXNwb3NlKCk7Ci0JCW1lbnUgPSBudWxsOwotCX0KLX0KLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkKLQlDb21wb3NpdGUgY29tcDsKLQotCS8vIGNyZWF0ZSBkcmF3IGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCWRyYXdCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5UT0dHTEUpOwotCWRyYXdCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkRyYXdQYXRoIikpOyAvLyROT04tTkxTLTEkCi0JZHJhd0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCWRyYXdCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQotCS8vIGNyZWF0ZSBmaWxsIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCWZpbGxCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5UT0dHTEUpOwotCWZpbGxCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGxQYXRoIikpOyAvLyROT04tTkxTLTEkCi0JZmlsbEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGNyZWF0ZSBjbG9zZSBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkKLQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlRPR0dMRSk7Ci0JY2xvc2VCdXR0b24uc2V0VGV4dChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsb3NlUGF0aCIpKTsgLy8kTk9OLU5MUy0xJAotCWNsb3NlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCQotCS8vIGNyZWF0ZSBjb2xvciBidXR0b24KLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JY20uc2V0UGF0dGVybkl0ZW1zKGV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpOwotCW1lbnUgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJZmlsbENvbG9yID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGluaXRpYWxpemUgdGhlIGZvcmVncm91bmQgdG8gdGhlIDV0aCBpdGVtIGluIHRoZSBtZW51IChncmVlbikKLQlmaWxsQ29sb3IgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSgzKS5nZXREYXRhKCk7Ci0JCi0JLy8gY29sb3IgYnV0dG9uCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRmlsbENvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UoZmlsbENvbG9yLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHBvaW50LngsIHBvaW50LnkgKyBib3VuZHMuaGVpZ2h0KTsKLQkJCW1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKCFleGFtcGxlLmNoZWNrQWR2YW5jZWRHcmFwaGljcygpKSByZXR1cm47Ci0JRGV2aWNlIGRldmljZSA9IGdjLmdldERldmljZSgpOwotCi0JUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKLQlpZiAoZmlsbENvbG9yLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRCYWNrZ3JvdW5kKGZpbGxDb2xvci5nZXRCZ0NvbG9yMSgpKTsKLQl9IGVsc2UgaWYgKGZpbGxDb2xvci5nZXRCZ0ltYWdlKCkgIT0gbnVsbCkgewotCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCBmaWxsQ29sb3IuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotCi0JZ2Muc2V0TGluZVdpZHRoKDUpOwotCWdjLnNldEZvcmVncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQotCS8vIGFyYwotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRBcmMoKHdpZHRoLTI1MCkvMiwgKGhlaWdodC00MDApLzIsIDUwMCwgNDAwLCA5MCwgMTgwKTsKLQlpZiAoY2xvc2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHBhdGguY2xvc2UoKTsKLQlpZiAoZmlsbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgZ2MuZmlsbFBhdGgocGF0aCk7Ci0JaWYgKGRyYXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCS8vIHNoYXBlIG9uIGxlZnQKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUoKHdpZHRoLTI1MCkvNCwgaGVpZ2h0LzItMTUwKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguY3ViaWNUbygtMTUwLCAxMDAsIDE1MCwgMjAwLCAwLCAzMDApOwotCWlmIChjbG9zZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcGF0aC5jbG9zZSgpOwotCWlmIChmaWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSBnYy5maWxsUGF0aChwYXRoKTsKLQlpZiAoZHJhd0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci0JZ2Muc2V0VHJhbnNmb3JtKG51bGwpOwotCQotCS8vIHNoYXBlIG9uIHJpZ2h0Ci0JcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5tb3ZlVG8oMyood2lkdGgtMjUwKS80IC0gMjUgKyAyNTAsIGhlaWdodC8yKTsKLQlwYXRoLmxpbmVUbygzKih3aWR0aC0yNTApLzQgKyA1MCArIDI1MCwgaGVpZ2h0LzIgLSAyMDApOwotCXBhdGgubGluZVRvKDMqKHdpZHRoLTI1MCkvNCArIDUwICsgMjUwLCBoZWlnaHQvMiArIDUwKTsKLQlwYXRoLmxpbmVUbygzKih3aWR0aC0yNTApLzQgLSAyNSArIDI1MCwgaGVpZ2h0LzIgKyAxNTApOwotCXBhdGgubGluZVRvKDMqKHdpZHRoLTI1MCkvNCArIDI1ICsgMjUwLCBoZWlnaHQvMiArIDUwKTsKLQlpZiAoY2xvc2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHBhdGguY2xvc2UoKTsKLQlpZiAoZmlsbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgZ2MuZmlsbFBhdGgocGF0aCk7Ci0JaWYgKGRyYXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIGdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCi0JaWYgKHBhdHRlcm4gIT0gbnVsbCkgcGF0dGVybi5kaXNwb3NlKCk7Ci19Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvUkdCVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9SR0JUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwYjNlMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9SR0JUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBNaXNjZWxsYW5lb3VzIHRhYiB0aGF0IGRlbW9uc3RyYXRlcyBlbWVyZ2luZyBjb2xvcnMgZnJvbSBsYXllcmluZyBvdGhlcgotICogY29sb3JzLgotICovCi1wdWJsaWMgY2xhc3MgUkdCVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JaW50IHRyYW5zbGF0ZVgsIHRyYW5zbGF0ZVk7Ci0JZmxvYXQgZGlhZ1RyYW5zbGF0ZVgxLCBkaWFnVHJhbnNsYXRlWDIsIGRpYWdUcmFuc2xhdGVZMSwgZGlhZ1RyYW5zbGF0ZVkyOwotCi0vKioKLSAqIENvbnN0cnVjdG9yCi0gKiBAcGFyYW0gZXhhbXBsZSBBIEdyYXBoaWNzRXhhbXBsZQotICovCi1wdWJsaWMgUkdCVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci0JdHJhbnNsYXRlWCA9IHRyYW5zbGF0ZVkgPSAwOwotCWRpYWdUcmFuc2xhdGVYMSA9IGRpYWdUcmFuc2xhdGVYMiA9IGRpYWdUcmFuc2xhdGVZMSA9IGRpYWdUcmFuc2xhdGVZMiA9IDA7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWlzYyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJyZ2IiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInJnYkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuQW5pbWF0ZWRHcmFwaGljc1RhYiNuZXh0KGludCwgaW50KQotICovCi1wdWJsaWMgdm9pZCBuZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQotCWZsb2F0IGggPSBoZWlnaHQ7Ci0JZmxvYXQgdyA9IHdpZHRoOwotCQotCXRyYW5zbGF0ZVggPSAodHJhbnNsYXRlWCszKSV3aWR0aDsKLQl0cmFuc2xhdGVZID0gKHRyYW5zbGF0ZVkrNSklaGVpZ2h0OwotCi0JZGlhZ1RyYW5zbGF0ZVgxID0gKGRpYWdUcmFuc2xhdGVYMSs2KSV3aWR0aDsKLQlkaWFnVHJhbnNsYXRlWTEgPSBkaWFnVHJhbnNsYXRlWDEqKGgvdyk7Ci0JCi0JZGlhZ1RyYW5zbGF0ZVgyID0gKGRpYWdUcmFuc2xhdGVYMis4KSV3aWR0aDsKLQlkaWFnVHJhbnNsYXRlWTIgPSAtZGlhZ1RyYW5zbGF0ZVgyKihoL3cpICsgaDsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3MuR3JhcGhpY3NUYWIjcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLCBpbnQsIGludCkKLSAqLwotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQkKLQkvLyBob3Jpem9udGFsIHJlY3RhbmdsZQotCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgwLCB0cmFuc2xhdGVZKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCVBhdGggcGF0aCA9IG5ldyBQYXRoKGRldmljZSk7Ci0JcGF0aC5hZGRSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIDUwKTsKLQlQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIDAsIDAsIHdpZHRoLCA1MCwgCi0JCQkJZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSwgMHg3ZiwKLQkJCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCksIDB4N2YpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCWdjLmZpbGxQYXRoKHBhdGgpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCi0JLy8gdmVydGljYWwgcmVjdGFuZ2xlCi0JdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShkZXZpY2UpOwotCXRyYW5zZm9ybS50cmFuc2xhdGUodHJhbnNsYXRlWCwgMCk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZFJlY3RhbmdsZSgwLCAwLCA1MCwgaGVpZ2h0KTsKLQlwYXR0ZXJuLmRpc3Bvc2UoKTsKLQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGV2aWNlLCAwLCAwLCA1MCwgaGVpZ2h0LCAKLQkJCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfQ1lBTiksIDB4N2YsCi0JCQkJZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSksIDB4N2YpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCWdjLmZpbGxQYXRoKHBhdGgpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCi0JLy8gZGlhZ29uYWwgcmVjdGFuZ2xlIGZyb20gYm90dG9tIHJpZ2h0IGNvcm5lcgotCVJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCA1MCwgaGVpZ2h0KTsKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh3aWR0aC1kaWFnVHJhbnNsYXRlWDEsIChoZWlnaHQvMiktZGlhZ1RyYW5zbGF0ZVkxKTsKLQkKLQkvLyByb3RhdGUgb24gY2VudGVyIG9mIHJlY3RhbmdsZQotCXRyYW5zZm9ybS50cmFuc2xhdGUocmVjdC53aWR0aC8yLCByZWN0LmhlaWdodC8yKTsKLQl0cmFuc2Zvcm0ucm90YXRlKDQ1KTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKC1yZWN0LndpZHRoLzIsIC1yZWN0LmhlaWdodC8yKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCXBhdGggPSBuZXcgUGF0aChkZXZpY2UpOwotCXBhdGguYWRkUmVjdGFuZ2xlKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JcGF0dGVybi5kaXNwb3NlKCk7Ci0JcGF0dGVybiA9IG5ldyBQYXR0ZXJuKGRldmljZSwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAKLQkJCWRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkVFTiksIDB4N2YsCi0JCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfTUFHRU5UQSksIDB4N2YpOwotCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuKHBhdHRlcm4pOwotCWdjLmZpbGxQYXRoKHBhdGgpOwotCWdjLmRyYXdQYXRoKHBhdGgpOwotCXBhdGguZGlzcG9zZSgpOwotCQotCS8vIGRpYWdvbmFsIHJlY3RhbmdsZSBmcm9tIHRvcCByaWdodCBjb3JuZXIKLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh3aWR0aC1kaWFnVHJhbnNsYXRlWDIsIChoZWlnaHQvMiktZGlhZ1RyYW5zbGF0ZVkyKTsKLQkKLQkvLyByb3RhdGUgb24gY2VudGVyIG9mIHJlY3RhbmdsZQotCXRyYW5zZm9ybS50cmFuc2xhdGUocmVjdC53aWR0aC8yLCByZWN0LmhlaWdodC8yKTsKLQl0cmFuc2Zvcm0ucm90YXRlKC00NSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSgtcmVjdC53aWR0aC8yLCAtcmVjdC5oZWlnaHQvMik7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQlwYXRoID0gbmV3IFBhdGgoZGV2aWNlKTsKLQlwYXRoLmFkZFJlY3RhbmdsZShyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCXBhdHRlcm4uZGlzcG9zZSgpOwotCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgCi0JCQlkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfUkVEKSwgMHg3ZiwKLQkJCWRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSwgMHg3Zik7Ci0JZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JZ2MuZmlsbFBhdGgocGF0aCk7Ci0JZ2MuZHJhd1BhdGgocGF0aCk7Ci0JcGF0dGVybi5kaXNwb3NlKCk7Ci0JcGF0aC5kaXNwb3NlKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1JlZ2lvbkNsaXBwaW5nVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9SZWdpb25DbGlwcGluZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjUzNmYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1JlZ2lvbkNsaXBwaW5nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhpcyB0YWIgZGVtb25zdHJhdGVzIGhvdyB0byBhcHBseSBhIHJlZ2lvbiBjbGlwcGluZyBhbmQgdGhlIGVmZmVjdHMgb2YKLSAqIGFwcGx5aW5nIG9uZS4KLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbkNsaXBwaW5nVGFiIGV4dGVuZHMgR3JhcGhpY3NUYWIgewotCQotCXByaXZhdGUgQ29tYm8gY2xpcHBpbmdDYjsKLQlwcml2YXRlIEJ1dHRvbiBjb2xvckJ1dHRvbjEsIGNvbG9yQnV0dG9uMjsKLQlwcml2YXRlIE1lbnUgbWVudTEsIG1lbnUyOwotCXByaXZhdGUgR3JhcGhpY3NCYWNrZ3JvdW5kIGNvbG9yR0IxLCBjb2xvckdCMjsKLQotcHVibGljIFJlZ2lvbkNsaXBwaW5nVGFiKEdyYXBoaWNzRXhhbXBsZSBleGFtcGxlKSB7Ci0Jc3VwZXIoZXhhbXBsZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ2xpcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUmVnaW9uQ2xpcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZ2lvbkNsaXBwaW5nRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCWlmIChtZW51MSAhPSBudWxsKSB7Ci0JCW1lbnUxLmRpc3Bvc2UoKTsKLQkJbWVudTEgPSBudWxsOwotCX0KLQlpZiAobWVudTIgIT0gbnVsbCkgewotCQltZW51Mi5kaXNwb3NlKCk7Ci0JCW1lbnUyID0gbnVsbDsKLQl9Ci19Ci0KLS8qKiAKLSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdXNlZCB0byBjb250cm9sIHRoZSBkcmF3aW5nLgotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCS8vIGNyZWF0ZSBkcm9wIGRvd24gY29tYm8gZm9yIGNob29zaW5nIGNsaXBwaW5nCi0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsaXBwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYiA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOKTsKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZ2lvbjEiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlZ2lvbjIiKSk7IC8vJE5PTi1OTFMtMSQKLQljbGlwcGluZ0NiLmFkZChHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFkZCIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2IuYWRkKEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3ViIikpOyAvLyROT04tTkxTLTEkCi0JY2xpcHBpbmdDYi5hZGQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJJbnRlciIpKTsgLy8kTk9OLU5MUy0xJAotCWNsaXBwaW5nQ2Iuc2VsZWN0KDApOwotCWNsaXBwaW5nQ2IuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGNvbG9yIG1lbnUKLQlDb2xvck1lbnUgY20gPSBuZXcgQ29sb3JNZW51KCk7Ci0JbWVudTEgPSBjbS5jcmVhdGVNZW51KHBhcmVudC5nZXRQYXJlbnQoKSwgbmV3IENvbG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKEdyYXBoaWNzQmFja2dyb3VuZCBnYikgewotCQkJY29sb3JHQjEgPSBnYjsJCQotCQkJY29sb3JCdXR0b24xLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQltZW51MiA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQljb2xvckdCMiA9IGdiOwkJCi0JCQljb2xvckJ1dHRvbjIuc2V0SW1hZ2UoZ2IuZ2V0VGh1bWJOYWlsKCkpOwotCQkJZXhhbXBsZS5yZWRyYXcoKTsKLQkJfQotCX0pOwotCQotCS8vIGluaXRpYWxpemUgdGhlIGNvbG9yIHRvIGJsdWUKLQljb2xvckdCMSA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudTEuZ2V0SXRlbSg0KS5nZXREYXRhKCk7Ci0JLy8gaW5pdGlhbGl6ZSB0aGUgY29sb3IgdG8gcmVkCi0JY29sb3JHQjIgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUyLmdldEl0ZW0oMikuZ2V0RGF0YSgpOwotCQotCS8vIGNvbG9yIGJ1dHRvbiAxCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkKLQljb2xvckJ1dHRvbjEgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbjEuc2V0VGV4dChHcmFwaGljc0V4YW1wbGUKLQkJCS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IxIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24xLnNldEltYWdlKGNvbG9yR0IxLmdldFRodW1iTmFpbCgpKTsKLQljb2xvckJ1dHRvbjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudTEuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudTEuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0pOwotCi0JLy8gY29sb3IgYnV0dG9uIDIKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCWNvbG9yQnV0dG9uMiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uMi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJDb2xvcjIiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbjIuc2V0SW1hZ2UoY29sb3JHQjIuZ2V0VGh1bWJOYWlsKCkpOwotCWNvbG9yQnV0dG9uMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7IAotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBidXR0b24uZ2V0UGFyZW50KCk7IAotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQkJCVBvaW50IHBvaW50ID0gcGFyZW50LnRvRGlzcGxheShuZXcgUG9pbnQoYm91bmRzLngsIGJvdW5kcy55KSk7Ci0JCQltZW51Mi5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51Mi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JLy8gYXJyYXkgb2YgY29vcmRpbmF0ZSBwb2ludHMgb2YgcG9seWdvbiAxIChyZWdpb24gMSkKLQlpbnQgW10gcG9seWdvbjEgPSBuZXcgaW50IFtdIHsxMCwgaGVpZ2h0LzIsIDkqd2lkdGgvMTYsIDEwLCA5KndpZHRoLzE2LCBoZWlnaHQtMTB9OwotCVJlZ2lvbiByZWdpb24xID0gbmV3IFJlZ2lvbihkZXZpY2UpOwotCXJlZ2lvbjEuYWRkKHBvbHlnb24xKTsKLQotCS8vIGFycmF5IG9mIGNvb3JkaW5hdGUgcG9pbnRzIG9mIHBvbHlnb24gMiAocmVnaW9uIDIpCi0JaW50IFtdIHBvbHlnb24yID0gbmV3IGludCBbXSB7Ci0JCQk5KndpZHRoLzE2LCAxMCwKLQkJCTkqd2lkdGgvMTYsIGhlaWdodC84LAotCQkJNyp3aWR0aC8xNiwgMipoZWlnaHQvOCwKLQkJCTkqd2lkdGgvMTYsIDMqaGVpZ2h0LzgsCi0JCQk3KndpZHRoLzE2LCA0KmhlaWdodC84LAotCQkJOSp3aWR0aC8xNiwgNSpoZWlnaHQvOCwKLQkJCTcqd2lkdGgvMTYsIDYqaGVpZ2h0LzgsCi0JCQk5KndpZHRoLzE2LCA3KmhlaWdodC84LAotCQkJOSp3aWR0aC8xNiwgaGVpZ2h0LTEwLAotCQkJd2lkdGgtMTAsIGhlaWdodC8yCi0JfTsKLQlSZWdpb24gcmVnaW9uMiA9IG5ldyBSZWdpb24oZGV2aWNlKTsKLQlyZWdpb24yLmFkZChwb2x5Z29uMik7Ci0JCi0JZ2Muc2V0QWxwaGEoMTI3KTsKLQkKLQlpbnQgY2xpcHBpbmdJbmRleCA9IGNsaXBwaW5nQ2IuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkKLQlzd2l0Y2ggKGNsaXBwaW5nSW5kZXgpIHsKLQljYXNlIDA6Ci0JCS8vIHJlZ2lvbiAxCi0JCWdjLnNldENsaXBwaW5nKHJlZ2lvbjEpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yR0IxLmdldEJnQ29sb3IxKCkpOwotCQlnYy5maWxsUG9seWdvbihwb2x5Z29uMSk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJLy8gcmVnaW9uIDIKLQkJZ2Muc2V0Q2xpcHBpbmcocmVnaW9uMik7Ci0JCWdjLnNldEJhY2tncm91bmQoY29sb3JHQjIuZ2V0QmdDb2xvcjEoKSk7Ci0JCWdjLmZpbGxQb2x5Z29uKHBvbHlnb24yKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvLyBhZGQJCQotCQlyZWdpb24xLmFkZChyZWdpb24yKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQkvLyBzdWIKLQkJcmVnaW9uMS5zdWJ0cmFjdChyZWdpb24yKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQkvLyBpbnRlcnNlY3QKLQkJcmVnaW9uMS5pbnRlcnNlY3QocmVnaW9uMik7Ci0JCWJyZWFrOwkJCi0JfQotCQotCWlmIChjbGlwcGluZ0luZGV4ID4gMSkgewotCQlnYy5zZXRDbGlwcGluZyhyZWdpb24xKTsKLQkJCi0JCWdjLnNldEJhY2tncm91bmQoY29sb3JHQjEuZ2V0QmdDb2xvcjEoKSk7Ci0JCWdjLmZpbGxQb2x5Z29uKHBvbHlnb24xKTsKLQkJCi0JCWdjLnNldEJhY2tncm91bmQoY29sb3JHQjIuZ2V0QmdDb2xvcjEoKSk7Ci0JICAgIGdjLmZpbGxQb2x5Z29uKHBvbHlnb24yKTsKLQl9Ci0JCi0JcmVnaW9uMS5kaXNwb3NlKCk7Ci0JcmVnaW9uMi5kaXNwb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU2hhcGVzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TaGFwZXNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlYmNkYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TaGFwZXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkcmF3cyAzRCBzaGFwZXMgKGluIDJEKSB1c2luZyB2YXJpb3VzIGxpbmUgc3R5bGVzLgotICovCi1wdWJsaWMgY2xhc3MgU2hhcGVzVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JaW50IHVwRG93blZhbHVlOwotCWludCBpbmMgPSAxOwotCQotcHVibGljIFNoYXBlc1RhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCXVwRG93blZhbHVlID0gMDsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJMaW5lcyIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTaGFwZXMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNoYXBlc0Rlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgbmV4dChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQl1cERvd25WYWx1ZSArPSBpbmM7Ci0KLQlpZiAodXBEb3duVmFsdWUgPiA1KSBpbmMgPSAtMTsKLQlpZiAodXBEb3duVmFsdWUgPCAtNSkgaW5jID0gMTsKLX0KLQotcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCWlmICghZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSkgcmV0dXJuOwotCURldmljZSBkZXZpY2UgPSBnYy5nZXREZXZpY2UoKTsKLQotCWludCBzaXplID0gMTAwOwotCQotCWdjLnNldExpbmVXaWR0aCgyKTsKLQkKLQkvLyAtLS0tLSBjdWJlIC0tLS0tCi0JCi0JVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLzQgLSBzaXplLCBoZWlnaHQvNCArIC11cERvd25WYWx1ZSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCi0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RPVCk7Ci0KLQkvLyBmaWxsIGluIGxlZnQgZmFjZQotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHswLCAwLCBzaXplLzMsIC1zaXplLzIsIHNpemUvMywgc2l6ZS8yLCAwLCBzaXplfSk7Ci0JCi0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkKLQkvLyBzcXVhcmUKLQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIHNpemUsIHNpemUpOwotCQotCS8vIG5leHQgMyBzb2xpZCBsaW5lcwotCWdjLmRyYXdMaW5lKDAsIDAsIHNpemUvMywgLXNpemUvMik7CQkJLy8gbGVmdAotCWdjLmRyYXdMaW5lKHNpemUsIDAsIDQqc2l6ZS8zLCAtc2l6ZS8yKTsJLy8gbWlkZGxlCi0JZ2MuZHJhd0xpbmUoc2l6ZSwgc2l6ZSwgNCpzaXplLzMsIHNpemUvMik7CS8vIHJpZ2h0Ci0JCi0JLy8gMiBmdXJ0aGVzdCBzb2xpZCBsaW5lcwotCWdjLmRyYXdMaW5lKHNpemUvMywgLXNpemUvMiwgNCpzaXplLzMsIC1zaXplLzIpOyAgCS8vIGhvcml6b250YWwKLQlnYy5kcmF3TGluZSg0KnNpemUvMywgc2l6ZS8yLCA0KnNpemUvMywgLXNpemUvMik7CS8vIHZlcnRpY2FsCi0JCi0JLy8gMyBkb3R0ZWQgbGluZXMKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfRE9UKTsKLQlnYy5kcmF3TGluZSgwLCBzaXplLCBzaXplLzMsIHNpemUvMik7Ci0JZ2MuZHJhd0xpbmUoc2l6ZS8zLCAtc2l6ZS8yLCBzaXplLzMsIHNpemUvMik7Ci0JZ2MuZHJhd0xpbmUoNCpzaXplLzMsIHNpemUvMiwgc2l6ZS8zLCBzaXplLzIpOwotCQotCS8vIGZpbGwgcmlnaHQgc2lkZSBvZiBjdWJlCi0JZ2Muc2V0QmFja2dyb3VuZChkZXZpY2UuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpKTsKLQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHtzaXplLCAwLCA0KnNpemUvMywgLXNpemUvMiwgNCpzaXplLzMsIHNpemUvMiwgc2l6ZSwgc2l6ZX0pOwotCQotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCi0JLy8gLS0tLS0gcHlyYW1pZCAtLS0tLQotCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLzIgKyBzaXplLzIsIGhlaWdodC80ICsgc2l6ZSArIHVwRG93blZhbHVlKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQkvLyBmaWxsIGJhY2sgb2YgcHlyYW1pZAotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnQgW10ge3NpemUvMywgLXNpemUvMiwgNipzaXplLzEwLCAtNSpzaXplLzQsIDQqc2l6ZS8zLCAtc2l6ZS8yfSk7Ci0JCi0JLy8gZmlsbCBsZWZ0IHNpZGUgb2YgcHlyYW1pZAotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWdjLmZpbGxQb2x5Z29uKG5ldyBpbnQgW10gezAsIDAsIDYqc2l6ZS8xMCwgLTUqc2l6ZS80LCBzaXplLzMsIC1zaXplLzJ9KTsKLQkKLQkvLyBzZWxlY3Qgc29saWQgbGluZSBzdHlsZQotCWdjLnNldExpbmVTdHlsZShTV1QuTElORV9TT0xJRCk7Ci0JCi0JLy8gMiBzb2xpZCBsaW5lcyBvZiBiYXNlCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZSwgMCk7Ci0JZ2MuZHJhd0xpbmUoc2l6ZSwgMCwgNCpzaXplLzMsIC1zaXplLzIpOwotCQotCS8vIDMgc29saWQgbGluZXMgb2YgcHlyYW1pZAotCWdjLmRyYXdMaW5lKDAsIDAsIDYqc2l6ZS8xMCwgLTUqc2l6ZS80KTsKLQlnYy5kcmF3TGluZShzaXplLCAwLCA2KnNpemUvMTAsIC01KnNpemUvNCk7Ci0JZ2MuZHJhd0xpbmUoNCpzaXplLzMsIC1zaXplLzIsIDYqc2l6ZS8xMCwgLTUqc2l6ZS80KTsKLQkKLQkvLyBzZWxlY3QgZG90IGxpbmUgc3R5bGUKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfRE9UKTsKLQkKLQkvLyAzIGRvdHRlZCBsaW5lcwotCWdjLmRyYXdMaW5lKDAsIDAsIHNpemUvMywgLXNpemUvMik7CQkJCQkvLyBsZWZ0IAotCWdjLmRyYXdMaW5lKHNpemUvMywgLXNpemUvMiwgNipzaXplLzEwLCAtNSpzaXplLzQpOyAvLyB0byB0b3Agb2YgcHlyYW1pZAotCWdjLmRyYXdMaW5lKDQqc2l6ZS8zLCAtc2l6ZS8yLCBzaXplLzMsIC1zaXplLzIpOwkvLyByaWdodAotCi0JdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkKLQkvLyAtLS0tLSByZWN0YW5ndWxhciBwcmlzbSAtLS0tLQotCQotCXRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGV2aWNlKTsKLQl0cmFuc2Zvcm0udHJhbnNsYXRlKHdpZHRoLzIgKyB1cERvd25WYWx1ZSwgaGVpZ2h0LzIgKyBzaXplKTsKLQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkKLQkvLyBmaWxsIGJvdHRvbQotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JZ2MuZmlsbFBvbHlnb24obmV3IGludCBbXSB7MCwgc2l6ZSwgc2l6ZS8zLCBzaXplLzIsIDcqc2l6ZS8zLCBzaXplLzIsIDIqc2l6ZSwgc2l6ZX0pOwotCQotCS8vIHNlbGVjdCBzb2xpZCBsaW5lIHN0eWxlCi0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkKLQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIDIqc2l6ZSwgc2l6ZSk7Ci0JCi0JLy8gbmV4dCAzIHNvbGlkIGxpbmVzCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZS8zLCAtc2l6ZS8yKTsJCQkvLyBsZWZ0Ci0JZ2MuZHJhd0xpbmUoMipzaXplLCAwLCA3KnNpemUvMywgLXNpemUvMik7CS8vIG1pZGRsZQotCWdjLmRyYXdMaW5lKDIqc2l6ZSwgc2l6ZSwgNypzaXplLzMsIHNpemUvMik7CS8vIHJpZ2h0Ci0JCi0JLy8gMiBmdXJ0aGVzdCBzb2xpZCBsaW5lcwotCWdjLmRyYXdMaW5lKHNpemUvMywgLXNpemUvMiwgNypzaXplLzMsIC1zaXplLzIpOyAgCS8vIGhvcml6b250YWwKLQlnYy5kcmF3TGluZSg3KnNpemUvMywgc2l6ZS8yLCA3KnNpemUvMywgLXNpemUvMik7CS8vIHZlcnRpY2FsCi0JCi0JLy8gMyBkb3R0ZWQgbGluZXMKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSERPVERPVCk7Ci0JZ2MuZHJhd0xpbmUoMCwgc2l6ZSwgc2l6ZS8zLCBzaXplLzIpOwotCWdjLmRyYXdMaW5lKHNpemUvMywgLXNpemUvMiwgc2l6ZS8zLCBzaXplLzIpOwotCWdjLmRyYXdMaW5lKDcqc2l6ZS8zLCBzaXplLzIsIHNpemUvMywgc2l6ZS8yKTsKLQkKLQkvLyBmaWxsIHRvcAotCWdjLnNldEJhY2tncm91bmQoZGV2aWNlLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKSk7Ci0JZ2MuZmlsbFBvbHlnb24obmV3IGludCBbXSB7MCwgMCwgc2l6ZS8zLCAtc2l6ZS8yLCA3KnNpemUvMywgLXNpemUvMiwgMipzaXplLCAwfSk7Ci0KLQl0cmFuc2Zvcm0uZGlzcG9zZSgpOwotCQotCS8vIC0tLS0tIHRyaWFuZ3VsYXIgc2hhcGUgLS0tLS0KLQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JdHJhbnNmb3JtLnRyYW5zbGF0ZSh3aWR0aC80IC0gc2l6ZSAtIHVwRG93blZhbHVlLCBoZWlnaHQvMiArIHNpemUgKyB1cERvd25WYWx1ZSk7Ci0JZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCi0JLy8gZmlsbCBiYWNrIG9mIHNoYXBlICh0b3AgbGVmdCkKLQlnYy5zZXRCYWNrZ3JvdW5kKGRldmljZS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZmlsbFBvbHlnb24obmV3IGludCBbXSB7MCwgMCwgc2l6ZS8yLCAtc2l6ZSwgc2l6ZS8yLCAtc2l6ZS8zfSk7Ci0KLQkvLyBmaWxsIGJhY2sgb2Ygc2hhcGUgKGJvdHRvbSByaWdodCkKLQlnYy5maWxsUG9seWdvbihuZXcgaW50IFtdIHtzaXplLCAwLCBzaXplLzIsIHNpemUsIHNpemUvMiwgLXNpemUvM30pOwotCQotCS8vIHNlbGVjdCBzb2xpZCBsaW5lIHN0eWxlCi0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQkKLQkvLyBzb2xpZCBsaW5lcyBvZiBib3R0b20gdHJpYW5nbGUKLQlnYy5kcmF3TGluZSgwLCAwLCBzaXplLzIsIHNpemUpOwotCWdjLmRyYXdMaW5lKHNpemUsIDAsIHNpemUvMiwgc2l6ZSk7Ci0JCi0JLy8gc29saWQgbGluZXMgb2YgdG9wIHRyaWFuZ2xlCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZS8yLCAtc2l6ZSk7Ci0JZ2MuZHJhd0xpbmUoc2l6ZSwgMCwgc2l6ZS8yLCAtc2l6ZSk7Ci0JCi0JLy8gc29saWQgbGluZXMgb24gdG9wCi0JZ2MuZHJhd0xpbmUoMCwgMCwgc2l6ZS8yLCAtc2l6ZS8zKTsKLQlnYy5kcmF3TGluZShzaXplLCAwLCBzaXplLzIsIC1zaXplLzMpOwotCWdjLmRyYXdMaW5lKHNpemUvMiwgLXNpemUvMywgc2l6ZS8yLCBzaXplKTsKLQlnYy5kcmF3TGluZShzaXplLzIsIC1zaXplLzMsIHNpemUvMiwgLXNpemUpOwotCQotCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci19Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3BpcmFsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TcGlyYWxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxMjJlZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9TcGlyYWxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBwcmVzZW50cyBhIHNwaXJhbCBjb25zaXN0aW5nIG9mIHRoZSBudW1iZXIgb2YgcGV0YWxzIHNwZWNpZmllZC4KLSAqICovCi1wdWJsaWMgY2xhc3MgU3BpcmFsVGFiIGV4dGVuZHMgQW5pbWF0ZWRHcmFwaGljc1RhYiB7Ci0JCi0JaW50IGFuZ2xlOwkJCQkJLy8gYW5nbGUgYnkgd2hpY2ggdG8gcm90YXRlIHRoZSBwZXRhbHMKLQlTcGlubmVyIHBldGFsU3Bpbm5lcjsJCS8vIHNwaW5uZXIgdG8gY29udHJvbCBudW1iZXIgb2YgcGV0YWxzCi0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCUdyYXBoaWNzQmFja2dyb3VuZCBmb3JlZ3JvdW5kOwotCU1lbnUgbWVudTsKLQkKLXB1YmxpYyBTcGlyYWxUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLQlhbmdsZSA9IC05MDsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCW1lbnUuZGlzcG9zZSgpOwotCQltZW51ID0gbnVsbDsKLQl9Ci19Ci0vKioKLSAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzcGlubmVyIGZvciBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgcGV0YWxzLiBUaGUgY2FsbCB0byB0aGUKLSAqIGNyZWF0ZUNvbnRyb2xQYW5lbCBtZXRob2QgaW4gdGhlIHN1cGVyIGNsYXNzIGNyZWF0ZSB0aGUgY29udHJvbHMgdGhhdCBhcmUKLSAqIGRlZmluZWQgaW4gdGhlIHN1cGVyIGNsYXNzLgotICogCi0gKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlIAotICovCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCXN1cGVyLmNyZWF0ZUNvbnRyb2xQYW5lbChwYXJlbnQpOwotCQkKLQkvLyBjcmVhdGUgc3Bpbm5lciBudW1iZXIgb2YgcGV0YWxzCi0JQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JbmV3IExhYmVsKGNvbXAsIFNXVC5DRU5URVIpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIlBldGFscyIpKTsgLy8kTk9OLU5MUy0xJAotCXBldGFsU3Bpbm5lciA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JcGV0YWxTcGlubmVyLnNldFNlbGVjdGlvbig4KTsKLQlwZXRhbFNwaW5uZXIuc2V0TWluaW11bSgzKTsKLQlwZXRhbFNwaW5uZXIuc2V0TWF4aW11bSgyMCk7Ci0JcGV0YWxTcGlubmVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gY3JlYXRlIGNvbG9yIGJ1dHRvbgotCWNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCWNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQotCUNvbG9yTWVudSBjbSA9IG5ldyBDb2xvck1lbnUoKTsKLQljbS5zZXRQYXR0ZXJuSXRlbXMoZXhhbXBsZS5jaGVja0FkdmFuY2VkR3JhcGhpY3MoKSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQlmb3JlZ3JvdW5kID0gZ2I7CQkKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQotCS8vIGluaXRpYWxpemUgdGhlIGZvcmVncm91bmQgdG8gdGhlIDJuZCBpdGVtIGluIHRoZSBtZW51Ci0JZm9yZWdyb3VuZCA9IChHcmFwaGljc0JhY2tncm91bmQpbWVudS5nZXRJdGVtKDEpLmdldERhdGEoKTsKLQkKLQkvLyBjb2xvciBidXR0b24KLQljb2xvckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCWNvbG9yQnV0dG9uLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIkNvbG9yIikpOyAvLyROT04tTkxTLTEkCi0JY29sb3JCdXR0b24uc2V0SW1hZ2UoZm9yZWdyb3VuZC5nZXRUaHVtYk5haWwoKSk7Ci0JY29sb3JCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgeyAKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOyAKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBwb2ludCA9IHBhcmVudC50b0Rpc3BsYXkobmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwb2ludC54LCBwb2ludC55ICsgYm91bmRzLmhlaWdodCk7Ci0JCQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJNaXNjIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlNwaXJhbCIpOyAvLyROT04tTkxTLTEkCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3BpcmFsRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI2dldEFuaW1hdGlvblRpbWUoKQotICovCi1wdWJsaWMgaW50IGdldEluaXRpYWxBbmltYXRpb25UaW1lKCkgewotCXJldHVybiAxNTA7CQotfQotCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5ncmFwaGljcy5BbmltYXRlZEdyYXBoaWNzVGFiI25leHQoaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIG5leHQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JaWYgKGFuZ2xlID09IDI3MCkgewotCQlhbmdsZSA9IC05MDsKLQl9Ci0JYW5nbGUgKz0gMTA7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JLy8gc2V0IGxpbmUgYXR0cmlidXRlcwotCWdjLnNldExpbmVXaWR0aCgyMCk7Ci0JZ2Muc2V0TGluZUNhcChTV1QuQ0FQX1JPVU5EKTsJLy8gcm91bmQgbGluZSBlbmRzCi0JZ2Muc2V0QW50aWFsaWFzKFNXVC5PTik7CS8vIHNtb290aCBqYWdnZWQgZWRnZXMKLQkKLQlQYXR0ZXJuIHBhdHRlcm4gPSBudWxsOwotCWlmIChmb3JlZ3JvdW5kLmdldEJnQ29sb3IxKCkgIT0gbnVsbCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQuZ2V0QmdDb2xvcjEoKSk7Ci0JfSBlbHNlIGlmIChmb3JlZ3JvdW5kLmdldEJnSW1hZ2UoKSAhPSBudWxsKSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkZXZpY2UsIGZvcmVncm91bmQuZ2V0QmdJbWFnZSgpKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JfQotCi0JLy8gZHJhdyBwZXRhbHMgZm9yIHRoZSBzcGlyYWwKLQlUcmFuc2Zvcm0gdHJhbnNmb3JtOwotCWludCBuID0gcGV0YWxTcGlubmVyLmdldFNlbGVjdGlvbigpOwotCWZvciAoaW50IGk9MDsgaSA8IG47IGkrKykgewotCQl0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRldmljZSk7Ci0JCXRyYW5zZm9ybS50cmFuc2xhdGUod2lkdGgvMiwgaGVpZ2h0LzIpOwotCQl0cmFuc2Zvcm0ucm90YXRlKC0oYW5nbGUgKyAzNjAvbiAqIGkpKTsKLQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCWdjLmRyYXdBcmMoMCwgMCwgd2lkdGgvMywgaGVpZ2h0LzYsIDAsIDE4MCk7Ci0JCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JfQotCQotCWlmIChwYXR0ZXJuICE9IG51bGwpIHBhdHRlcm4uZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3RhclBvbHlUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1N0YXJQb2x5VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZWExNTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvU3RhclBvbHlUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU3RhclBvbHlUYWIgZXh0ZW5kcyBHcmFwaGljc1RhYiB7Ci0JaW50W10gcmFkaWFsOwotCXN0YXRpYyBmaW5hbCBpbnQgUE9JTlRTICA9IDExOwotCQotCUNvbWJvIGZpbGxSdWxlQ2I7Ci0KLXB1YmxpYyBTdGFyUG9seVRhYihHcmFwaGljc0V4YW1wbGUgZXhhbXBsZSkgewotCXN1cGVyKGV4YW1wbGUpOwotCXJhZGlhbCA9IG5ldyBpbnRbUE9JTlRTICogMl07Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpLnNldFRleHQoR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJGaWxsUnVsZSIpKTsgLy8kTk9OLU5MUy0xJAotCWZpbGxSdWxlQ2IgPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOKTsKLQlmaWxsUnVsZUNiLmFkZCgiRklMTF9FVkVOX09ERCIpOwotCWZpbGxSdWxlQ2IuYWRkKCJGSUxMX1dJTkRJTkciKTsKLQlmaWxsUnVsZUNiLnNlbGVjdCgwKTsKLQlmaWxsUnVsZUNiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlleGFtcGxlLnJlZHJhdygpOwotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiUG9seWdvbnMiKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU3RhclBvbHlnb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIlN0YXJQb2x5Z29uRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgaW50IGNlbnRlclggPSB3aWR0aCAvIDI7Ci0gICAgaW50IGNlbnRlclkgPSBoZWlnaHQgLyAyOwotICAgIGludCBwb3MgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUE9JTlRTOyArK2kpIHsKLSAgICAgICAgZG91YmxlIHIgPSBNYXRoLlBJKjIgKiBwb3MvUE9JTlRTOwotICAgICAgICByYWRpYWxbaSoyXSA9IChpbnQpKCgxK01hdGguY29zKHIpKSpjZW50ZXJYKTsKLSAgICAgICAgcmFkaWFsW2kqMisxXSA9IChpbnQpKCgxK01hdGguc2luKHIpKSpjZW50ZXJZKTsKLSAgICAgICAgcG9zID0gKHBvcyArIFBPSU5UUy8yKSAlIFBPSU5UUzsKLSAgICB9Ci0JZ2Muc2V0RmlsbFJ1bGUoZmlsbFJ1bGVDYi5nZXRTZWxlY3Rpb25JbmRleCgpICE9IDAgPyBTV1QuRklMTF9XSU5ESU5HIDogU1dULkZJTExfRVZFTl9PREQpOwotCWdjLnNldEJhY2tncm91bmQoZ2MuZ2V0RGV2aWNlKCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0gICAgZ2MuZmlsbFBvbHlnb24ocmFkaWFsKTsKLSAgICBnYy5kcmF3UG9seWdvbihyYWRpYWwpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvVGV4dEFudGlhbGlhc1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvVGV4dEFudGlhbGlhc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWJhMjJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL1RleHRBbnRpYWxpYXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuZ3JhcGhpY3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGlzIHRhYiBkZW1vbnN0cmF0ZXMgYW50aWFsaWFzaW5nIGZvciB0ZXh0LiBBbnRpYWxpYXNpbmcgaXMgdXNlZCBmb3IKLSAqIHNtb290aGluZyBqYWdnZWQgZWRnZXMgaW4gZ3JhcGhpY3MuIFRoaXMgdGFiIGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlCi0gKiBlZmZlY3RzIG9mIGRpZmZlcmVudCBhbnRpYWxpYXNpbmcgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dEFudGlhbGlhc1RhYiBleHRlbmRzIEdyYXBoaWNzVGFiIHsKLQotCUNvbWJvIGFsaWFzQ29tYm87Ci0Jc3RhdGljIGludFtdIGFsaWFzVmFsdWVzID0geyBTV1QuT0ZGLCBTV1QuREVGQVVMVCwgU1dULk9OIH07Ci0JCi0JQnV0dG9uIGNvbG9yQnV0dG9uOwotCU1lbnUgbWVudTsKLQlHcmFwaGljc0JhY2tncm91bmQgdGV4dENvbG9yOwotCVN0cmluZyB0ZXh0ID0gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJTV1QiKTsKLQotCQotcHVibGljIFRleHRBbnRpYWxpYXNUYWIoR3JhcGhpY3NFeGFtcGxlIGV4YW1wbGUpIHsKLQlzdXBlcihleGFtcGxlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQlyZXR1cm4gR3JhcGhpY3NFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmciKTsgLy8kTk9OLU5MUy0xJAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JcmV0dXJuIEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiVGV4dCIpOyAvLyROT04tTkxTLTEkIAotfQotCi1wdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBHcmFwaGljc0V4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkFudGlhbGlhc2luZ1RleHREZXNjIik7IC8vJE5PTi1OTFMtMSQKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCW1lbnUuZGlzcG9zZSgpOwotCQltZW51ID0gbnVsbDsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQlDb21wb3NpdGUgY29tcDsKLQkKLQkvLyBjcmVhdGUgZHJvcCBkb3duIGNvbWJvIGZvciBhbnRpYWxpYXNpbmcKLQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCW5ldyBMYWJlbChjb21wLCBTV1QuQ0VOVEVSKS5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZQotCQkJLmdldFJlc291cmNlU3RyaW5nKCJBbnRpYWxpYXNpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQlhbGlhc0NvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04pOwotCWFsaWFzQ29tYm8uYWRkKCJPRkYiKTsKLQlhbGlhc0NvbWJvLmFkZCgiREVGQVVMVCIpOwotCWFsaWFzQ29tYm8uYWRkKCJPTiIpOwotCWFsaWFzQ29tYm8uc2VsZWN0KDApOwotCWFsaWFzQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkJCi0JQ29sb3JNZW51IGNtID0gbmV3IENvbG9yTWVudSgpOwotCWNtLnNldENvbG9ySXRlbXModHJ1ZSk7Ci0JbWVudSA9IGNtLmNyZWF0ZU1lbnUocGFyZW50LmdldFBhcmVudCgpLCBuZXcgQ29sb3JMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoR3JhcGhpY3NCYWNrZ3JvdW5kIGdiKSB7Ci0JCQl0ZXh0Q29sb3IgPSBnYjsKLQkJCWNvbG9yQnV0dG9uLnNldEltYWdlKGdiLmdldFRodW1iTmFpbCgpKTsKLQkJCWV4YW1wbGUucmVkcmF3KCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBjcmVhdGUgY29sb3IgYnV0dG9uCi0JY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCi0JLy8gaW5pdGlhbGl6ZSB0aGUgY29sb3IgdG8gYmxhY2sKLQl0ZXh0Q29sb3IgPSAoR3JhcGhpY3NCYWNrZ3JvdW5kKW1lbnUuZ2V0SXRlbSgxKS5nZXREYXRhKCk7Ci0JCi0JY29sb3JCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQljb2xvckJ1dHRvbi5zZXRUZXh0KEdyYXBoaWNzRXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiQ29sb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQljb2xvckJ1dHRvbi5zZXRJbWFnZSh0ZXh0Q29sb3IuZ2V0VGh1bWJOYWlsKCkpOwotCQotCWNvbG9yQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsgCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IGJ1dHRvbi5nZXRQYXJlbnQoKTsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJUG9pbnQgcG9pbnQgPSBwYXJlbnQudG9EaXNwbGF5KG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkpKTsKLQkJCW1lbnUuc2V0TG9jYXRpb24ocG9pbnQueCwgcG9pbnQueSArIGJvdW5kcy5oZWlnaHQpOwotCQkJbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmdyYXBoaWNzLkdyYXBoaWNzVGFiI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywgaW50LCBpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQlpZiAoIWV4YW1wbGUuY2hlY2tBZHZhbmNlZEdyYXBoaWNzKCkpIHJldHVybjsKLQlEZXZpY2UgZGV2aWNlID0gZ2MuZ2V0RGV2aWNlKCk7Ci0JCi0JaWYgKHRleHRDb2xvciAhPSBudWxsICYmIHRleHRDb2xvci5nZXRCZ0NvbG9yMSgpICE9IG51bGwpCi0JCWdjLnNldEZvcmVncm91bmQodGV4dENvbG9yLmdldEJnQ29sb3IxKCkpOwotCi0JZ2Muc2V0VGV4dEFudGlhbGlhcyhhbGlhc1ZhbHVlc1thbGlhc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldKTsKLQotCS8vIGNvbHVtbiAxLCByb3cgMQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSgwKSwgMTAwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCVBvaW50IHNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCB3aWR0aC80IC0gc2l6ZS54LzIsIGhlaWdodC80IC0gc2l6ZS55LzIsIHRydWUpOwotCWZvbnQuZGlzcG9zZSgpOwotCQotCS8vIGNvbHVtbiAxLCByb3cgMgotCWZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udEZhY2UoMSksIDEwMCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgd2lkdGgvNCAtIHNpemUueC8yLCAzKmhlaWdodC80IC0gc2l6ZS55LzIsIHRydWUpOwotCWZvbnQuZGlzcG9zZSgpOwotCQotCS8vIGNvbHVtbiAyLCByb3cgMQotCWZvbnQgPSBuZXcgRm9udChkZXZpY2UsIGdldFBsYXRmb3JtRm9udEZhY2UoMiksIDUwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAod2lkdGgtc2l6ZS54KS8yLCAwLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLQkKLQkvLyBjb2x1bW4gMiwgcm93IDIKLQlmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnRGYWNlKDMpLCAxMDAsIFNXVC5JVEFMSUMpOwotCWdjLnNldEZvbnQoZm9udCk7Ci0Jc2l6ZSA9IGdjLnN0cmluZ0V4dGVudCh0ZXh0KTsKLQlnYy5kcmF3U3RyaW5nKHRleHQsICh3aWR0aC1zaXplLngpLzIsIChoZWlnaHQtc2l6ZS55KS8yLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLQkKLQkvLyBjb2x1bW4gMiwgcm93IDMKLQlmb250ID0gbmV3IEZvbnQoZGV2aWNlLCBnZXRQbGF0Zm9ybUZvbnRGYWNlKDQpLCA1MCwgU1dULk5PUk1BTCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlzaXplID0gZ2Muc3RyaW5nRXh0ZW50KHRleHQpOwotCWdjLmRyYXdTdHJpbmcodGV4dCwgKHdpZHRoLXNpemUueCkvMiwgaGVpZ2h0LXNpemUueSwgdHJ1ZSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JCi0JLy8gY29sdW1uIDMsIHJvdyAxCi0JZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSg1KSwgMTAwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAzKndpZHRoLzQgLSBzaXplLngvMiwgaGVpZ2h0LzQgLSBzaXplLnkvMiwgdHJ1ZSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JCi0JLy8gY29sdW1uIDMsIHJvdyAyCi0JZm9udCA9IG5ldyBGb250KGRldmljZSwgZ2V0UGxhdGZvcm1Gb250RmFjZSg2KSwgMTAwLCBTV1QuTk9STUFMKTsKLQlnYy5zZXRGb250KGZvbnQpOwotCXNpemUgPSBnYy5zdHJpbmdFeHRlbnQodGV4dCk7Ci0JZ2MuZHJhd1N0cmluZyh0ZXh0LCAzKndpZHRoLzQgLSBzaXplLngvMiwgMypoZWlnaHQvNCAtIHNpemUueS8yLCB0cnVlKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgdmFsaWQgZm9udCBmb3IgdGhlIGhvc3QgcGxhdGZvcm0uCi0gKiAKLSAqIEBwYXJhbSBpbmRleAotICogICAgICAgICAgICBpbmRleCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZm9udCBmYWNlCi0gKi8KLXN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gb250RmFjZShpbnQgaW5kZXgpIHsKLQlpZihTV1QuZ2V0UGxhdGZvcm0oKSA9PSAid2luMzIiIHx8IFNXVC5nZXRQbGF0Zm9ybSgpID09ICJ3cGYiKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQm9va21hbiBPbGQgU3R5bGUiLCAiQ2VudHVyeSBHb3RoaWMiLCAiQ29taWMgU2FucyBNUyIsICJJbXBhY3QiLCAiR2FyYW1vbmQiLCAiTHVjaWRhIENvbnNvbGUiLCAiTW9ub3R5cGUgQ29yc2l2YSJ9IFtpbmRleF07CQotCX0gZWxzZSBpZiAoU1dULmdldFBsYXRmb3JtKCkgPT0gIm1vdGlmIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7InVydyBwYWxsYWRpbyBsIiwgIkNvdXJpZXIiLCAicXViIiwgIlVSVyBHb3RoaWMgTCIsICJUaW1lcyIsICJMdWNpZGEiLCAiVVJXIENoYW5jZXJ5TCJ9IFtpbmRleF07Ci0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiZ3RrIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7Ikx1eGkgTW9ubyIsICJLYWNzdFRpdGxlTCIsICJCYWVrbXVrIEJhdGFuZyIsICJCYWVrbXVrIEhlYWRsaW5lIiwgIkthY3N0RmFyc2kiLCAiQmFla211ayBHdWxpbSIsICJVUlcgQ2hhbmNlcnkgTCJ9IFtpbmRleF07Ci0JfSBlbHNlIGlmIChTV1QuZ2V0UGxhdGZvcm0oKSA9PSAiY2FyYm9uIikgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IkFwcGxlIENoYW5jZXJ5IiwgIkJydXNoIFNjcmlwdCBNVCIsICJDb21pYyBTYW5zIE1TIiwgIkltcGFjdCIsICJIZXJjdWxhbnVtIiwgIkx1Y2lkYSBHcmFuZGUiLCAiUGFweXJ1cyJ9IFtpbmRleF07Ci0JfSBlbHNlIHsgLy8gcGhvdG9uLCBldGMgLi4uCi0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHsiQ291cmllciIsICJWZXJkYW5hIiwgIlZlcmRhbmEiLCAiVmVyZGFuYSIsICJWZXJkYW5hIiwgIlZlcmRhbmEiLCAiVmVyZGFuYSJ9IFtpbmRleF07Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX2NsdWIuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX2NsdWIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDVlYTMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9jbHViLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9kaWFtb25kLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9kaWFtb25kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmMTNmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9hY2VfZGlhbW9uZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9hY2VfaGVhcnRzLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9oZWFydHMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQzMWIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9oZWFydHMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX3NwYWRlLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FjZV9zcGFkZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDkxMTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWNlX3NwYWRlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FscGhhX2ltZzEucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWxwaGFfaW1nMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDEwZTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYWxwaGFfaW1nMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9hbHBoYV9pbWcyLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FscGhhX2ltZzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzIwMjE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2FscGhhX2ltZzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvYmFjay5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNDE1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2N1YmUucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvY3ViZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmE0YTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvY3ViZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9kYi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9kYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMTNkOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvZGIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvZm9udC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9mb250LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzODk0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9mb250LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2hlbHAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaGVscC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzAzMDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaGVscC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9ob21lX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9ob21lX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzJlOGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaG91c2VzLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2hvdXNlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTgxNGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvaG91c2VzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2lybWFvcy5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9pcm1hb3MuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzUyY2RlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL2lybWFvcy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9tYXplLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL21hemUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjg3ZTc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL21hemUuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvbmV4dC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9uZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmOGMzZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9uZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL292YWxzLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL292YWxzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZmU1ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9vdmFscy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXR0ZXJuMS5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXR0ZXJuMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NmE3ZDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF0dGVybjEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF0dGVybjIuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF0dGVybjIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjg5ZWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdHRlcm4yLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdHRlcm4zLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3BhdHRlcm4zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlMDZhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXR0ZXJuMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXVzZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wYXVzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWUzZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGF1c2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvcGxheS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wbGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNGUyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9wbGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2dyYXBoaWNzL3N3YXAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3Mvc3dhcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MDkzNGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3Mvc3dhcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9zd3QucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3Mvc3d0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0OWI1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy9zd3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvZ3JhcGhpY3MvdGFzay5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy90YXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkMTBmNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ncmFwaGljcy90YXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM5OGRjMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkCi0gKiB0byBvcGVuIGFuIFNXVCBTaGVsbCBhbmQgcHJvY2VzcyB0aGUgZXZlbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBIZWxsb1dvcmxkMSAoKS5vcGVuIChkaXNwbGF5KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXJldHVybiBzaGVsbDsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIwYzhjOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmhlbGxvd29ybGQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKgotICogVGhpcyBleGFtcGxlIGJ1aWxkcyBvbiBIZWxsb1dvcmxkMSBhbmQgZGVtb25zdHJhdGVzIHRoZSBtaW5pbXVtIGFtb3VudCAKLSAqIG9mIGNvZGUgcmVxdWlyZWQgdG8gb3BlbiBhbiBTV1QgU2hlbGwgd2l0aCBhIExhYmVsIGFuZCBwcm9jZXNzIHRoZSBldmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkMiB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzSGVsbG8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2hlbGxvd29ybGQiKTsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQyICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRUZXh0IChyZXNIZWxsby5nZXRTdHJpbmcoIkhlbGxvX3dvcmxkIikpOwotCWxhYmVsLnNldEJvdW5kcyAoc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiNjFhZDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQyIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIHJlc2l6ZSB0aGUgCi0gKiBMYWJlbCB3aGVuIHRoZSBTaGVsbCByZXNpemVzIHVzaW5nIGEgTGlzdGVuZXIgbWVjaGFuaXNtLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDMgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0hlbGxvID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19oZWxsb3dvcmxkIik7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBIZWxsb1dvcmxkMyAoKS5vcGVuIChkaXNwbGF5KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi1wdWJsaWMgU2hlbGwgb3BlbiAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCAocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpKTsKLQlsYWJlbC5wYWNrKCk7Ci0Jc2hlbGwuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCWxhYmVsLnNldEJvdW5kcyAoc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwNGY0NTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5oZWxsb3dvcmxkOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoKLSAqIFRoaXMgZXhhbXBsZSBidWlsZHMgb24gSGVsbG9Xb3JsZDIgYW5kIGRlbW9uc3RyYXRlcyBob3cgdG8gcmVzaXplIHRoZSAKLSAqIExhYmVsIHdoZW4gdGhlIFNoZWxsIHJlc2l6ZXMgdXNpbmcgYSBMYXlvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkNCB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzSGVsbG8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2hlbGxvd29ybGQiKTsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQ0ICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCAocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JcmV0dXJuIHNoZWxsOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzYxMTU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaGVsbG93b3JsZDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qCi0gKiBUaGlzIGV4YW1wbGUgYnVpbGRzIG9uIEhlbGxvV29ybGQxIGFuZCBkZW1vbnN0cmF0ZXMgaG93IHRvIGRyYXcgZGlyZWN0bHkKLSAqIG9uIGFuIFNXVCBDb250cm9sLgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc0hlbGxvID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19oZWxsb3dvcmxkIik7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IEhlbGxvV29ybGQ1ICgpLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQlmaW5hbCBDb2xvciByZWQgPSBuZXcgQ29sb3IoZGlzcGxheSwgMHhGRiwgMCwgMCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCl7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhKCk7Ci0JCQlnYy5kcmF3UmVjdGFuZ2xlKHJlY3QueCArIDEwLCByZWN0LnkgKyAxMCwgcmVjdC53aWR0aCAtIDIwLCByZWN0LmhlaWdodCAtIDIwKTsKLQkJCWdjLmRyYXdTdHJpbmcocmVzSGVsbG8uZ2V0U3RyaW5nKCJIZWxsb193b3JsZCIpLCByZWN0LnggKyAyMCwgcmVjdC55ICsgMjApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyIChuZXcgRGlzcG9zZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQgKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQlyZWQuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvSG92ZXJIZWxwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvSG92ZXJIZWxwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZjdiM2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL0hvdmVySGVscC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuaG92ZXJoZWxwOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0vKioKLSAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGltcGxlbWVudCBob3ZlciBoZWxwIGZlZWRiYWNrCi0gKiB1c2luZyB0aGUgTW91c2VUcmFja0xpc3RlbmVyLgotICovCi1wdWJsaWMgY2xhc3MgSG92ZXJIZWxwIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfaG92ZXJoZWxwIik7Ci0JCi0Jc3RhdGljIGZpbmFsIGludAotCQloaGlJbmZvcm1hdGlvbiA9IDAsCi0JCWhoaVdhcm5pbmcgPSAxOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbWFnZUxvY2F0aW9ucyA9IHsKLQkJImluZm9ybWF0aW9uLmdpZiIsCi0JCSJ3YXJuaW5nLmdpZiIKLQl9OwotCUltYWdlIGltYWdlc1tdOwotCi0JLyoqCi0JICogUnVucyBtYWluIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IEhvdmVySGVscCgpLm9wZW4oZGlzcGxheSk7Ci0JCS8vIEV2ZW50IGxvb3AKLQkJd2hpbGUgKHNoZWxsICE9IG51bGwgJiYgISBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQkvLyBDbGVhbnVwCi0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCi0JfQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBtYWluIHByb2dyYW0uCi0JICovCi0JcHVibGljIFNoZWxsIG9wZW4oRGlzcGxheSBkaXNwbGF5KSB7CQkKLQkJLy8gTG9hZCB0aGUgaW1hZ2VzCi0JCUNsYXNzIGNsYXp6ID0gSG92ZXJIZWxwLmNsYXNzOwotCQl0cnkgewotCQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VzID0gbmV3IEltYWdlW2ltYWdlTG9jYXRpb25zLmxlbmd0aF07Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKGltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJCQlpbWFnZXNbaV0gPSBuZXcgSW1hZ2UoZGlzcGxheSwgc291cmNlLCBtYXNrKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIsCi0JCQkJbmV3IE9iamVjdFtdIHsgZXguZ2V0TWVzc2FnZSgpIH0pKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSB3aW5kb3cKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJY3JlYXRlUGFydENvbnRyb2woc2hlbGwpOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJLyogRnJlZSByZXNvdXJjZXMgKi8KLQkJCQlpZiAoaW1hZ2VzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWZpbmFsIEltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQlpbWFnZXMgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJZmluYWwgVG9vbFRpcEhhbmRsZXIgdG9vbHRpcCA9IG5ldyBUb29sVGlwSGFuZGxlcihmcmFtZS5nZXRTaGVsbCgpKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlmcmFtZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQkJVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoZnJhbWUsIFNXVC5CT1JERVIpOwotCQlmb3IgKGludCBpPTA7IGk8NTsgaSsrKSB7Ci0JCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChiYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0VGV4dCAoZ2V0UmVzb3VyY2VTdHJpbmcoIlRvb2xJdGVtLnRleHQiLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihpKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfVEVYVCIsIGdldFJlc291cmNlU3RyaW5nKCJUb29sSXRlbS50b29sdGlwIiwKLQkJCQluZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfSEVMUFRFWFRIQU5ETEVSIiwgbmV3IFRvb2xUaXBIZWxwVGV4dEhhbmRsZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRIZWxwVGV4dChXaWRnZXQgd2lkZ2V0KSB7Ci0JCQkJCUl0ZW0gaXRlbSA9IChJdGVtKSB3aWRnZXQ7Ci0JCQkJCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZygiVG9vbEl0ZW0uaGVscCIsIG5ldyBPYmplY3RbXSB7IGl0ZW0uZ2V0VGV4dCgpIH0pOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYmFyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0b29sdGlwLmFjdGl2YXRlSG92ZXJIZWxwKGJhcik7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKGZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiSXRlbSIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGkpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9JTUFHRSIsIGltYWdlc1toaGlJbmZvcm1hdGlvbl0pOwotCQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiVGFibGVJdGVtLnRleHQiLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihpKSB9KSk7Ci0JCQlpdGVtLnNldERhdGEgKCJUSVBfVEVYVCIsIGdldFJlc291cmNlU3RyaW5nKCJUYWJsZUl0ZW0udG9vbHRpcCIsCi0JCQkJbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX0hFTFBURVhUSEFORExFUiIsIG5ldyBUb29sVGlwSGVscFRleHRIYW5kbGVyKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SGVscFRleHQoV2lkZ2V0IHdpZGdldCkgewotCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoIlRhYmxlSXRlbS5oZWxwIiwgbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQl0b29sdGlwLmFjdGl2YXRlSG92ZXJIZWxwKHRhYmxlKTsKLQkKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUgKGZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiSXRlbSIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKGkpIH0pKTsKLQkJCWl0ZW0uc2V0RGF0YSAoIlRJUF9JTUFHRSIsIGltYWdlc1toaGlXYXJuaW5nXSk7Ci0JCQlpdGVtLnNldFRleHQgKGdldFJlc291cmNlU3RyaW5nKCJUcmVlSXRlbS50ZXh0IiwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoaSkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX1RFWFQiLCBnZXRSZXNvdXJjZVN0cmluZygiVHJlZUl0ZW0udG9vbHRpcCIsCi0JCQkJbmV3IE9iamVjdFtdIHsgaXRlbS5nZXRUZXh0KCkgfSkpOwotCQkJaXRlbS5zZXREYXRhICgiVElQX0hFTFBURVhUSEFORExFUiIsIG5ldyBUb29sVGlwSGVscFRleHRIYW5kbGVyKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SGVscFRleHQoV2lkZ2V0IHdpZGdldCkgewotCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoIlRyZWVJdGVtLmhlbHAiLCBuZXcgT2JqZWN0W10geyBpdGVtLmdldFRleHQoKSB9KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQl0cmVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJdG9vbHRpcC5hY3RpdmF0ZUhvdmVySGVscCh0cmVlKTsKLQkKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGZyYW1lLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZygiSGVsbG8udGV4dCIpKTsKLQkJYnV0dG9uLnNldERhdGEgKCJUSVBfVEVYVCIsIGdldFJlc291cmNlU3RyaW5nKCJIZWxsby50b29sdGlwIikpOwotCQl0b29sdGlwLmFjdGl2YXRlSG92ZXJIZWxwKGJ1dHRvbik7Ci0JfQotCi0JLyoqCi0JICogRW11bGF0ZWQgdG9vbHRpcCBoYW5kbGVyCi0JICogTm90aWNlIHRoYXQgd2UgY291bGQgZGlzcGxheSBhbnl0aGluZyBpbiBhIHRvb2x0aXAgYmVzaWRlcyB0ZXh0IGFuZCBpbWFnZXMuCi0JICogRm9yIGluc3RhbmNlLCBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGVtYmVkIGxhcmdlIHRhYmxlcyBvZiBkYXRhIG9yIGJ1dHRvbnMgbGlua2luZwotCSAqIGRhdGEgdW5kZXIgaW5zcGVjdGlvbiB0byBtYXRlcmlhbCBlbHNld2hlcmUsIG9yIHBlcmZvcm0gZHluYW1pYyBsb29rdXAgZm9yIGNyZWF0aW5nCi0JICogdG9vbHRpcCB0ZXh0IG9uIHRoZSBmbHkuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUb29sVGlwSGFuZGxlciB7Ci0JCXByaXZhdGUgU2hlbGwgIHBhcmVudFNoZWxsOwotCQlwcml2YXRlIFNoZWxsICB0aXBTaGVsbDsKLQkJcHJpdmF0ZSBMYWJlbCAgdGlwTGFiZWxJbWFnZSwgdGlwTGFiZWxUZXh0OwotCQlwcml2YXRlIFdpZGdldCB0aXBXaWRnZXQ7IC8vIHdpZGdldCB0aGlzIHRvb2x0aXAgaXMgaG92ZXJpbmcgb3ZlcgotCQlwcml2YXRlIFBvaW50ICB0aXBQb3NpdGlvbjsgLy8gdGhlIHBvc2l0aW9uIGJlaW5nIGhvdmVyZWQgb3ZlcgotCQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyB0b29sdGlwIGhhbmRsZXIKLQkJICoKLQkJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IFNoZWxsCi0JCSAqLwkKLQkJcHVibGljIFRvb2xUaXBIYW5kbGVyKFNoZWxsIHBhcmVudCkgewotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gcGFyZW50LmdldERpc3BsYXkoKTsKLQkJCXRoaXMucGFyZW50U2hlbGwgPSBwYXJlbnQ7Ci0JCi0JCQl0aXBTaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5PTl9UT1AgfCBTV1QuVE9PTCk7Ci0JCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQkJdGlwU2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQotCQkJdGlwU2hlbGwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCQotCQkJdGlwTGFiZWxJbWFnZSA9IG5ldyBMYWJlbCh0aXBTaGVsbCwgU1dULk5PTkUpOwotCQkJdGlwTGFiZWxJbWFnZS5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotCQkJdGlwTGFiZWxJbWFnZS5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJdGlwTGFiZWxJbWFnZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQotCQkJdGlwTGFiZWxUZXh0ID0gbmV3IExhYmVsKHRpcFNoZWxsLCBTV1QuTk9ORSk7Ci0JCQl0aXBMYWJlbFRleHQuc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLQkJCXRpcExhYmVsVGV4dC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJdGlwTGFiZWxUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8Ci0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEVuYWJsZXMgY3VzdG9taXplZCBob3ZlciBoZWxwIGZvciBhIHNwZWNpZmllZCBjb250cm9sCi0JCSAqIAotCQkgKiBAY29udHJvbCB0aGUgY29udHJvbCBvbiB3aGljaCB0byBlbmFibGUgaG92ZXJoZWxwCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZUhvdmVySGVscChmaW5hbCBDb250cm9sIGNvbnRyb2wpIHsKLQkJCS8qCi0JCQkgKiBHZXQgb3V0IG9mIHRoZSB3YXkgaWYgd2UgYXR0ZW1wdCB0byBhY3RpdmF0ZSB0aGUgY29udHJvbCB1bmRlcm5lYXRoIHRoZSB0b29sdGlwCi0JCQkgKi8KLQkJCWNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24gKE1vdXNlRXZlbnQgZSkgewotCQkJCQlpZiAodGlwU2hlbGwuaXNWaXNpYmxlKCkpIHRpcFNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCX0JCi0JCQl9KTsKLQkKLQkJCS8qCi0JCQkgKiBUcmFwIGhvdmVyIGV2ZW50cyB0byBwb3AtdXAgdG9vbHRpcAotCQkJICovCi0JCQljb250cm9sLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0FkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLQkJCQkJaWYgKHRpcFNoZWxsLmlzVmlzaWJsZSgpKSB0aXBTaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJdGlwV2lkZ2V0ID0gbnVsbDsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgbW91c2VIb3ZlciAoTW91c2VFdmVudCBldmVudCkgewotCQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCVdpZGdldCB3aWRnZXQgPSBldmVudC53aWRnZXQ7Ci0JCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUb29sQmFyKSB7Ci0JCQkJCQlUb29sQmFyIHcgPSAoVG9vbEJhcikgd2lkZ2V0OwotCQkJCQkJd2lkZ2V0ID0gdy5nZXRJdGVtIChwdCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRhYmxlKSB7Ci0JCQkJCQlUYWJsZSB3ID0gKFRhYmxlKSB3aWRnZXQ7Ci0JCQkJCQl3aWRnZXQgPSB3LmdldEl0ZW0gKHB0KTsKLQkJCQkJfQotCQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgVHJlZSkgewotCQkJCQkJVHJlZSB3ID0gKFRyZWUpIHdpZGdldDsKLQkJCQkJCXdpZGdldCA9IHcuZ2V0SXRlbSAocHQpOwotCQkJCQl9Ci0JCQkJCWlmICh3aWRnZXQgPT0gbnVsbCkgewotCQkJCQkJdGlwU2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQl0aXBXaWRnZXQgPSBudWxsOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmICh3aWRnZXQgPT0gdGlwV2lkZ2V0KSByZXR1cm47Ci0JCQkJCXRpcFdpZGdldCA9IHdpZGdldDsKLQkJCQkJdGlwUG9zaXRpb24gPSBjb250cm9sLnRvRGlzcGxheShwdCk7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgd2lkZ2V0LmdldERhdGEoIlRJUF9URVhUIik7Ci0JCQkJCUltYWdlIGltYWdlID0gKEltYWdlKSB3aWRnZXQuZ2V0RGF0YSgiVElQX0lNQUdFIik7Ci0JCQkJCXRpcExhYmVsVGV4dC5zZXRUZXh0KHRleHQgIT0gbnVsbCA/IHRleHQgOiAiIik7Ci0JCQkJCXRpcExhYmVsSW1hZ2Uuc2V0SW1hZ2UoaW1hZ2UpOyAvLyBhY2NlcHRzIG51bGwKLQkJCQkJdGlwU2hlbGwucGFjaygpOwotCQkJCQlzZXRIb3ZlckxvY2F0aW9uKHRpcFNoZWxsLCB0aXBQb3NpdGlvbik7Ci0JCQkJCXRpcFNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCi0JCQkvKgotCQkJICogVHJhcCBGMSBIZWxwIHRvIHBvcCB1cCBhIGN1c3RvbSBoZWxwIGJveAotCQkJICovCi0JCQljb250cm9sLmFkZEhlbHBMaXN0ZW5lcihuZXcgSGVscExpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoZWxwUmVxdWVzdGVkKEhlbHBFdmVudCBldmVudCkgewotCQkJCQlpZiAodGlwV2lkZ2V0ID09IG51bGwpIHJldHVybjsKLQkJCQkJVG9vbFRpcEhlbHBUZXh0SGFuZGxlciBoYW5kbGVyID0gKFRvb2xUaXBIZWxwVGV4dEhhbmRsZXIpCi0JCQkJCQl0aXBXaWRnZXQuZ2V0RGF0YSgiVElQX0hFTFBURVhUSEFORExFUiIpOwotCQkJCQlpZiAoaGFuZGxlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJCVN0cmluZyB0ZXh0ID0gaGFuZGxlci5nZXRIZWxwVGV4dCh0aXBXaWRnZXQpOwotCQkJCQlpZiAodGV4dCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCQotCQkJCQlpZiAodGlwU2hlbGwuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCXRpcFNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQkJU2hlbGwgaGVscFNoZWxsID0gbmV3IFNoZWxsKHBhcmVudFNoZWxsLCBTV1QuU0hFTExfVFJJTSk7Ci0JCQkJCQloZWxwU2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaGVscFNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQkJCQkJaGVscFNoZWxsLnBhY2soKTsKLQkJCQkJCXNldEhvdmVyTG9jYXRpb24oaGVscFNoZWxsLCB0aXBQb3NpdGlvbik7Ci0JCQkJCQloZWxwU2hlbGwub3BlbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBsb2NhdGlvbiBmb3IgYSBob3ZlcmluZyBzaGVsbAotCQkgKiBAcGFyYW0gc2hlbGwgdGhlIG9iamVjdCB0aGF0IGlzIHRvIGhvdmVyCi0JCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgYSB3aWRnZXQgdG8gaG92ZXIgb3ZlcgotCQkgKiBAcmV0dXJuIHRoZSB0b3AtbGVmdCBsb2NhdGlvbiBmb3IgYSBob3ZlcmluZyBib3gKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRIb3ZlckxvY2F0aW9uKFNoZWxsIHNoZWxsLCBQb2ludCBwb3NpdGlvbikgewotCQkJUmVjdGFuZ2xlIGRpc3BsYXlCb3VuZHMgPSBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0Qm91bmRzKCk7Ci0JCQlSZWN0YW5nbGUgc2hlbGxCb3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJCXNoZWxsQm91bmRzLnggPSBNYXRoLm1heChNYXRoLm1pbihwb3NpdGlvbi54LCBkaXNwbGF5Qm91bmRzLndpZHRoIC0gc2hlbGxCb3VuZHMud2lkdGgpLCAwKTsKLQkJCXNoZWxsQm91bmRzLnkgPSBNYXRoLm1heChNYXRoLm1pbihwb3NpdGlvbi55ICsgMTYsIGRpc3BsYXlCb3VuZHMuaGVpZ2h0IC0gc2hlbGxCb3VuZHMuaGVpZ2h0KSwgMCk7Ci0JCQlzaGVsbC5zZXRCb3VuZHMoc2hlbGxCb3VuZHMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRvb2xUaXAgaGVscCBoYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIGludGVyZmFjZSBUb29sVGlwSGVscFRleHRIYW5kbGVyIHsKLQkJLyoqCi0JCSAqIEdldCBoZWxwIHRleHQKLQkJICogQHBhcmFtIHdpZGdldCB0aGUgd2lkZ2V0IHRoYXQgaXMgdW5kZXIgaGVscAotCQkgKiBAcmV0dXJuIGEgaGVscCB0ZXh0IHN0cmluZwotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRIZWxwVGV4dChXaWRnZXQgd2lkZ2V0KTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL2luZm9ybWF0aW9uLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC9pbmZvcm1hdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2Yzc0NzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvaG92ZXJoZWxwL2luZm9ybWF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC93YXJuaW5nLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2hvdmVyaGVscC93YXJuaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Y0ZmRmOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9ob3ZlcmhlbHAvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9pbWFnZWFuYWx5emVyL0ltYWdlQW5hbHl6ZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ltYWdlYW5hbHl6ZXIvSW1hZ2VBbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTY4MDczLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2ltYWdlYW5hbHl6ZXIvSW1hZ2VBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmltYWdlYW5hbHl6ZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBJbWFnZUFuYWx5emVyIHsKLQlzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19pbWFnZXMiKTsKLQlEaXNwbGF5IGRpc3BsYXk7Ci0JU2hlbGwgc2hlbGw7Ci0JQ2FudmFzIGltYWdlQ2FudmFzLCBwYWxldHRlQ2FudmFzOwotCUxhYmVsIHR5cGVMYWJlbCwgc2l6ZUxhYmVsLCBkZXB0aExhYmVsLCB0cmFuc3BhcmVudFBpeGVsTGFiZWwsCi0JCXRpbWVUb0xvYWRMYWJlbCwgc2NyZWVuU2l6ZUxhYmVsLCBiYWNrZ3JvdW5kUGl4ZWxMYWJlbCwKLQkJbG9jYXRpb25MYWJlbCwgZGlzcG9zYWxNZXRob2RMYWJlbCwgZGVsYXlUaW1lTGFiZWwsCi0JCXJlcGVhdENvdW50TGFiZWwsIHBhbGV0dGVMYWJlbCwgZGF0YUxhYmVsLCBzdGF0dXNMYWJlbDsKLQlDb21ibyBiYWNrZ3JvdW5kQ29tYm8sIHNjYWxlWENvbWJvLCBzY2FsZVlDb21ibywgYWxwaGFDb21ibzsKLQlCdXR0b24gaW5jcmVtZW50YWxDaGVjaywgdHJhbnNwYXJlbnRDaGVjaywgbWFza0NoZWNrLCBiYWNrZ3JvdW5kQ2hlY2s7Ci0JQnV0dG9uIHByZXZpb3VzQnV0dG9uLCBuZXh0QnV0dG9uLCBhbmltYXRlQnV0dG9uOwotCVN0eWxlZFRleHQgZGF0YVRleHQ7Ci0JU2FzaCBzYXNoOwotCUNvbG9yIHdoaXRlQ29sb3IsIGJsYWNrQ29sb3IsIHJlZENvbG9yLCBncmVlbkNvbG9yLCBibHVlQ29sb3IsIGNhbnZhc0JhY2tncm91bmQ7Ci0JRm9udCBmaXhlZFdpZHRoRm9udDsKLQlDdXJzb3IgY3Jvc3NDdXJzb3I7Ci0JR0MgaW1hZ2VDYW52YXNHQzsKLQkKLQlpbnQgcGFsZXR0ZVdpZHRoID0gMTQwOyAvLyByZWNhbGN1bGF0ZWQgYW5kIHVzZWQgYXMgYSB3aWR0aCBoaW50Ci0JaW50IGl4ID0gMCwgaXkgPSAwLCBweSA9IDA7IC8vIHVzZWQgdG8gc2Nyb2xsIHRoZSBpbWFnZSBhbmQgcGFsZXR0ZQotCWZsb2F0IHhzY2FsZSA9IDEsIHlzY2FsZSA9IDE7IC8vIHVzZWQgdG8gc2NhbGUgdGhlIGltYWdlCi0JaW50IGFscGhhID0gMjU1OyAvLyB1c2VkIHRvIG1vZGlmeSB0aGUgYWxwaGEgdmFsdWUgb2YgdGhlIGltYWdlCi0JYm9vbGVhbiBpbmNyZW1lbnRhbCA9IGZhbHNlOyAvLyB1c2VkIHRvIGluY3JlbWVudGFsbHkgZGlzcGxheSBhbiBpbWFnZQotCWJvb2xlYW4gdHJhbnNwYXJlbnQgPSB0cnVlOyAvLyB1c2VkIHRvIGRpc3BsYXkgYW4gaW1hZ2Ugd2l0aCB0cmFuc3BhcmVuY3kKLQlib29sZWFuIHNob3dNYXNrID0gZmFsc2U7IC8vIHVzZWQgdG8gZGlzcGxheSBhbiBpY29uIG1hc2sgb3IgdHJhbnNwYXJlbnQgaW1hZ2UgbWFzawotCWJvb2xlYW4gc2hvd0JhY2tncm91bmQgPSBmYWxzZTsgLy8gdXNlZCB0byBkaXNwbGF5IHRoZSBiYWNrZ3JvdW5kIG9mIGFuIGFuaW1hdGVkIGltYWdlCi0JYm9vbGVhbiBhbmltYXRlID0gZmFsc2U7IC8vIHVzZWQgdG8gYW5pbWF0ZSBhIG11bHRpLWltYWdlIGZpbGUKLQlUaHJlYWQgYW5pbWF0ZVRocmVhZDsgLy8gZHJhd3MgYW5pbWF0ZWQgaW1hZ2VzCi0JVGhyZWFkIGluY3JlbWVudGFsVGhyZWFkOyAvLyBkcmF3cyBpbmNyZW1lbnRhbCBpbWFnZXMKLQlTdHJpbmcgbGFzdFBhdGg7IC8vIHVzZWQgdG8gc2VlZCB0aGUgZmlsZSBkaWFsb2cKLQlTdHJpbmcgY3VycmVudE5hbWU7IC8vIHRoZSBjdXJyZW50IGltYWdlIGZpbGUgb3IgVVJMIG5hbWUKLQlTdHJpbmcgZmlsZU5hbWU7IC8vIHRoZSBjdXJyZW50IGltYWdlIGZpbGUKLQlJbWFnZUxvYWRlciBsb2FkZXI7IC8vIHRoZSBsb2FkZXIgZm9yIHRoZSBjdXJyZW50IGltYWdlIGZpbGUKLQlJbWFnZURhdGFbXSBpbWFnZURhdGFBcnJheTsgLy8gYWxsIGltYWdlIGRhdGEgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGZpbGUKLQlpbnQgaW1hZ2VEYXRhSW5kZXg7IC8vIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBpbWFnZSBkYXRhCi0JSW1hZ2VEYXRhIGltYWdlRGF0YTsgLy8gdGhlIGN1cnJlbnRseS1kaXNwbGF5ZWQgaW1hZ2UgZGF0YQotCUltYWdlIGltYWdlOyAvLyB0aGUgY3VycmVudGx5LWRpc3BsYXllZCBpbWFnZQotCVZlY3RvciBpbmNyZW1lbnRhbEV2ZW50czsgLy8gaW5jcmVtZW50YWwgaW1hZ2UgZXZlbnRzCi0JbG9uZyBsb2FkVGltZSA9IDA7IC8vIHRoZSB0aW1lIGl0IHRvb2sgdG8gbG9hZCB0aGUgY3VycmVudCBpbWFnZQotCQotCXN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfRElHSVRTID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IEFMUEhBX0NIQVJTID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IEFMUEhBX0NPTlNUQU5UID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IEFMUEhBX1ggPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgQUxQSEFfWSA9IDI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9QRU5fRklMVEVSX0VYVEVOU0lPTlMgPSBuZXcgU3RyaW5nW10gewotCQkJIiouYm1wOyAqLmdpZjsgKi5pY287ICouamZpZjsgKi5qcGVnOyAqLmpwZzsgKi5wbmc7ICoudGlmOyAqLnRpZmYiLAotCQkJIiouYm1wIiwgIiouZ2lmIiwgIiouaWNvIiwgIiouanBnOyAqLmpwZWc7ICouamZpZiIsICIqLnBuZyIsICIqLnRpZjsgKi50aWZmIiB9OwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPUEVOX0ZJTFRFUl9OQU1FUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQlidW5kbGUuZ2V0U3RyaW5nKCJBbGxfaW1hZ2VzIikgKyAiIChibXAsIGdpZiwgaWNvLCBqZmlmLCBqcGVnLCBqcGcsIHBuZywgdGlmLCB0aWZmKSIsCi0JCQkiQk1QICgqLmJtcCkiLCAiR0lGICgqLmdpZikiLCAiSUNPICgqLmljbykiLCAiSlBFRyAoKi5qcGcsICouanBlZywgKi5qZmlmKSIsCi0JCQkiUE5HICgqLnBuZykiLCAiVElGRiAoKi50aWYsICoudGlmZikiIH07Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNBVkVfRklMVEVSX0VYVEVOU0lPTlMgPSBuZXcgU3RyaW5nW10gewotCQkJIiouYm1wIiwgIiouYm1wIiwgIiouZ2lmIiwgIiouaWNvIiwgIiouanBnIiwgIioucG5nIiwgIioudGlmIiwgIiouYm1wIiB9OwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTQVZFX0ZJTFRFUl9OQU1FUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkiVW5jb21wcmVzc2VkIEJNUCAoKi5ibXApIiwgIlJMRSBDb21wcmVzc2VkIEJNUCAoKi5ibXApIiwgIkdJRiAoKi5naWYpIiwKLQkJCSJJQ08gKCouaWNvKSIsICJKUEVHICgqLmpwZykiLCAiUE5HICgqLnBuZykiLAotCQkJIlRJRkYgKCoudGlmKSIsICJPUy8yIEJNUCAoKi5ibXApIiB9OwotCi0JY2xhc3MgVGV4dFByb21wdGVyIGV4dGVuZHMgRGlhbG9nIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVNoZWxsIGRpYWxvZzsKLQkJVGV4dCB0ZXh0OwotCQlwdWJsaWMgVGV4dFByb21wdGVyIChTaGVsbCBwYXJlbnQsIGludCBzdHlsZSkgewotCQkJc3VwZXIgKHBhcmVudCwgc3R5bGUpOwotCQl9Ci0JCXB1YmxpYyBUZXh0UHJvbXB0ZXIgKFNoZWxsIHBhcmVudCkgewotCQkJdGhpcyAocGFyZW50LCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlIChTdHJpbmcgc3RyaW5nKSB7Ci0JCQltZXNzYWdlID0gc3RyaW5nOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgb3BlbiAoKSB7Ci0JCQlkaWFsb2cgPSBuZXcgU2hlbGwoZ2V0UGFyZW50KCksIGdldFN0eWxlKCkpOwotCQkJZGlhbG9nLnNldFRleHQoZ2V0VGV4dCgpKTsKLQkJCWRpYWxvZy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkaWFsb2csIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXRleHQgPSBuZXcgVGV4dChkaWFsb2csIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZywgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBncmlkID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyaWQubnVtQ29sdW1ucyA9IDI7Ci0JCQlidXR0b25zLnNldExheW91dChncmlkKTsKLQkJCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCUJ1dHRvbiBvayA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQkJb2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJPSyIpKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gNzU7Ci0JCQlvay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJb2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlyZXN1bHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJCWNhbmNlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkNhbmNlbCIpKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gNzU7Ci0JCQljYW5jZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihvayk7Ci0JCQlkaWFsb2cucGFjaygpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCXdoaWxlICghZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCUltYWdlQW5hbHl6ZXIgaW1hZ2VBbmFseXplciA9IG5ldyBJbWFnZUFuYWx5emVyKCk7Ci0JCVNoZWxsIHNoZWxsID0gaW1hZ2VBbmFseXplci5vcGVuKGRpc3BsYXkpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIFNoZWxsIG9wZW4oRGlzcGxheSBkcHkpIHsKLQkJLy8gQ3JlYXRlIGEgd2luZG93IGFuZCBzZXQgaXRzIHRpdGxlLgotCQl0aGlzLmRpc3BsYXkgPSBkcHk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkltYWdlX2FuYWx5emVyIikpOwotCQkKLQkJLy8gSG9vayByZXNpemUgYW5kIGRpc3Bvc2UgbGlzdGVuZXJzLgotCQlzaGVsbC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzaXplU2hlbGwoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQkJYW5pbWF0ZSA9IGZhbHNlOyAvLyBzdG9wIGFueSBhbmltYXRpb24gaW4gcHJvZ3Jlc3MKLQkJCQlpZiAoYW5pbWF0ZVRocmVhZCAhPSBudWxsKSB7Ci0JCQkJCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZGllIGJlZm9yZSBkaXNwb3NpbmcgdGhlIHNoZWxsLgotCQkJCQl3aGlsZSAoYW5pbWF0ZVRocmVhZC5pc0FsaXZlKCkpIHsKLQkJCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJLy8gQ2xlYW4gdXAuCi0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl3aGl0ZUNvbG9yLmRpc3Bvc2UoKTsKLQkJCQlibGFja0NvbG9yLmRpc3Bvc2UoKTsKLQkJCQlyZWRDb2xvci5kaXNwb3NlKCk7Ci0JCQkJZ3JlZW5Db2xvci5kaXNwb3NlKCk7Ci0JCQkJYmx1ZUNvbG9yLmRpc3Bvc2UoKTsKLQkJCQlmaXhlZFdpZHRoRm9udC5kaXNwb3NlKCk7Ci0JCQkJY3Jvc3NDdXJzb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBDcmVhdGUgY29sb3JzIGFuZCBmb250cy4KLQkJd2hpdGVDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQkJYmxhY2tDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAwLCAwKTsKLQkJcmVkQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQkJZ3JlZW5Db2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAyNTUsIDApOwotCQlibHVlQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMjU1KTsKLQkJZml4ZWRXaWR0aEZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiY291cmllciIsIDEwLCAwKTsKLQkJY3Jvc3NDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfQ1JPU1MpOwotCQkKLQkJLy8gQWRkIGEgbWVudSBiYXIgYW5kIHdpZGdldHMuCi0JCWNyZWF0ZU1lbnVCYXIoKTsKLQkJY3JlYXRlV2lkZ2V0cygpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCQotCQkvLyBDcmVhdGUgYSBHQyBmb3IgZHJhd2luZywgYW5kIGhvb2sgdGhlIGxpc3RlbmVyIHRvIGRpc3Bvc2UgaXQuCi0JCWltYWdlQ2FudmFzR0MgPSBuZXcgR0MoaW1hZ2VDYW52YXMpOwotCQlpbWFnZUNhbnZhcy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJaW1hZ2VDYW52YXNHQy5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gT3BlbiB0aGUgd2luZG93Ci0JCXNoZWxsLm9wZW4oKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXZvaWQgY3JlYXRlV2lkZ2V0cygpIHsKLQkJLy8gQWRkIHRoZSB3aWRnZXRzIHRvIHRoZSBzaGVsbCBpbiBhIGdyaWQgbGF5b3V0LgotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEFkZCBhIGNvbXBvc2l0ZSB0byBjb250YWluIHNvbWUgY29udHJvbCB3aWRnZXRzIGFjcm9zcyB0aGUgdG9wLgotCQlDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCVJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0JCXJvd0xheW91dC5tYXJnaW5Ub3AgPSA1OwotCQlyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gNTsKLQkJcm93TGF5b3V0LnNwYWNpbmcgPSA4OwotCQljb250cm9scy5zZXRMYXlvdXQocm93TGF5b3V0KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljb250cm9scy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCS8vIENvbWJvIHRvIGNoYW5nZSB0aGUgYmFja2dyb3VuZC4KLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbHMsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQmFja2dyb3VuZCIpKTsKLQkJYmFja2dyb3VuZENvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWJhY2tncm91bmRDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10gewotCQkJYnVuZGxlLmdldFN0cmluZygiTm9uZSIpLAotCQkJYnVuZGxlLmdldFN0cmluZygiV2hpdGUiKSwKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIkJsYWNrIiksCi0JCQlidW5kbGUuZ2V0U3RyaW5nKCJSZWQiKSwKLQkJCWJ1bmRsZS5nZXRTdHJpbmcoIkdyZWVuIiksCi0JCQlidW5kbGUuZ2V0U3RyaW5nKCJCbHVlIil9KTsKLQkJYmFja2dyb3VuZENvbWJvLnNlbGVjdChiYWNrZ3JvdW5kQ29tYm8uaW5kZXhPZihidW5kbGUuZ2V0U3RyaW5nKCJXaGl0ZSIpKSk7Ci0JCWJhY2tncm91bmRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJY2hhbmdlQmFja2dyb3VuZCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIENvbWJvIHRvIGNoYW5nZSB0aGUgeCBzY2FsZS4KLQkJU3RyaW5nW10gdmFsdWVzID0gewotCQkJIjAuMSIsICIwLjIiLCAiMC4zIiwgIjAuNCIsICIwLjUiLCAiMC42IiwgIjAuNyIsICIwLjgiLCAiMC45IiwgIjEiLAotCQkJIjEuMSIsICIxLjIiLCAiMS4zIiwgIjEuNCIsICIxLjUiLCAiMS42IiwgIjEuNyIsICIxLjgiLCAiMS45IiwgIjIiLAotCQkJIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiLH07Ci0JCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlhfc2NhbGUiKSk7Ci0JCXNjYWxlWENvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuRFJPUF9ET1dOKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNjYWxlWENvbWJvLmFkZCh2YWx1ZXNbaV0pOwotCQl9Ci0JCXNjYWxlWENvbWJvLnNlbGVjdChzY2FsZVhDb21iby5pbmRleE9mKCIxIikpOwotCQlzY2FsZVhDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2NhbGVYKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gQ29tYm8gdG8gY2hhbmdlIHRoZSB5IHNjYWxlLgotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJZX3NjYWxlIikpOwotCQlzY2FsZVlDb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULkRST1BfRE9XTik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzY2FsZVlDb21iby5hZGQodmFsdWVzW2ldKTsKLQkJfQotCQlzY2FsZVlDb21iby5zZWxlY3Qoc2NhbGVZQ29tYm8uaW5kZXhPZigiMSIpKTsKLQkJc2NhbGVZQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjYWxlWSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIENvbWJvIHRvIGNoYW5nZSB0aGUgYWxwaGEgdmFsdWUuCi0JCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFscGhhX0siKSk7Ci0JCWFscGhhQ29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gMjU1OyBpICs9IDUpIHsKLQkJCWFscGhhQ29tYm8uYWRkKFN0cmluZy52YWx1ZU9mKGkpKTsKLQkJfQotCQlhbHBoYUNvbWJvLnNlbGVjdChhbHBoYUNvbWJvLmluZGV4T2YoIjI1NSIpKTsKLQkJYWxwaGFDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJYWxwaGEoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBDaGVjayBib3ggdG8gcmVxdWVzdCBpbmNyZW1lbnRhbCBkaXNwbGF5LgotCQlncm91cCA9IG5ldyBHcm91cChjb250cm9scywgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJZ3JvdXAuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJEaXNwbGF5IikpOwotCQlpbmNyZW1lbnRhbENoZWNrID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJaW5jcmVtZW50YWxDaGVjay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkluY3JlbWVudGFsIikpOwotCQlpbmNyZW1lbnRhbENoZWNrLnNldFNlbGVjdGlvbihpbmNyZW1lbnRhbCk7Ci0JCWluY3JlbWVudGFsQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWluY3JlbWVudGFsID0gKChCdXR0b24pZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ2hlY2sgYm94IHRvIHJlcXVlc3QgdHJhbnNwYXJlbnQgZGlzcGxheS4KLQkJdHJhbnNwYXJlbnRDaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXRyYW5zcGFyZW50Q2hlY2suc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJUcmFuc3BhcmVudCIpKTsKLQkJdHJhbnNwYXJlbnRDaGVjay5zZXRTZWxlY3Rpb24odHJhbnNwYXJlbnQpOwotCQl0cmFuc3BhcmVudENoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cmFuc3BhcmVudCA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBDaGVjayBib3ggdG8gcmVxdWVzdCBtYXNrIGRpc3BsYXkuCi0JCW1hc2tDaGVjayA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1hc2tDaGVjay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk1hc2siKSk7Ci0JCW1hc2tDaGVjay5zZXRTZWxlY3Rpb24oc2hvd01hc2spOwotCQltYXNrQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNob3dNYXNrID0gKChCdXR0b24pZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENoZWNrIGJveCB0byByZXF1ZXN0IGJhY2tncm91bmQgZGlzcGxheS4KLQkJYmFja2dyb3VuZENoZWNrID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJYmFja2dyb3VuZENoZWNrLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQmFja2dyb3VuZCIpKTsKLQkJYmFja2dyb3VuZENoZWNrLnNldFNlbGVjdGlvbihzaG93QmFja2dyb3VuZCk7Ci0JCWJhY2tncm91bmRDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2hvd0JhY2tncm91bmQgPSAoKEJ1dHRvbilldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQkvLyBHcm91cCB0aGUgYW5pbWF0aW9uIGJ1dHRvbnMuCi0JCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2xzLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCQlncm91cC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGlvbiIpKTsKLQotCQkvLyBQdXNoIGJ1dHRvbiB0byBkaXNwbGF5IHRoZSBwcmV2aW91cyBpbWFnZSBpbiBhIG11bHRpLWltYWdlIGZpbGUuCi0JCXByZXZpb3VzQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlwcmV2aW91c0J1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlByZXZpb3VzIikpOwotCQlwcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcHJldmlvdXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXByZXZpb3VzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIFB1c2ggYnV0dG9uIHRvIGRpc3BsYXkgdGhlIG5leHQgaW1hZ2UgaW4gYSBtdWx0aS1pbWFnZSBmaWxlLgotCQluZXh0QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQluZXh0QnV0dG9uLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiTmV4dCIpKTsKLQkJbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJbmV4dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV4dCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBQdXNoIGJ1dHRvbiB0byB0b2dnbGUgYW5pbWF0aW9uIG9mIGEgbXVsdGktaW1hZ2UgZmlsZS4KLQkJYW5pbWF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJYW5pbWF0ZUJ1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGUiKSk7Ci0JCWFuaW1hdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFuaW1hdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWFuaW1hdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2UgZmlsZSB0eXBlLgotCQl0eXBlTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJdHlwZUxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiVHlwZV9pbml0aWFsIikpOwotCQl0eXBlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gQ2FudmFzIHRvIHNob3cgdGhlIGltYWdlLgotCQlpbWFnZUNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5OT19SRURSQVdfUkVTSVpFIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKHdoaXRlQ29sb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxNTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJaW1hZ2VDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWltYWdlQ2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZUNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJCQkJZXZlbnQuZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBhaW50SW1hZ2UoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWltYWdlQ2FudmFzLmFkZE1vdXNlTW92ZUxpc3RlbmVyKG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJc2hvd0NvbG9yQXQoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBTZXQgdXAgdGhlIGltYWdlIGNhbnZhcyBzY3JvbGwgYmFycy4KLQkJU2Nyb2xsQmFyIGhvcml6b250YWwgPSBpbWFnZUNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCWhvcml6b250YWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJaG9yaXpvbnRhbC5zZXRNaW5pbXVtKDApOwotCQlob3Jpem9udGFsLnNldEVuYWJsZWQoZmFsc2UpOwotCQlob3Jpem9udGFsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY3JvbGxIb3Jpem9udGFsbHkoKFNjcm9sbEJhcilldmVudC53aWRnZXQpOwotCQkJfQotCQl9KTsKLQkJU2Nyb2xsQmFyIHZlcnRpY2FsID0gaW1hZ2VDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJdmVydGljYWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJdmVydGljYWwuc2V0TWluaW11bSgwKTsKLQkJdmVydGljYWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXZlcnRpY2FsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY3JvbGxWZXJ0aWNhbGx5KChTY3JvbGxCYXIpZXZlbnQud2lkZ2V0KTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2Ugc2l6ZS4KLQkJc2l6ZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXNpemVMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNpemVfaW5pdGlhbCIpKTsKLQkJc2l6ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIGRlcHRoLgotCQlkZXB0aExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRlcHRoTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJEZXB0aF9pbml0aWFsIikpOwotCQlkZXB0aExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIHRyYW5zcGFyZW50IHBpeGVsLgotCQl0cmFuc3BhcmVudFBpeGVsTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJdHJhbnNwYXJlbnRQaXhlbExhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiVHJhbnNwYXJlbnRfcGl4ZWxfaW5pdGlhbCIpKTsKLQkJdHJhbnNwYXJlbnRQaXhlbExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIHRpbWUgdG8gbG9hZC4KLQkJdGltZVRvTG9hZExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXRpbWVUb0xvYWRMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlRpbWVfdG9fbG9hZF9pbml0aWFsIikpOwotCQl0aW1lVG9Mb2FkTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gU2VwYXJhdGUgdGhlIGFuaW1hdGlvbiBmaWVsZHMgZnJvbSB0aGUgcmVzdCBvZiB0aGUgZmllbGRzLgotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBsb2dpY2FsIHNjcmVlbiBzaXplIGZvciBhbmltYXRpb24uCi0JCXNjcmVlblNpemVMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlzY3JlZW5TaXplTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRpb25fc2l6ZV9pbml0aWFsIikpOwotCQlzY3JlZW5TaXplTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgYmFja2dyb3VuZCBwaXhlbC4KLQkJYmFja2dyb3VuZFBpeGVsTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJYmFja2dyb3VuZFBpeGVsTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJCYWNrZ3JvdW5kX3BpeGVsX2luaXRpYWwiKSk7Ci0JCWJhY2tncm91bmRQaXhlbExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIExhYmVsIHRvIHNob3cgdGhlIGltYWdlIGxvY2F0aW9uICh4LCB5KS4KLQkJbG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxhYmVsLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiSW1hZ2VfbG9jYXRpb25faW5pdGlhbCIpKTsKLQkJbG9jYXRpb25MYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBpbWFnZSBkaXNwb3NhbCBtZXRob2QuCi0JCWRpc3Bvc2FsTWV0aG9kTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJZGlzcG9zYWxNZXRob2RMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkRpc3Bvc2FsX2luaXRpYWwiKSk7Ci0JCWRpc3Bvc2FsTWV0aG9kTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyB0aGUgaW1hZ2UgZGVsYXkgdGltZS4KLQkJZGVsYXlUaW1lTGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJZGVsYXlUaW1lTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJEZWxheV9pbml0aWFsIikpOwotCQlkZWxheVRpbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQkvLyBMYWJlbCB0byBzaG93IHRoZSBiYWNrZ3JvdW5kIHBpeGVsLgotCQlyZXBlYXRDb3VudExhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXJlcGVhdENvdW50TGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJSZXBlYXRzX2luaXRpYWwiKSk7Ci0JCXJlcGVhdENvdW50TGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gU2VwYXJhdGUgdGhlIGFuaW1hdGlvbiBmaWVsZHMgZnJvbSB0aGUgcGFsZXR0ZS4KLQkJc2VwYXJhdG9yID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gTGFiZWwgdG8gc2hvdyBpZiB0aGUgaW1hZ2UgaGFzIGEgZGlyZWN0IG9yIGluZGV4ZWQgcGFsZXR0ZS4KLQkJcGFsZXR0ZUxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXBhbGV0dGVMYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlBhbGV0dGVfaW5pdGlhbCIpKTsKLQkJcGFsZXR0ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCS8vIENhbnZhcyB0byBzaG93IHRoZSBpbWFnZSdzIHBhbGV0dGUuCi0JCXBhbGV0dGVDYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULk5PX1JFRFJBV19SRVNJWkUpOwotCQlwYWxldHRlQ2FudmFzLnNldEZvbnQoZml4ZWRXaWR0aEZvbnQpOwotCQlwYWxldHRlQ2FudmFzLmdldFZlcnRpY2FsQmFyKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJR0MgZ2MgPSBuZXcgR0MocGFsZXR0ZUxhYmVsKTsKLQkJcGFsZXR0ZVdpZHRoID0gZ2Muc3RyaW5nRXh0ZW50KGJ1bmRsZS5nZXRTdHJpbmcoIk1heF9sZW5ndGhfc3RyaW5nIikpLng7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gcGFsZXR0ZVdpZHRoOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTYgKiAxMTsgLy8gc2hvdyBhdCBsZWFzdCAxNiBjb2xvcnMKLQkJcGFsZXR0ZUNhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcGFsZXR0ZUNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcGFpbnRQYWxldHRlKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gU2V0IHVwIHRoZSBwYWxldHRlIGNhbnZhcyBzY3JvbGwgYmFyLgotCQl2ZXJ0aWNhbCA9IHBhbGV0dGVDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJdmVydGljYWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJdmVydGljYWwuc2V0TWluaW11bSgwKTsKLQkJdmVydGljYWwuc2V0SW5jcmVtZW50KDEwKTsKLQkJdmVydGljYWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXZlcnRpY2FsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzY3JvbGxQYWxldHRlKChTY3JvbGxCYXIpZXZlbnQud2lkZ2V0KTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gU2FzaCB0byBzZWUgbW9yZSBvZiBpbWFnZSBvciBpbWFnZSBkYXRhLgotCQlzYXNoID0gbmV3IFNhc2goc2hlbGwsIFNXVC5IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc2FzaC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJc2FzaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCAhPSBTV1QuRFJBRykgewotCQkJCQkoKEdyaWREYXRhKXBhbGV0dGVDYW52YXMuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gU1dULkRFRkFVTFQ7Ci0JCQkJCVJlY3RhbmdsZSBwYWxldHRlQ2FudmFzQm91bmRzID0gcGFsZXR0ZUNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJCQkJaW50IG1pblkgPSBwYWxldHRlQ2FudmFzQm91bmRzLnkgKyAyMDsKLQkJCQkJUmVjdGFuZ2xlIGRhdGFMYWJlbEJvdW5kcyA9IGRhdGFMYWJlbC5nZXRCb3VuZHMoKTsKLQkJCQkJaW50IG1heFkgPSBzdGF0dXNMYWJlbC5nZXRCb3VuZHMoKS55IC0gZGF0YUxhYmVsQm91bmRzLmhlaWdodCAtIDIwOwotCQkJCQlpZiAoZXZlbnQueSA+IG1pblkgJiYgZXZlbnQueSA8IG1heFkpIHsKLQkJCQkJCVJlY3RhbmdsZSBvbGRTYXNoID0gc2FzaC5nZXRCb3VuZHMoKTsKLQkJCQkJCXNhc2guc2V0Qm91bmRzKGV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQkJaW50IGRpZmYgPSBldmVudC55IC0gb2xkU2FzaC55OwotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlQ2FudmFzLmdldEJvdW5kcygpOwotCQkJCQkJaW1hZ2VDYW52YXMuc2V0Qm91bmRzKGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0ICsgZGlmZik7Ci0JCQkJCQlib3VuZHMgPSBwYWxldHRlQ2FudmFzQm91bmRzOwotCQkJCQkJcGFsZXR0ZUNhbnZhcy5zZXRCb3VuZHMoYm91bmRzLngsIGJvdW5kcy55LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQgKyBkaWZmKTsKLQkJCQkJCWJvdW5kcyA9IGRhdGFMYWJlbEJvdW5kczsKLQkJCQkJCWRhdGFMYWJlbC5zZXRCb3VuZHMoYm91bmRzLngsIGJvdW5kcy55ICsgZGlmZiwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCQkJCWJvdW5kcyA9IGRhdGFUZXh0LmdldEJvdW5kcygpOwotCQkJCQkJZGF0YVRleHQuc2V0Qm91bmRzKGJvdW5kcy54LCBib3VuZHMueSArIGRpZmYsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCAtIGRpZmYpOwotCQkJCQkJLy9zaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIExhYmVsIHRvIHNob3cgZGF0YS1zcGVjaWZpYyBmaWVsZHMuCi0JCWRhdGFMYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlkYXRhTGFiZWwuc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJQaXhlbF9kYXRhX2luaXRpYWwiKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGFMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCS8vIFRleHQgdG8gc2hvdyBhIGR1bXAgb2YgdGhlIGRhdGEuCi0JCWRhdGFUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJZGF0YVRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotCQlkYXRhVGV4dC5zZXRGb250KGZpeGVkV2lkdGhGb250KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTI4OwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWRhdGFUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlkYXRhVGV4dC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSAhPSBudWxsICYmIGV2ZW50LmJ1dHRvbiA9PSAxKSB7Ci0JCQkJCXNob3dDb2xvckZvckRhdGEoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlkYXRhVGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlzaG93Q29sb3JGb3JEYXRhKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCS8vIExhYmVsIHRvIHNob3cgc3RhdHVzIGFuZCBjdXJzb3IgbG9jYXRpb24gaW4gaW1hZ2UuCi0JCXN0YXR1c0xhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzdGF0dXNMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JTWVudSBjcmVhdGVNZW51QmFyKCkgewotCQkvLyBNZW51IGJhci4KLQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQljcmVhdGVGaWxlTWVudShtZW51QmFyKTsKLQkJY3JlYXRlQWxwaGFNZW51KG1lbnVCYXIpOwotCQlyZXR1cm4gbWVudUJhcjsKLQl9Ci0JCi0Jdm9pZCBjcmVhdGVGaWxlTWVudShNZW51IG1lbnVCYXIpIHsKLQkJLy8gRmlsZSBtZW51Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRmlsZSIpKTsKLQkJTWVudSBmaWxlTWVudSA9IG5ldyBNZW51KHNoZWxsLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRNZW51KGZpbGVNZW51KTsKLQotCQkvLyBGaWxlIC0+IE9wZW4gRmlsZS4uLgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJPcGVuRmlsZSIpKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdPJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVPcGVuRmlsZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIEZpbGUgLT4gT3BlbiBVUkwuLi4KLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiT3BlblVSTCIpKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdVJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVPcGVuVVJMKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gRmlsZSAtPiBSZW9wZW4KLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiUmVvcGVuIikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51UmVvcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQotCQkvLyBGaWxlIC0+IExvYWQgRmlsZS4uLiAobmF0aXZlbHkpCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRGaWxlIikpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ0wnKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUxvYWQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQkKLQkJLy8gRmlsZSAtPiBTYXZlCi0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmUiKSk7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnUycpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51U2F2ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIEZpbGUgLT4gU2F2ZSBBcy4uLgotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzIikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51U2F2ZUFzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gRmlsZSAtPiBTYXZlIE1hc2sgQXMuLi4KLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiU2F2ZV9tYXNrX2FzIikpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51U2F2ZU1hc2tBcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCQotCQkvLyBGaWxlIC0+IFByaW50Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlByaW50IikpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1AnKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVByaW50KCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuU0VQQVJBVE9SKTsKLQotCQkvLyBGaWxlIC0+IEV4aXQKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiRXhpdCIpKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JfQotCi0Jdm9pZCBjcmVhdGVBbHBoYU1lbnUoTWVudSBtZW51QmFyKSB7Ci0JCS8vIEFscGhhIG1lbnUKLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWl0ZW0uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJBbHBoYSIpKTsKLQkJTWVudSBhbHBoYU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0TWVudShhbHBoYU1lbnUpOwotCi0JCS8vIEFscGhhIC0+IEsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShhbHBoYU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJLIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVDb21wb3NlQWxwaGEoQUxQSEFfQ09OU1RBTlQpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBbHBoYSAtPiAoSyArIHgpICUgMjU2Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oYWxwaGFNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiKEsgKyB4KSAlIDI1NiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Q29tcG9zZUFscGhhKEFMUEhBX1gpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBbHBoYSAtPiAoSyArIHkpICUgMjU2Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oYWxwaGFNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiKEsgKyB5KSAlIDI1NiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Q29tcG9zZUFscGhhKEFMUEhBX1kpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQl2b2lkIG1lbnVDb21wb3NlQWxwaGEoaW50IGFscGhhX29wKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCWlmIChhbHBoYV9vcCA9PSBBTFBIQV9DT05TVEFOVCkgewotCQkJCWltYWdlRGF0YS5hbHBoYSA9IGFscGhhOwotCQkJfSBlbHNlIHsKLQkJCQlpbWFnZURhdGEuYWxwaGEgPSAtMTsKLQkJCQlzd2l0Y2ggKGFscGhhX29wKSB7Ci0JCQkJCWNhc2UgQUxQSEFfWDogCi0JCQkJCQlmb3IgKGludCB5ID0gMDsgeSA8IGltYWdlRGF0YS5oZWlnaHQ7IHkrKykgewotCQkJCQkJZm9yIChpbnQgeCA9IDA7IHggPCBpbWFnZURhdGEud2lkdGg7IHgrKykgewotCQkJCQkJCWltYWdlRGF0YS5zZXRBbHBoYSh4LCB5LCAoeCArIGFscGhhKSAlIDI1Nik7Ci0JCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBTFBIQV9ZOiAKLQkJCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgaW1hZ2VEYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQkJCQlmb3IgKGludCB4ID0gMDsgeCA8IGltYWdlRGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJCQkJaW1hZ2VEYXRhLnNldEFscGhhKHgsIHksICh5ICsgYWxwaGEpICUgMjU2KTsKLQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OiBicmVhazsKLQkJCQl9CQkJCQkKLQkJCX0JCQkKLQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGEpOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyogSnVzdCB1c2UgSW1hZ2UoZGV2aWNlLCBmaWxlbmFtZSkgdG8gbG9hZCBhbiBpbWFnZSBmaWxlLiAqLwotCXZvaWQgbWVudUxvYWQoKSB7Ci0JCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0JCQotCQkvLyBHZXQgdGhlIHVzZXIgdG8gY2hvb3NlIGFuIGltYWdlIGZpbGUuCi0JCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQlpZiAobGFzdFBhdGggIT0gbnVsbCkKLQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlclBhdGgobGFzdFBhdGgpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJFeHRlbnNpb25zKE9QRU5fRklMVEVSX0VYVEVOU0lPTlMpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhPUEVOX0ZJTFRFUl9OQU1FUyk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJbGFzdFBhdGggPSBmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJQYXRoKCk7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCS8vIFJlYWQgdGhlIG5ldyBpbWFnZSBmcm9tIHRoZSBjaG9zZW4gZmlsZS4KLQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlJbWFnZSBuZXdJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBmaWxlbmFtZSk7Ci0JCQlsb2FkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOyAvLyBkb24ndCBpbmNsdWRlIGdldEltYWdlRGF0YSBpbiBsb2FkIHRpbWUKLQkJCWltYWdlRGF0YSA9IG5ld0ltYWdlLmdldEltYWdlRGF0YSgpOwotCi0JCQkvLyBDYWNoZSB0aGUgZmlsZW5hbWUuCi0JCQljdXJyZW50TmFtZSA9IGZpbGVuYW1lOwotCQkJZmlsZU5hbWUgPSBmaWxlbmFtZTsKLQkJCQotCQkJLy8gRmlsbCBpbiBhcnJheSBhbmQgbG9hZGVyIGRhdGEuCi0JCQlsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCWltYWdlRGF0YUFycmF5ID0gbmV3IEltYWdlRGF0YVtdIHtpbWFnZURhdGF9OwotCQkJbG9hZGVyLmRhdGEgPSBpbWFnZURhdGFBcnJheTsKLQkJCQkKLQkJCS8vIERpc3BsYXkgdGhlIGltYWdlLgotCQkJaW1hZ2VEYXRhSW5kZXggPSAwOwotCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YSk7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiTG9hZGluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJMb2FkaW5nX2xjIiksIGZpbGVuYW1lLCBlKTsKLQkJfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiTG9hZGluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBtZW51T3BlbkZpbGUoKSB7Ci0JCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0JCQotCQkvLyBHZXQgdGhlIHVzZXIgdG8gY2hvb3NlIGFuIGltYWdlIGZpbGUuCi0JCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQlpZiAobGFzdFBhdGggIT0gbnVsbCkKLQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlclBhdGgobGFzdFBhdGgpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJFeHRlbnNpb25zKE9QRU5fRklMVEVSX0VYVEVOU0lPTlMpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhPUEVOX0ZJTFRFUl9OQU1FUyk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJbGFzdFBhdGggPSBmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJQYXRoKCk7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJSW1hZ2VMb2FkZXIgb2xkTG9hZGVyID0gbG9hZGVyOwotCQl0cnkgewotCQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQlpZiAoaW5jcmVtZW50YWwpIHsKLQkJCQkvLyBQcmVwYXJlIHRvIGhhbmRsZSBpbmNyZW1lbnRhbCBldmVudHMuCi0JCQkJbG9hZGVyLmFkZEltYWdlTG9hZGVyTGlzdGVuZXIobmV3IEltYWdlTG9hZGVyTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGltYWdlRGF0YUxvYWRlZChJbWFnZUxvYWRlckV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpbmNyZW1lbnRhbERhdGFMb2FkZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJaW5jcmVtZW50YWxUaHJlYWRTdGFydCgpOwotCQkJfQotCQkJLy8gUmVhZCB0aGUgbmV3IGltYWdlKHMpIGZyb20gdGhlIGNob3NlbiBmaWxlLgotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWltYWdlRGF0YUFycmF5ID0gbG9hZGVyLmxvYWQoZmlsZW5hbWUpOwotCQkJbG9hZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsKLQkJCWlmIChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQkJLy8gQ2FjaGUgdGhlIGZpbGVuYW1lLgotCQkJCWN1cnJlbnROYW1lID0gZmlsZW5hbWU7Ci0JCQkJZmlsZU5hbWUgPSBmaWxlbmFtZTsKLQkJCQkKLQkJCQkvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgaW1hZ2VzIGluIHRoZSBmaWxlICh0eXBpY2FsbHkgR0lGKQotCQkJCS8vIHRoZW4gZW5hYmxlIHRoZSBQcmV2aW91cywgTmV4dCBhbmQgQW5pbWF0ZSBidXR0b25zLgotCQkJCXByZXZpb3VzQnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSk7Ci0JCQkJbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpOwotCQkJCWFuaW1hdGVCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxICYmIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGggPiAwICYmIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0ID4gMCk7Ci0JCi0JCQkJLy8gRGlzcGxheSB0aGUgZmlyc3QgaW1hZ2UgaW4gdGhlIGZpbGUuCi0JCQkJaW1hZ2VEYXRhSW5kZXggPSAwOwotCQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQkJfQotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQkJbG9hZGVyID0gb2xkTG9hZGVyOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiTG9hZGluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCQlsb2FkZXIgPSBvbGRMb2FkZXI7Ci0JCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQkJbG9hZGVyID0gb2xkTG9hZGVyOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXZvaWQgbWVudU9wZW5VUkwoKSB7Ci0JCWFuaW1hdGUgPSBmYWxzZTsgLy8gc3RvcCBhbnkgYW5pbWF0aW9uIGluIHByb2dyZXNzCi0JCQotCQkvLyBHZXQgdGhlIHVzZXIgdG8gY2hvb3NlIGFuIGltYWdlIFVSTC4KLQkJVGV4dFByb21wdGVyIHRleHRQcm9tcHRlciA9IG5ldyBUZXh0UHJvbXB0ZXIoc2hlbGwsIFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5ESUFMT0dfVFJJTSk7Ci0JCXRleHRQcm9tcHRlci5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk9wZW5VUkxEaWFsb2ciKSk7Ci0JCXRleHRQcm9tcHRlci5zZXRNZXNzYWdlKGJ1bmRsZS5nZXRTdHJpbmcoIkVudGVyVVJMIikpOwotCQlTdHJpbmcgdXJsbmFtZSA9IHRleHRQcm9tcHRlci5vcGVuKCk7Ci0JCWlmICh1cmxuYW1lID09IG51bGwpIHJldHVybjsKLQotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCUltYWdlTG9hZGVyIG9sZExvYWRlciA9IGxvYWRlcjsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVybG5hbWUpOwotCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJaWYgKGluY3JlbWVudGFsKSB7Ci0JCQkJLy8gUHJlcGFyZSB0byBoYW5kbGUgaW5jcmVtZW50YWwgZXZlbnRzLgotCQkJCWxvYWRlci5hZGRJbWFnZUxvYWRlckxpc3RlbmVyKG5ldyBJbWFnZUxvYWRlckxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBpbWFnZURhdGFMb2FkZWQoSW1hZ2VMb2FkZXJFdmVudCBldmVudCkgewotCQkJCQkJaW5jcmVtZW50YWxEYXRhTG9hZGVkKGV2ZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWluY3JlbWVudGFsVGhyZWFkU3RhcnQoKTsKLQkJCX0KLQkJCS8vIFJlYWQgdGhlIG5ldyBpbWFnZShzKSBmcm9tIHRoZSBjaG9zZW4gVVJMLgotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWltYWdlRGF0YUFycmF5ID0gbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJCWlmIChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQkJY3VycmVudE5hbWUgPSB1cmxuYW1lOwotCQkJCWZpbGVOYW1lID0gbnVsbDsKLQkJCQkKLQkJCQkvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgaW1hZ2VzICh0eXBpY2FsbHkgR0lGKQotCQkJCS8vIHRoZW4gZW5hYmxlIHRoZSBQcmV2aW91cywgTmV4dCBhbmQgQW5pbWF0ZSBidXR0b25zLgotCQkJCXByZXZpb3VzQnV0dG9uLnNldEVuYWJsZWQoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSk7Ci0JCQkJbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpOwotCQkJCWFuaW1hdGVCdXR0b24uc2V0RW5hYmxlZChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxICYmIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGggPiAwICYmIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0ID4gMCk7Ci0JCi0JCQkJLy8gRGlzcGxheSB0aGUgZmlyc3QgaW1hZ2UuCi0JCQkJaW1hZ2VEYXRhSW5kZXggPSAwOwotCQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgdXJsbmFtZSwgZSk7Ci0JCQlsb2FkZXIgPSBvbGRMb2FkZXI7Ci0JCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIkxvYWRpbmdfbGMiKSwgdXJsbmFtZSwgZSk7Ci0JCQlsb2FkZXIgPSBvbGRMb2FkZXI7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGVsbC5zZXRDdXJzb3IobnVsbCk7Ci0JCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3IoY3Jvc3NDdXJzb3IpOwotCQkJd2FpdEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENhbGxlZCB0byBzdGFydCBhIHRocmVhZCB0aGF0IGRyYXdzIGluY3JlbWVudGFsIGltYWdlcwotCSAqIGFzIHRoZXkgYXJlIGxvYWRlZC4KLQkgKi8KLQl2b2lkIGluY3JlbWVudGFsVGhyZWFkU3RhcnQoKSB7Ci0JCWluY3JlbWVudGFsRXZlbnRzID0gbmV3IFZlY3RvcigpOwotCQlpbmNyZW1lbnRhbFRocmVhZCA9IG5ldyBUaHJlYWQoIkluY3JlbWVudGFsIikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIERyYXcgdGhlIGZpcnN0IEltYWdlRGF0YSBpbmNyZW1lbnQuCi0JCQkJd2hpbGUgKGluY3JlbWVudGFsRXZlbnRzICE9IG51bGwpIHsKLQkJCQkJLy8gU3luY2hyb25pemUgc28gd2UgZG9uJ3QgdHJ5IHRvIHJlbW92ZSB3aGVuIHRoZSB2ZWN0b3IgaXMgbnVsbC4KLQkJCQkJc3luY2hyb25pemVkIChJbWFnZUFuYWx5emVyLnRoaXMpIHsKLQkJCQkJCWlmIChpbmNyZW1lbnRhbEV2ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKGluY3JlbWVudGFsRXZlbnRzLnNpemUoKSA+IDApIHsKLQkJCQkJCQkJSW1hZ2VMb2FkZXJFdmVudCBldmVudCA9IChJbWFnZUxvYWRlckV2ZW50KSBpbmNyZW1lbnRhbEV2ZW50cy5yZW1vdmUoMCk7Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGV2ZW50LmltYWdlRGF0YSk7Ci0JCQkJCQkJCWltYWdlRGF0YSA9IGV2ZW50LmltYWdlRGF0YTsKLQkJCQkJCQkJaW1hZ2VDYW52YXNHQy5kcmF3SW1hZ2UoCi0JCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl5aWVsZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlkaXNwbGF5Lndha2UoKTsKLQkJCX0KLQkJfTsKLQkJaW5jcmVtZW50YWxUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQlpbmNyZW1lbnRhbFRocmVhZC5zdGFydCgpOwotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIGluY3JlbWVudGFsIGltYWdlIGRhdGEgaGFzIGJlZW4gbG9hZGVkLAotCSAqIGZvciBleGFtcGxlLCBmb3IgaW50ZXJsYWNlZCBHSUYvUE5HIG9yIHByb2dyZXNzaXZlIEpQRUcuCi0JICovCi0Jdm9pZCBpbmNyZW1lbnRhbERhdGFMb2FkZWQoSW1hZ2VMb2FkZXJFdmVudCBldmVudCkgewotCQkvLyBTeW5jaHJvbml6ZSBzbyB0aGF0IHdlIGRvIG5vdCB0cnkgdG8gYWRkIHdoaWxlCi0JCS8vIHRoZSBpbmNyZW1lbnRhbCBkcmF3aW5nIHRocmVhZCBpcyByZW1vdmluZy4KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpbmNyZW1lbnRhbEV2ZW50cy5hZGRFbGVtZW50KGV2ZW50KTsKLQkJfQotCX0KLQkKLQl2b2lkIG1lbnVTYXZlKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCi0JCS8vIElmIHRoZSBpbWFnZSBmaWxlIHR5cGUgaXMgdW5rbm93biwgd2UgY2FuJ3QgJ1NhdmUnLAotCQkvLyBzbyB3ZSBoYXZlIHRvIHVzZSAnU2F2ZSBBcy4uLicuCi0JCWlmIChpbWFnZURhdGEudHlwZSA9PSBTV1QuSU1BR0VfVU5ERUZJTkVEIHx8IGZpbGVOYW1lID09IG51bGwpIHsKLQkJCW1lbnVTYXZlQXMoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCS8vIFNhdmUgdGhlIGN1cnJlbnQgaW1hZ2UgdG8gdGhlIGN1cnJlbnQgZmlsZS4KLQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHtpbWFnZURhdGF9OwotCQkJbG9hZGVyLnNhdmUoZmlsZU5hbWUsIGltYWdlRGF0YS50eXBlKTsKLQkJCQotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmluZ19sYyIpLCBmaWxlTmFtZSwgZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZU5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51U2F2ZUFzKCkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCi0JCS8vIEdldCB0aGUgdXNlciB0byBjaG9vc2UgYSBmaWxlIG5hbWUgYW5kIHR5cGUgdG8gc2F2ZS4KLQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuU0FWRSk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlclBhdGgobGFzdFBhdGgpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSBmaWxlTmFtZTsKLQkJCWludCBuYW1lU3RhcnQgPSBuYW1lLmxhc3RJbmRleE9mKGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCWlmIChuYW1lU3RhcnQgPiAtMSkgewotCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lU3RhcnQgKyAxKTsKLQkJCX0KLQkJCWZpbGVDaG9vc2VyLnNldEZpbGVOYW1lKG5hbWUpOwotCQl9Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoU0FWRV9GSUxURVJfRVhURU5TSU9OUyk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKFNBVkVfRklMVEVSX05BTUVTKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZUNob29zZXIub3BlbigpOwotCQlsYXN0UGF0aCA9IGZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKTsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gRmlndXJlIG91dCB3aGF0IGZpbGUgdHlwZSB0aGUgdXNlciB3YW50cyBzYXZlZC4KLQkJaW50IGZpbGV0eXBlID0gZmlsZUNob29zZXIuZ2V0RmlsdGVySW5kZXgoKTsKLQkJaWYgKGZpbGV0eXBlID09IC0xKSB7Ci0JCQkvKiBUaGUgcGxhdGZvcm0gZmlsZSBkaWFsb2cgZG9lcyBub3Qgc3VwcG9ydCB1c2VyLXNlbGVjdGFibGUgZmlsZSBmaWx0ZXJzLgotCQkJICogRGV0ZXJtaW5lIHRoZSBkZXNpcmVkIHR5cGUgYnkgbG9va2luZyBhdCB0aGUgZmlsZSBleHRlbnNpb24uIAotCQkJICovCi0JCQlmaWxldHlwZSA9IGRldGVybWluZUZpbGVUeXBlKGZpbGVuYW1lKTsKLQkJCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfVU5ERUZJTkVEKSB7Ci0JCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJCWJveC5zZXRNZXNzYWdlKGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJVbmtub3duX2V4dGVuc2lvbiIpLCAKLQkJCQkJZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKSkpOwotCQkJCWJveC5vcGVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmV3IGphdmEuaW8uRmlsZShmaWxlbmFtZSkuZXhpc3RzKCkpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1FVRVNUSU9OIHwgU1dULk9LIHwgU1dULkNBTkNFTCk7Ci0JCQlib3guc2V0TWVzc2FnZShjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiT3ZlcndyaXRlIiksIGZpbGVuYW1lKSk7Ci0JCQlpZiAoYm94Lm9wZW4oKSA9PSBTV1QuQ0FOQ0VMKQotCQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ3Vyc29yIHdhaXRDdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JCXNoZWxsLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQl0cnkgewotCQkJLy8gU2F2ZSB0aGUgY3VycmVudCBpbWFnZSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JCQlib29sZWFuIG11bHRpID0gZmFsc2U7Ci0JCQlpZiAobG9hZGVyLmRhdGEubGVuZ3RoID4gMSkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX1FVRVNUSU9OIHwgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQkJCWJveC5zZXRNZXNzYWdlKGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FsbCIpLCBuZXcgSW50ZWdlcihsb2FkZXIuZGF0YS5sZW5ndGgpKSk7Ci0JCQkJaW50IHJlc3VsdCA9IGJveC5vcGVuKCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBTV1QuQ0FOQ0VMKSByZXR1cm47Ci0JCQkJaWYgKHJlc3VsdCA9PSBTV1QuWUVTKSBtdWx0aSA9IHRydWU7Ci0JCQl9Ci0JCQkvKiBJZiB0aGUgaW1hZ2UgaGFzIHRyYW5zcGFyZW5jeSBidXQgdGhlIHVzZXIgaGFzIHRyYW5zcGFyZW5jeSB0dXJuZWQgb2ZmLAotCQkJICogdHVybiBpdCBvZmYgaW4gdGhlIHNhdmVkIGltYWdlLiAqLwotCQkJaW50IHRyYW5zcGFyZW50UGl4ZWwgPSBpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbDsKLQkJCWlmICghbXVsdGkgJiYgdHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCQkJfQotCQkJCi0JCQlpZiAoIW11bHRpKSBsb2FkZXIuZGF0YSA9IG5ldyBJbWFnZURhdGFbXSB7aW1hZ2VEYXRhfTsKLQkJCWxvYWRlci5zYXZlKGZpbGVuYW1lLCBmaWxldHlwZSk7Ci0JCQkKLQkJCS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzIHRyYW5zcGFyZW5jeSBzZXR0aW5nLiAqLwotCQkJaWYgKCFtdWx0aSAmJiB0cmFuc3BhcmVudFBpeGVsICE9IC0xICYmICF0cmFuc3BhcmVudCkgewotCQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gdHJhbnNwYXJlbnRQaXhlbDsKLQkJCX0KLQotCQkJLy8gVXBkYXRlIHRoZSBzaGVsbCB0aXRsZSBhbmQgZmlsZSB0eXBlIGxhYmVsLAotCQkJLy8gYW5kIHVzZSB0aGUgbmV3IGZpbGUuCi0JCQlmaWxlTmFtZSA9IGZpbGVuYW1lOwotCQkJc2hlbGwuc2V0VGV4dChjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQW5hbHl6ZXJfb24iKSwgZmlsZW5hbWUpKTsKLQkJCXR5cGVMYWJlbC5zZXRUZXh0KGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUeXBlX3N0cmluZyIpLCBmaWxlVHlwZVN0cmluZyhmaWxldHlwZSkpKTsKLQotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51U2F2ZU1hc2tBcygpIHsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgIXNob3dNYXNrKSByZXR1cm47Ci0JCWlmIChpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpID09IFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCi0JCS8vIEdldCB0aGUgdXNlciB0byBjaG9vc2UgYSBmaWxlIG5hbWUgYW5kIHR5cGUgdG8gc2F2ZS4KLQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuU0FWRSk7Ci0JCWZpbGVDaG9vc2VyLnNldEZpbHRlclBhdGgobGFzdFBhdGgpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgZmlsZUNob29zZXIuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJFeHRlbnNpb25zKFNBVkVfRklMVEVSX0VYVEVOU0lPTlMpOwotCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhTQVZFX0ZJTFRFUl9OQU1FUyk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJbGFzdFBhdGggPSBmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJQYXRoKCk7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEZpZ3VyZSBvdXQgd2hhdCBmaWxlIHR5cGUgdGhlIHVzZXIgd2FudHMgc2F2ZWQuCi0JCWludCBmaWxldHlwZSA9IGZpbGVDaG9vc2VyLmdldEZpbHRlckluZGV4KCk7Ci0JCWlmIChmaWxldHlwZSA9PSAtMSkgewotCQkJLyogVGhlIHBsYXRmb3JtIGZpbGUgZGlhbG9nIGRvZXMgbm90IHN1cHBvcnQgdXNlci1zZWxlY3RhYmxlIGZpbGUgZmlsdGVycy4KLQkJCSAqIERldGVybWluZSB0aGUgZGVzaXJlZCB0eXBlIGJ5IGxvb2tpbmcgYXQgdGhlIGZpbGUgZXh0ZW5zaW9uLiAKLQkJCSAqLwotCQkJZmlsZXR5cGUgPSBkZXRlcm1pbmVGaWxlVHlwZShmaWxlbmFtZSk7Ci0JCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX1VOREVGSU5FRCkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCQlib3guc2V0TWVzc2FnZShjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiVW5rbm93bl9leHRlbnNpb24iKSwgCi0JCQkJCWZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpICsgMSkpKTsKLQkJCQlib3gub3BlbigpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5ldyBqYXZhLmlvLkZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9RVUVTVElPTiB8IFNXVC5PSyB8IFNXVC5DQU5DRUwpOwotCQkJYm94LnNldE1lc3NhZ2UoY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk92ZXJ3cml0ZSIpLCBmaWxlbmFtZSkpOwotCQkJaWYgKGJveC5vcGVuKCkgPT0gU1dULkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUN1cnNvciB3YWl0Q3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCWltYWdlQ2FudmFzLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQkJdHJ5IHsKLQkJCS8vIFNhdmUgdGhlIG1hc2sgb2YgdGhlIGN1cnJlbnQgaW1hZ2UgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgotCQkJSW1hZ2VEYXRhIG1hc2tJbWFnZURhdGEgPSBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10ge21hc2tJbWFnZURhdGF9OwotCQkJbG9hZGVyLnNhdmUoZmlsZW5hbWUsIGZpbGV0eXBlKTsKLQkJCQotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJc2hvd0Vycm9yRGlhbG9nKGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmluZ19sYyIpLCBmaWxlbmFtZSwgZSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJTYXZpbmdfbGMiKSwgZmlsZW5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJaW1hZ2VDYW52YXMuc2V0Q3Vyc29yKGNyb3NzQ3Vyc29yKTsKLQkJCXdhaXRDdXJzb3IuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51UHJpbnQoKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCS8vIEFzayB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBwcmludGVyLgotCQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlQcmludGVyRGF0YSBwcmludGVyRGF0YSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocHJpbnRlckRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQkJCi0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihwcmludGVyRGF0YSk7Ci0JCQlQb2ludCBzY3JlZW5EUEkgPSBkaXNwbGF5LmdldERQSSgpOwotCQkJUG9pbnQgcHJpbnRlckRQSSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCQlpbnQgc2NhbGVGYWN0b3IgPSBwcmludGVyRFBJLnggLyBzY3JlZW5EUEkueDsKLQkJCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJCWlmIChwcmludGVyLnN0YXJ0Sm9iKGN1cnJlbnROYW1lKSkgewotCQkJCWlmIChwcmludGVyLnN0YXJ0UGFnZSgpKSB7Ci0JCQkJCUdDIGdjID0gbmV3IEdDKHByaW50ZXIpOwotCQkJCQlpbnQgdHJhbnNwYXJlbnRQaXhlbCA9IGltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsOwotCQkJCQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gLTE7Ci0JCQkJCX0KLQkJCQkJSW1hZ2UgcHJpbnRlckltYWdlID0gbmV3IEltYWdlKHByaW50ZXIsIGltYWdlRGF0YSk7Ci0JCQkJCWdjLmRyYXdJbWFnZSgKLQkJCQkJCXByaW50ZXJJbWFnZSwKLQkJCQkJCTAsCi0JCQkJCQkwLAotCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCS10cmltLngsCi0JCQkJCQktdHJpbS55LAotCQkJCQkJc2NhbGVGYWN0b3IgKiBpbWFnZURhdGEud2lkdGgsCi0JCQkJCQlzY2FsZUZhY3RvciAqIGltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSAmJiAhdHJhbnNwYXJlbnQpIHsKLQkJCQkJCWltYWdlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gdHJhbnNwYXJlbnRQaXhlbDsKLQkJCQkJfQotCQkJCQlwcmludGVySW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQkJCX0KLQkJCQlwcmludGVyLmVuZEpvYigpOwotCQkJfQotCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCWJveC5zZXRNZXNzYWdlKGJ1bmRsZS5nZXRTdHJpbmcoIlByaW50aW5nX2Vycm9yIikgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlib3gub3BlbigpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51UmVvcGVuKCkgewotCQlpZiAoY3VycmVudE5hbWUgPT0gbnVsbCkgcmV0dXJuOwotCQlhbmltYXRlID0gZmFsc2U7IC8vIHN0b3AgYW55IGFuaW1hdGlvbiBpbiBwcm9ncmVzcwotCQlDdXJzb3Igd2FpdEN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCQlpbWFnZUNhbnZhcy5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJCUltYWdlRGF0YVtdIG5ld0ltYWdlRGF0YTsKLQkJCWlmIChmaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9IG5ldyBVUkwoY3VycmVudE5hbWUpOwotCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQluZXdJbWFnZURhdGEgPSBsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJbmV3SW1hZ2VEYXRhID0gbG9hZGVyLmxvYWQoZmlsZU5hbWUpOwotCQkJCWxvYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7Ci0JCQl9Ci0JCQlpbWFnZURhdGFJbmRleCA9IDA7Ci0JCQlkaXNwbGF5SW1hZ2UobmV3SW1hZ2VEYXRhW2ltYWdlRGF0YUluZGV4XSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJSZWxvYWRpbmdfbGMiKSwgY3VycmVudE5hbWUsIGUpOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCXNob3dFcnJvckRpYWxvZyhidW5kbGUuZ2V0U3RyaW5nKCJSZWxvYWRpbmdfbGMiKSwgY3VycmVudE5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewkKLQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCWltYWdlQ2FudmFzLnNldEN1cnNvcihjcm9zc0N1cnNvcik7Ci0JCQl3YWl0Q3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIGNoYW5nZUJhY2tncm91bmQoKSB7Ci0JCVN0cmluZyBiYWNrZ3JvdW5kID0gYmFja2dyb3VuZENvbWJvLmdldFRleHQoKTsKLQkJaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIldoaXRlIikpKSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKHdoaXRlQ29sb3IpOwotCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIkJsYWNrIikpKSB7Ci0JCQlpbWFnZUNhbnZhcy5zZXRCYWNrZ3JvdW5kKGJsYWNrQ29sb3IpOwotCQl9IGVsc2UgaWYgKGJhY2tncm91bmQuZXF1YWxzKGJ1bmRsZS5nZXRTdHJpbmcoIlJlZCIpKSkgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChyZWRDb2xvcik7Ci0JCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5lcXVhbHMoYnVuZGxlLmdldFN0cmluZygiR3JlZW4iKSkpIHsKLQkJCWltYWdlQ2FudmFzLnNldEJhY2tncm91bmQoZ3JlZW5Db2xvcik7Ci0JCX0gZWxzZSBpZiAoYmFja2dyb3VuZC5lcXVhbHMoYnVuZGxlLmdldFN0cmluZygiQmx1ZSIpKSkgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChibHVlQ29sb3IpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VDYW52YXMuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIHRoZSBTY2FsZVggY29tYm8gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0Jdm9pZCBzY2FsZVgoKSB7Ci0JCXRyeSB7Ci0JCQl4c2NhbGUgPSBGbG9hdC5wYXJzZUZsb2F0KHNjYWxlWENvbWJvLmdldFRleHQoKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl4c2NhbGUgPSAxOwotCQkJc2NhbGVYQ29tYm8uc2VsZWN0KHNjYWxlWENvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCX0KLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCXJlc2l6ZVNjcm9sbEJhcnMoKTsKLQkJCWltYWdlQ2FudmFzLnJlZHJhdygpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIFNjYWxlWSBjb21ibyBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKi8KLQl2b2lkIHNjYWxlWSgpIHsKLQkJdHJ5IHsKLQkJCXlzY2FsZSA9IEZsb2F0LnBhcnNlRmxvYXQoc2NhbGVZQ29tYm8uZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXlzY2FsZSA9IDE7Ci0JCQlzY2FsZVlDb21iby5zZWxlY3Qoc2NhbGVZQ29tYm8uaW5kZXhPZigiMSIpKTsKLQkJfQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJcmVzaXplU2Nyb2xsQmFycygpOwotCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgQWxwaGEgY29tYm8gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0Jdm9pZCBhbHBoYSgpIHsKLQkJdHJ5IHsKLQkJCWFscGhhID0gSW50ZWdlci5wYXJzZUludChhbHBoYUNvbWJvLmdldFRleHQoKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlhbHBoYUNvbWJvLnNlbGVjdChhbHBoYUNvbWJvLmluZGV4T2YoIjI1NSIpKTsKLQkJCWFscGhhID0gMjU1OwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIG1vdXNlIG1vdmVzIGluIHRoZSBpbWFnZSBjYW52YXMuCi0JICogU2hvdyB0aGUgY29sb3Igb2YgdGhlIGltYWdlIGF0IHRoZSBwb2ludCB1bmRlciB0aGUgbW91c2UuCi0JICovCi0Jdm9pZCBzaG93Q29sb3JBdChpbnQgbXgsIGludCBteSkgewotCQlpbnQgeCA9IG14IC0gaW1hZ2VEYXRhLnggLSBpeDsKLQkJaW50IHkgPSBteSAtIGltYWdlRGF0YS55IC0gaXk7Ci0JCXNob3dDb2xvckZvclBpeGVsKHgsIHkpOwotCX0KLQkKLQkvKgotCSAqIENhbGxlZCB3aGVuIGEgbW91c2UgZG93biBvciBrZXkgcHJlc3MgaXMgZGV0ZWN0ZWQKLQkgKiBpbiB0aGUgZGF0YSB0ZXh0LiBTaG93IHRoZSBjb2xvciBvZiB0aGUgcGl4ZWwgYXQKLQkgKiB0aGUgY2FyZXQgcG9zaXRpb24gaW4gdGhlIGRhdGEgdGV4dC4KLQkgKi8KLQl2b2lkIHNob3dDb2xvckZvckRhdGEoKSB7Ci0JCWludCBkZWxpbWl0ZXJMZW5ndGggPSBkYXRhVGV4dC5nZXRMaW5lRGVsaW1pdGVyKCkubGVuZ3RoKCk7Ci0JCWludCBjaGFyYWN0ZXJzUGVyTGluZSA9IDYgKyAzICogaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSArIGRlbGltaXRlckxlbmd0aDsKLQkJaW50IHBvc2l0aW9uID0gZGF0YVRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJaW50IHkgPSBwb3NpdGlvbiAvIGNoYXJhY3RlcnNQZXJMaW5lOwotCQlpZiAoKHBvc2l0aW9uIC0geSAqIGNoYXJhY3RlcnNQZXJMaW5lKSA8IDYgfHwgKCh5ICsgMSkgKiBjaGFyYWN0ZXJzUGVyTGluZSAtIHBvc2l0aW9uKSA8PSBkZWxpbWl0ZXJMZW5ndGgpIHsKLQkJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBkYXRhUG9zaXRpb24gPSBwb3NpdGlvbiAtIDYgKiAoeSArIDEpIC0gZGVsaW1pdGVyTGVuZ3RoICogeTsKLQkJaW50IGJ5dGVOdW1iZXIgPSBkYXRhUG9zaXRpb24gLyAzOwotCQlpbnQgd2hlcmUgPSBkYXRhUG9zaXRpb24gLSBieXRlTnVtYmVyICogMzsKLQkJaW50IHhCeXRlID0gYnl0ZU51bWJlciAlIGltYWdlRGF0YS5ieXRlc1BlckxpbmU7Ci0JCWludCB4ID0gLTE7Ci0JCWludCBkZXB0aCA9IGltYWdlRGF0YS5kZXB0aDsKLQkJaWYgKGRlcHRoID09IDEpIHsgLy8gOCBwaXhlbHMgcGVyIGJ5dGUgKGNhbiBvbmx5IHNob3cgMyBvZiA4KQotCQkJaWYgKHdoZXJlID09IDApIHggPSB4Qnl0ZSAqIDg7Ci0JCQlpZiAod2hlcmUgPT0gMSkgeCA9IHhCeXRlICogOCArIDM7Ci0JCQlpZiAod2hlcmUgPT0gMikgeCA9IHhCeXRlICogOCArIDc7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDIpIHsgLy8gNCBwaXhlbHMgcGVyIGJ5dGUgKGNhbiBvbmx5IHNob3cgMyBvZiA0KQotCQkJaWYgKHdoZXJlID09IDApIHggPSB4Qnl0ZSAqIDQ7Ci0JCQlpZiAod2hlcmUgPT0gMSkgeCA9IHhCeXRlICogNCArIDE7Ci0JCQlpZiAod2hlcmUgPT0gMikgeCA9IHhCeXRlICogNCArIDM7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDQpIHsgLy8gMiBwaXhlbHMgcGVyIGJ5dGUKLQkJCWlmICh3aGVyZSA9PSAwKSB4ID0geEJ5dGUgKiAyOwotCQkJaWYgKHdoZXJlID09IDEpIHggPSB4Qnl0ZSAqIDI7Ci0JCQlpZiAod2hlcmUgPT0gMikgeCA9IHhCeXRlICogMiArIDE7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDgpIHsgLy8gMSBieXRlIHBlciBwaXhlbAotCQkJeCA9IHhCeXRlOwotCQl9Ci0JCWlmIChkZXB0aCA9PSAxNikgeyAvLyAyIGJ5dGVzIHBlciBwaXhlbAotCQkJeCA9IHhCeXRlIC8gMjsKLQkJfQotCQlpZiAoZGVwdGggPT0gMjQpIHsgLy8gMyBieXRlcyBwZXIgcGl4ZWwKLQkJCXggPSB4Qnl0ZSAvIDM7Ci0JCX0KLQkJaWYgKGRlcHRoID09IDMyKSB7IC8vIDQgYnl0ZXMgcGVyIHBpeGVsCi0JCQl4ID0geEJ5dGUgLyA0OwotCQl9Ci0JCWlmICh4ICE9IC0xKSB7Ci0JCQlzaG93Q29sb3JGb3JQaXhlbCh4LCB5KTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOwotCQl9Ci0JfQotCQotCS8qCi0JICogU2V0IHRoZSBzdGF0dXMgbGFiZWwgdG8gc2hvdyBjb2xvciBpbmZvcm1hdGlvbgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoZSBpbWFnZS4KLQkgKi8KLQl2b2lkIHNob3dDb2xvckZvclBpeGVsKGludCB4LCBpbnQgeSkgewotCQlpZiAoeCA+PSAwICYmIHggPCBpbWFnZURhdGEud2lkdGggJiYgeSA+PSAwICYmIHkgPCBpbWFnZURhdGEuaGVpZ2h0KSB7Ci0JCQlpbnQgcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoeCwgeSk7Ci0JCQlSR0IgcmdiID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKHBpeGVsKTsKLQkJCWJvb2xlYW4gaGFzQWxwaGEgPSBmYWxzZTsKLQkJCWludCBhbHBoYVZhbHVlID0gMDsKLQkJCWlmIChpbWFnZURhdGEuYWxwaGFEYXRhICE9IG51bGwgJiYgaW1hZ2VEYXRhLmFscGhhRGF0YS5sZW5ndGggPiAwKSB7Ci0JCQkJaGFzQWxwaGEgPSB0cnVlOwotCQkJCWFscGhhVmFsdWUgPSBpbWFnZURhdGEuZ2V0QWxwaGEoeCwgeSk7Ci0JCQl9Ci0JCQlTdHJpbmcgcmdiTWVzc2FnZUZvcm1hdCA9IGJ1bmRsZS5nZXRTdHJpbmcoaGFzQWxwaGEgPyAiUkdCQSIgOiAiUkdCIik7Ci0JCQlPYmplY3RbXSByZ2JBcmdzID0gewotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHJnYi5yZWQpLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHJnYi5ncmVlbiksCi0JCQkJCUludGVnZXIudG9TdHJpbmcocmdiLmJsdWUpLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGFscGhhVmFsdWUpCi0JCQl9OwotCQkJT2JqZWN0W10gcmdiSGV4QXJncyA9IHsKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhyZ2IucmVkKSwKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhyZ2IuZ3JlZW4pLAotCQkJCQlJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5ibHVlKSwKLQkJCQkJSW50ZWdlci50b0hleFN0cmluZyhhbHBoYVZhbHVlKQotCQkJfTsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7Ci0JCQkJCW5ldyBJbnRlZ2VyKHgpLAotCQkJCQluZXcgSW50ZWdlcih5KSwKLQkJCQkJbmV3IEludGVnZXIocGl4ZWwpLAotCQkJCQlJbnRlZ2VyLnRvSGV4U3RyaW5nKHBpeGVsKSwKLQkJCQkJY3JlYXRlTXNnKHJnYk1lc3NhZ2VGb3JtYXQsIHJnYkFyZ3MpLAotCQkJCQljcmVhdGVNc2cocmdiTWVzc2FnZUZvcm1hdCwgcmdiSGV4QXJncyksCi0JCQkJCShwaXhlbCA9PSBpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCkgPyBidW5kbGUuZ2V0U3RyaW5nKCJDb2xvcl9hdF90cmFuc3BhcmVudCIpIDogIiJ9OwotCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQ29sb3JfYXQiKSwgYXJncykpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgQW5pbWF0ZSBidXR0b24gaXMgcHJlc3NlZC4KLQkgKi8KLQl2b2lkIGFuaW1hdGUoKSB7Ci0JCWFuaW1hdGUgPSAhYW5pbWF0ZTsKLQkJaWYgKGFuaW1hdGUgJiYgaW1hZ2UgIT0gbnVsbCAmJiBpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQlhbmltYXRlVGhyZWFkID0gbmV3IFRocmVhZChidW5kbGUuZ2V0U3RyaW5nKCJBbmltYXRpb24iKSkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gUHJlLWFuaW1hdGlvbiB3aWRnZXQgc2V0dXAuCi0JCQkJCXByZUFuaW1hdGlvbigpOwotCQkJCQkKLQkJCQkJLy8gQW5pbWF0ZS4KLQkJCQkJdHJ5IHsKLQkJCQkJCWFuaW1hdGVMb29wKCk7Ci0JCQkJCX0gY2F0Y2ggKGZpbmFsIFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXNob3dFcnJvckRpYWxvZyhjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQ3JlYXRpbmdfaW1hZ2UiKSwgCi0JCQkJCQkJCQkJICAgIG5ldyBJbnRlZ2VyKGltYWdlRGF0YUluZGV4KzEpKSwKLQkJCQkJCQkJCQkgICAgY3VycmVudE5hbWUsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBQb3N0IGFuaW1hdGlvbiB3aWRnZXQgcmVzZXQuCi0JCQkJCXBvc3RBbmltYXRpb24oKTsKLQkJCQl9Ci0JCQl9OwotCQkJYW5pbWF0ZVRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCQlhbmltYXRlVGhyZWFkLnN0YXJ0KCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBpbWFnZXMgaW4gYSBtdWx0aS1pbWFnZSBmaWxlCi0JICogYW5kIGRpc3BsYXkgdGhlbSBvbmUgYWZ0ZXIgYW5vdGhlci4KLQkgKi8KLQl2b2lkIGFuaW1hdGVMb29wKCkgewotCQkvLyBDcmVhdGUgYW4gb2ZmLXNjcmVlbiBpbWFnZSB0byBkcmF3IG9uLCBhbmQgYSBHQyB0byBkcmF3IHdpdGguCi0JCS8vIEJvdGggYXJlIGRpc3Bvc2VkIGFmdGVyIHRoZSBhbmltYXRpb24uCi0JCUltYWdlIG9mZlNjcmVlbkltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJR0Mgb2ZmU2NyZWVuSW1hZ2VHQyA9IG5ldyBHQyhvZmZTY3JlZW5JbWFnZSk7Ci0JCQotCQl0cnkgewotCQkJLy8gVXNlIHN5bmNFeGVjIHRvIGdldCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaW1hZ2VDYW52YXMuCi0JCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWNhbnZhc0JhY2tncm91bmQgPSBpbWFnZUNhbnZhcy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCS8vIEZpbGwgdGhlIG9mZi1zY3JlZW4gaW1hZ2Ugd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzLgotCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKGNhbnZhc0JhY2tncm91bmQpOwotCQkJb2ZmU2NyZWVuSW1hZ2VHQy5maWxsUmVjdGFuZ2xlKAotCQkJCTAsCi0JCQkJMCwKLQkJCQlsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLAotCQkJCWxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJCQkJCi0JCQkvLyBEcmF3IHRoZSBjdXJyZW50IGltYWdlIG9udG8gdGhlIG9mZi1zY3JlZW4gaW1hZ2UuCi0JCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQlpbWFnZSwKLQkJCQkwLAotCQkJCTAsCi0JCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJaW1hZ2VEYXRhLngsCi0JCQkJaW1hZ2VEYXRhLnksCi0JCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCi0JCQlpbnQgcmVwZWF0Q291bnQgPSBsb2FkZXIucmVwZWF0Q291bnQ7Ci0JCQl3aGlsZSAoYW5pbWF0ZSAmJiAobG9hZGVyLnJlcGVhdENvdW50ID09IDAgfHwgcmVwZWF0Q291bnQgPiAwKSkgewotCQkJCWlmIChpbWFnZURhdGEuZGlzcG9zYWxNZXRob2QgPT0gU1dULkRNX0ZJTExfQkFDS0dST1VORCkgewotCQkJCQkvLyBGaWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgYmVmb3JlIGRyYXdpbmcuCi0JCQkJCUNvbG9yIGJnQ29sb3IgPSBudWxsOwotCQkJCQlpbnQgYmFja2dyb3VuZFBpeGVsID0gbG9hZGVyLmJhY2tncm91bmRQaXhlbDsKLQkJCQkJaWYgKHNob3dCYWNrZ3JvdW5kICYmIGJhY2tncm91bmRQaXhlbCAhPSAtMSkgewotCQkJCQkJLy8gRmlsbCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgotCQkJCQkJUkdCIGJhY2tncm91bmRSR0IgPSBpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0IoYmFja2dyb3VuZFBpeGVsKTsKLQkJCQkJCWJnQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgYmFja2dyb3VuZFJHQik7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCW9mZlNjcmVlbkltYWdlR0Muc2V0QmFja2dyb3VuZChiZ0NvbG9yICE9IG51bGwgPyBiZ0NvbG9yIDogY2FudmFzQmFja2dyb3VuZCk7Ci0JCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmZpbGxSZWN0YW5nbGUoCi0JCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKGJnQ29sb3IgIT0gbnVsbCkgYmdDb2xvci5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCA9PSBTV1QuRE1fRklMTF9QUkVWSU9VUykgewotCQkJCQkvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyBpbWFnZSBiZWZvcmUgZHJhd2luZy4KLQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQlpbWFnZSwKLQkJCQkJCTAsCi0JCQkJCQkwLAotCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkvLyBHZXQgdGhlIG5leHQgaW1hZ2UgZGF0YS4KLQkJCQlpbWFnZURhdGFJbmRleCA9IChpbWFnZURhdGFJbmRleCArIDEpICUgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoOwotCQkJCWltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XTsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkKLQkJCQkvLyBEcmF3IHRoZSBuZXcgaW1hZ2UgZGF0YS4KLQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJaW1hZ2UsCi0JCQkJCTAsCi0JCQkJCTAsCi0JCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCWltYWdlRGF0YS55LAotCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQotCQkJCS8vIERyYXcgdGhlIG9mZi1zY3JlZW4gaW1hZ2UgdG8gdGhlIHNjcmVlbi4KLQkJCQlpbWFnZUNhbnZhc0dDLmRyYXdJbWFnZShvZmZTY3JlZW5JbWFnZSwgMCwgMCk7Ci0JCQkJCi0JCQkJLy8gU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgZGVsYXkgdGltZSBiZWZvcmUgZHJhd2luZyBhZ2Fpbi4KLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAodmlzaWJsZURlbGF5KGltYWdlRGF0YS5kZWxheVRpbWUgKiAxMCkpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gSWYgd2UgaGF2ZSBqdXN0IGRyYXduIHRoZSBsYXN0IGltYWdlIGluIHRoZSBzZXQsCi0JCQkJLy8gdGhlbiBkZWNyZW1lbnQgdGhlIHJlcGVhdCBjb3VudC4KLQkJCQlpZiAoaW1hZ2VEYXRhSW5kZXggPT0gaW1hZ2VEYXRhQXJyYXkubGVuZ3RoIC0gMSkgcmVwZWF0Q291bnQtLTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW9mZlNjcmVlbkltYWdlLmRpc3Bvc2UoKTsKLQkJCW9mZlNjcmVlbkltYWdlR0MuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQcmUgYW5pbWF0aW9uIHNldHVwLgotCSAqLwotCXZvaWQgcHJlQW5pbWF0aW9uKCkgewotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBDaGFuZ2UgdGhlIGxhYmVsIG9mIHRoZSBBbmltYXRlIGJ1dHRvbiB0byAnU3RvcCcuCi0JCQkJYW5pbWF0ZUJ1dHRvbi5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlN0b3AiKSk7Ci0JCQkJCi0JCQkJLy8gRGlzYWJsZSBhbnl0aGluZyB3ZSBkb24ndCB3YW50IHRoZSB1c2VyCi0JCQkJLy8gdG8gc2VsZWN0IGR1cmluZyB0aGUgYW5pbWF0aW9uLgotCQkJCXByZXZpb3VzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJYmFja2dyb3VuZENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXNjYWxlWENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXNjYWxlWUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWFscGhhQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaW5jcmVtZW50YWxDaGVjay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl0cmFuc3BhcmVudENoZWNrLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW1hc2tDaGVjay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkvLyBsZWF2ZSBiYWNrZ3JvdW5kQ2hlY2sgZW5hYmxlZAotCQkJCi0JCQkJLy8gUmVzZXQgdGhlIHNjYWxlIGNvbWJvcyBhbmQgc2Nyb2xsYmFycy4KLQkJCQlyZXNldFNjYWxlQ29tYm9zKCk7Ci0JCQkJcmVzZXRTY3JvbGxCYXJzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogUG9zdCBhbmltYXRpb24gcmVzZXQuCi0JICovCi0Jdm9pZCBwb3N0QW5pbWF0aW9uKCkgewotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBFbmFibGUgYW55dGhpbmcgd2UgZGlzYWJsZWQgYmVmb3JlIHRoZSBhbmltYXRpb24uCi0JCQkJcHJldmlvdXNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQluZXh0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJYmFja2dyb3VuZENvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJc2NhbGVYQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlzY2FsZVlDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCWFscGhhQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlpbmNyZW1lbnRhbENoZWNrLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJdHJhbnNwYXJlbnRDaGVjay5zZXRFbmFibGVkKHRydWUpOwotCQkJCW1hc2tDaGVjay5zZXRFbmFibGVkKHRydWUpOwotCQkJCi0JCQkJLy8gUmVzZXQgdGhlIGxhYmVsIG9mIHRoZSBBbmltYXRlIGJ1dHRvbi4KLQkJCQlhbmltYXRlQnV0dG9uLnNldFRleHQoYnVuZGxlLmdldFN0cmluZygiQW5pbWF0ZSIpKTsKLQkJCQotCQkJCWlmIChhbmltYXRlKSB7Ci0JCQkJCS8vIElmIGFuaW1hdGUgaXMgc3RpbGwgdHJ1ZSwgd2UgZmluaXNoZWQgdGhlCi0JCQkJCS8vIGZ1bGwgbnVtYmVyIG9mIHJlcGVhdHMuIExlYXZlIHRoZSBpbWFnZSBhcy1pcy4KLQkJCQkJYW5pbWF0ZSA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFJlZGlzcGxheSB0aGUgY3VycmVudCBpbWFnZSBhbmQgaXRzIHBhbGV0dGUuCi0JCQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgUHJldmlvdXMgYnV0dG9uIGlzIHByZXNzZWQuCi0JICogRGlzcGxheSB0aGUgcHJldmlvdXMgaW1hZ2UgaW4gYSBtdWx0aS1pbWFnZSBmaWxlLgotCSAqLwotCXZvaWQgcHJldmlvdXMoKSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsICYmIGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCWlmIChpbWFnZURhdGFJbmRleCA9PSAwKSB7Ci0JCQkJaW1hZ2VEYXRhSW5kZXggPSBpbWFnZURhdGFBcnJheS5sZW5ndGg7Ci0JCQl9Ci0JCQlpbWFnZURhdGFJbmRleCA9IGltYWdlRGF0YUluZGV4IC0gMTsKLQkJCWRpc3BsYXlJbWFnZShpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF0pOwotCQl9CQotCX0KLQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIE5leHQgYnV0dG9uIGlzIHByZXNzZWQuCi0JICogRGlzcGxheSB0aGUgbmV4dCBpbWFnZSBpbiBhIG11bHRpLWltYWdlIGZpbGUuCi0JICovCi0Jdm9pZCBuZXh0KCkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQlpbWFnZURhdGFJbmRleCA9IChpbWFnZURhdGFJbmRleCArIDEpICUgaW1hZ2VEYXRhQXJyYXkubGVuZ3RoOwotCQkJZGlzcGxheUltYWdlKGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XSk7Ci0JCX0JCi0JfQotCi0Jdm9pZCBkaXNwbGF5SW1hZ2UoSW1hZ2VEYXRhIG5ld0ltYWdlRGF0YSkgewotCQlyZXNldFNjYWxlQ29tYm9zKCk7Ci0JCWlmIChpbmNyZW1lbnRhbCAmJiBpbmNyZW1lbnRhbFRocmVhZCAhPSBudWxsKSB7Ci0JCQkvLyBUZWxsIHRoZSBpbmNyZW1lbnRhbCB0aHJlYWQgdG8gc3RvcCBkcmF3aW5nLgotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaW5jcmVtZW50YWxFdmVudHMgPSBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBXYWl0IHVudGlsIHRoZSBpbmNyZW1lbnRhbCB0aHJlYWQgaXMgZG9uZS4KLQkJCXdoaWxlIChpbmNyZW1lbnRhbFRocmVhZC5pc0FsaXZlKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCQkJCQkKLQkJLy8gRGlzcG9zZSBvZiB0aGUgb2xkIGltYWdlLCBpZiB0aGVyZSB3YXMgb25lLgotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBDYWNoZSB0aGUgbmV3IGltYWdlIGFuZCBpbWFnZURhdGEuCi0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBuZXdJbWFnZURhdGEpOwotCQkJaW1hZ2VEYXRhID0gbmV3SW1hZ2VEYXRhOwotCi0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93RXJyb3JEaWFsb2coYnVuZGxlLmdldFN0cmluZygiQ3JlYXRpbmdfZnJvbSIpICsgIiAiLCBjdXJyZW50TmFtZSwgZSk7Ci0JCQlpbWFnZSA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIHdpZGdldHMgd2l0aCB0aGUgbmV3IGltYWdlIGluZm8uCi0JCVN0cmluZyBzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiQW5hbHl6ZXJfb24iKSwgY3VycmVudE5hbWUpOwotCQlzaGVsbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJaWYgKGltYWdlRGF0YUFycmF5Lmxlbmd0aCA+IDEpIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUeXBlX2luZGV4IiksIAotCQkJICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ZmlsZVR5cGVTdHJpbmcoaW1hZ2VEYXRhLnR5cGUpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhSW5kZXggKyAxKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKGltYWdlRGF0YUFycmF5Lmxlbmd0aCl9KTsKLQkJfSBlbHNlIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUeXBlX3N0cmluZyIpLCBmaWxlVHlwZVN0cmluZyhpbWFnZURhdGEudHlwZSkpOwotCQl9Ci0JCXR5cGVMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIlNpemVfdmFsdWUiKSwgCi0JCQkJCSBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGltYWdlRGF0YS53aWR0aCksCi0JCQkJCQkJICAgbmV3IEludGVnZXIoaW1hZ2VEYXRhLmhlaWdodCl9KTsKLQkJc2l6ZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGVwdGhfdmFsdWUiKSwgbmV3IEludGVnZXIoaW1hZ2VEYXRhLmRlcHRoKSk7Ci0JCWRlcHRoTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJUcmFuc3BhcmVudF9waXhlbF92YWx1ZSIpLCBwaXhlbEluZm8oaW1hZ2VEYXRhLnRyYW5zcGFyZW50UGl4ZWwpKTsKLQkJdHJhbnNwYXJlbnRQaXhlbExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiVGltZV90b19sb2FkX3ZhbHVlIiksIG5ldyBMb25nKGxvYWRUaW1lKSk7Ci0JCXRpbWVUb0xvYWRMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkFuaW1hdGlvbl9zaXplX3ZhbHVlIiksIAotCQkgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoKSwKLQkJCQkJCQkJbmV3IEludGVnZXIobG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQpfSk7Ci0JCXNjcmVlblNpemVMYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmRfcGl4ZWxfdmFsdWUiKSwgcGl4ZWxJbmZvKGxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwpKTsKLQkJYmFja2dyb3VuZFBpeGVsTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJJbWFnZV9sb2NhdGlvbl92YWx1ZSIpLCAKLQkJICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW1hZ2VEYXRhLngpLCBuZXcgSW50ZWdlcihpbWFnZURhdGEueSl9KTsKLQkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KHN0cmluZyk7Ci0KLQkJc3RyaW5nID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkRpc3Bvc2FsX3ZhbHVlIiksCi0JCSAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCksCi0JCQkJCQkJICAgICAgZGlzcG9zYWxTdHJpbmcoaW1hZ2VEYXRhLmRpc3Bvc2FsTWV0aG9kKX0pOwotCQlkaXNwb3NhbE1ldGhvZExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlpbnQgZGVsYXkgPSBpbWFnZURhdGEuZGVsYXlUaW1lICogMTA7Ci0JCWludCBkZWxheVVzZWQgPSB2aXNpYmxlRGVsYXkoZGVsYXkpOwotCQlpZiAoZGVsYXkgIT0gZGVsYXlVc2VkKSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGVsYXlfdmFsdWUiKSwgCi0JCQkgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihkZWxheSksIG5ldyBJbnRlZ2VyKGRlbGF5VXNlZCl9KTsKLQkJfSBlbHNlIHsKLQkJCXN0cmluZyA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJEZWxheV91c2VkIiksIG5ldyBJbnRlZ2VyKGRlbGF5KSk7Ci0JCX0KLQkJZGVsYXlUaW1lTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCWlmIChsb2FkZXIucmVwZWF0Q291bnQgPT0gMCkgewotCQkJc3RyaW5nID0gY3JlYXRlTXNnKCBidW5kbGUuZ2V0U3RyaW5nKCJSZXBlYXRzX2ZvcmV2ZXIiKSwgbmV3IEludGVnZXIobG9hZGVyLnJlcGVhdENvdW50KSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiUmVwZWF0c192YWx1ZSIpLCBuZXcgSW50ZWdlcihsb2FkZXIucmVwZWF0Q291bnQpKTsKLQkJfQotCQlyZXBlYXRDb3VudExhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlpZiAoaW1hZ2VEYXRhLnBhbGV0dGUuaXNEaXJlY3QpIHsKLQkJCXN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoIlBhbGV0dGVfZGlyZWN0Iik7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJpbmcgPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiUGFsZXR0ZV92YWx1ZSIpLCBuZXcgSW50ZWdlcihpbWFnZURhdGEucGFsZXR0ZS5nZXRSR0JzKCkubGVuZ3RoKSk7Ci0JCX0KLQkJcGFsZXR0ZUxhYmVsLnNldFRleHQoc3RyaW5nKTsKLQotCQlzdHJpbmcgPSBjcmVhdGVNc2coCi0JCQkJYnVuZGxlLmdldFN0cmluZygiUGl4ZWxfZGF0YV92YWx1ZSIpLAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQluZXcgSW50ZWdlcihpbWFnZURhdGEuYnl0ZXNQZXJMaW5lKSwKLQkJCQkJCW5ldyBJbnRlZ2VyKGltYWdlRGF0YS5zY2FubGluZVBhZCksCi0JCQkJCQlkZXB0aEluZm8oaW1hZ2VEYXRhLmRlcHRoKSwKLQkJCQkJCShpbWFnZURhdGEuYWxwaGFEYXRhICE9IG51bGwgJiYgaW1hZ2VEYXRhLmFscGhhRGF0YS5sZW5ndGggPiAwKSA/Ci0JCQkJCQkJCWJ1bmRsZS5nZXRTdHJpbmcoIlNjcm9sbF9mb3JfYWxwaGEiKSA6ICIiIH0pOwotCQlkYXRhTGFiZWwuc2V0VGV4dChzdHJpbmcpOwotCi0JCVN0cmluZyBkYXRhID0gZGF0YUhleER1bXAoZGF0YVRleHQuZ2V0TGluZURlbGltaXRlcigpKTsKLQkJZGF0YVRleHQuc2V0VGV4dChkYXRhKTsKLQkJCi0JCS8vIGJvbGQgdGhlIGZpcnN0IGNvbHVtbiBhbGwgdGhlIHdheSBkb3duCi0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlKChpbmRleCA9IGRhdGEuaW5kZXhPZignOicsIGluZGV4KzEpKSAhPSAtMSkgewotCQkJaW50IHN0YXJ0ID0gaW5kZXggLSBJTkRFWF9ESUdJVFM7Ci0JCQlpbnQgbGVuZ3RoID0gSU5ERVhfRElHSVRTOwotCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihkYXRhLmNoYXJBdChpbmRleC0xKSkpIHsKLQkJCQlzdGFydCA9IGluZGV4IC0gQUxQSEFfQ0hBUlM7Ci0JCQkJbGVuZ3RoID0gQUxQSEFfQ0hBUlM7Ci0JCQl9Ci0JCQlkYXRhVGV4dC5zZXRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBsZW5ndGgsIGRhdGFUZXh0LmdldEZvcmVncm91bmQoKSwgZGF0YVRleHQuZ2V0QmFja2dyb3VuZCgpLCBTV1QuQk9MRCkpOwotCQl9Ci0KLQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7Ci0KLQkJLy8gUmVkcmF3IGJvdGggY2FudmFzZXMuCi0JCXJlc2V0U2Nyb2xsQmFycygpOwotCQlwYWxldHRlQ2FudmFzLnJlZHJhdygpOwotCQlpbWFnZUNhbnZhcy5yZWRyYXcoKTsKLQl9Ci0KLQl2b2lkIHBhaW50SW1hZ2UoUGFpbnRFdmVudCBldmVudCkgewotCQlHQyBnYyA9IGV2ZW50LmdjOwotCQlJbWFnZSBwYWludEltYWdlID0gaW1hZ2U7Ci0JCQotCQkvKiBJZiB0aGUgdXNlciB3YW50cyB0byBzZWUgdGhlIHRyYW5zcGFyZW50IHBpeGVsIGluIGl0cyBhY3R1YWwgY29sb3IsCi0JCSAqIHRoZW4gdGVtcG9yYXJpbHkgdHVybiBvZmYgdHJhbnNwYXJlbmN5LgotCQkgKi8KLQkJaW50IHRyYW5zcGFyZW50UGl4ZWwgPSBpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbDsKLQkJaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCQkJcGFpbnRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQl9Ci0JCQotCQkvKiBTY2FsZSB0aGUgaW1hZ2Ugd2hlbiBkcmF3aW5nLCB1c2luZyB0aGUgdXNlcidzIHNlbGVjdGVkIHNjYWxpbmcgZmFjdG9yLiAqLwotCQlpbnQgdyA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLndpZHRoICogeHNjYWxlKTsKLQkJaW50IGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS5oZWlnaHQgKiB5c2NhbGUpOwotCQkKLQkJLyogSWYgYW55IG9mIHRoZSBiYWNrZ3JvdW5kIGlzIHZpc2libGUsIGZpbGwgaXQgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvci4gKi8KLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlQ2FudmFzLmdldEJvdW5kcygpOwotCQlpZiAoaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSAhPSBTV1QuVFJBTlNQQVJFTkNZX05PTkUpIHsKLQkJCS8qIElmIHRoZXJlIGlzIGFueSB0cmFuc3BhcmVuY3kgYXQgYWxsLCBmaWxsIHRoZSB3aG9sZSBiYWNrZ3JvdW5kLiAqLwotCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQl9IGVsc2UgewotCQkJLyogT3RoZXJ3aXNlLCBqdXN0IGZpbGwgaW4gdGhlIGJhY2t3YXJkcyBMLiAqLwotCQkJaWYgKGl4ICsgdyA8IGJvdW5kcy53aWR0aCkgZ2MuZmlsbFJlY3RhbmdsZShpeCArIHcsIDAsIGJvdW5kcy53aWR0aCAtIChpeCArIHcpLCBib3VuZHMuaGVpZ2h0KTsKLQkJCWlmIChpeSArIGggPCBib3VuZHMuaGVpZ2h0KSBnYy5maWxsUmVjdGFuZ2xlKDAsIGl5ICsgaCwgaXggKyB3LCBib3VuZHMuaGVpZ2h0IC0gKGl5ICsgaCkpOwotCQl9Ci0JCQotCQkvKiBEcmF3IHRoZSBpbWFnZSAqLwotCQlnYy5kcmF3SW1hZ2UoCi0JCQlwYWludEltYWdlLAotCQkJMCwKLQkJCTAsCi0JCQlpbWFnZURhdGEud2lkdGgsCi0JCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJaXggKyBpbWFnZURhdGEueCwKLQkJCWl5ICsgaW1hZ2VEYXRhLnksCi0JCQl3LAotCQkJaCk7Ci0JCQotCQkvKiBJZiB0aGVyZSBpcyBhIG1hc2sgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHNlZSBpdCwgZHJhdyBpdC4gKi8KLQkJaWYgKHNob3dNYXNrICYmIChpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpICE9IFNXVC5UUkFOU1BBUkVOQ1lfTk9ORSkpIHsKLQkJCUltYWdlRGF0YSBtYXNrSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCUltYWdlIG1hc2tJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBtYXNrSW1hZ2VEYXRhKTsKLQkJCWdjLmRyYXdJbWFnZSgKLQkJCQltYXNrSW1hZ2UsCi0JCQkJMCwKLQkJCQkwLAotCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCXcgKyAxMCArIGl4ICsgaW1hZ2VEYXRhLngsCi0JCQkJaXkgKyBpbWFnZURhdGEueSwKLQkJCQl3LAotCQkJCWgpOwotCQkJbWFza0ltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJLyogSWYgdHJhbnNwYXJlbmN5IHdhcyB0ZW1wb3JhcmlseSBkaXNhYmxlZCwgcmVzdG9yZSBpdC4gKi8KLQkJaWYgKHRyYW5zcGFyZW50UGl4ZWwgIT0gLTEgJiYgIXRyYW5zcGFyZW50KSB7Ci0JCQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHRyYW5zcGFyZW50UGl4ZWw7Ci0JCQlwYWludEltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXZvaWQgcGFpbnRQYWxldHRlKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJZ2MuZmlsbFJlY3RhbmdsZShwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKSk7Ci0JCWlmIChpbWFnZURhdGEucGFsZXR0ZS5pc0RpcmVjdCkgewotCQkJLy8gRm9yIGEgZGlyZWN0IHBhbGV0dGUsIGRpc3BsYXkgdGhlIG1hc2tzLgotCQkJaW50IHkgPSBweSArIDEwOwotCQkJaW50IHhUYWIgPSA1MDsKLQkJCWdjLmRyYXdTdHJpbmcoInJNc2siLCAxMCwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRvSGV4NEJ5dGVTdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUucmVkTWFzayksIHhUYWIsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZygiZ01zayIsIDEwLCB5Kz0xMiwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRvSGV4NEJ5dGVTdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUuZ3JlZW5NYXNrKSwgeFRhYiwgeSwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJiTXNrIiwgMTAsIHkrPTEyLCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcodG9IZXg0Qnl0ZVN0cmluZyhpbWFnZURhdGEucGFsZXR0ZS5ibHVlTWFzayksIHhUYWIsIHksIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZygiclNoZiIsIDEwLCB5Kz0xMiwgdHJ1ZSk7Ci0JCQlnYy5kcmF3U3RyaW5nKEludGVnZXIudG9TdHJpbmcoaW1hZ2VEYXRhLnBhbGV0dGUucmVkU2hpZnQpLCB4VGFiLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoImdTaGYiLCAxMCwgeSs9MTIsIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLmdyZWVuU2hpZnQpLCB4VGFiLCB5LCB0cnVlKTsKLQkJCWdjLmRyYXdTdHJpbmcoImJTaGYiLCAxMCwgeSs9MTIsIHRydWUpOwotCQkJZ2MuZHJhd1N0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGltYWdlRGF0YS5wYWxldHRlLmJsdWVTaGlmdCksIHhUYWIsIHksIHRydWUpOwotCQl9IGVsc2UgewotCQkJLy8gRm9yIGFuIGluZGV4ZWQgcGFsZXR0ZSwgZGlzcGxheSB0aGUgcGFsZXR0ZSBjb2xvcnMgYW5kIGluZGljZXMuCi0JCQlSR0JbXSByZ2JzID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpOwotCQkJaWYgKHJnYnMgIT0gbnVsbCkgewotCQkJCWludCB4VGFiMSA9IDQwLCB4VGFiMiA9IDEwMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJnYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IHkgPSAoaSsxKSAqIDEwICsgcHk7Ci0JCQkJCWdjLmRyYXdTdHJpbmcoU3RyaW5nLnZhbHVlT2YoaSksIDEwLCB5LCB0cnVlKTsKLQkJCQkJZ2MuZHJhd1N0cmluZyh0b0hleEJ5dGVTdHJpbmcocmdic1tpXS5yZWQpICsgdG9IZXhCeXRlU3RyaW5nKHJnYnNbaV0uZ3JlZW4pICsgdG9IZXhCeXRlU3RyaW5nKHJnYnNbaV0uYmx1ZSksIHhUYWIxLCB5LCB0cnVlKTsKLQkJCQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdic1tpXSk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCQlnYy5maWxsUmVjdGFuZ2xlKHhUYWIyLCB5KzIsIDEwLCAxMCk7Ci0JCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0Jdm9pZCByZXNpemVTaGVsbChDb250cm9sRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlyZXNpemVTY3JvbGxCYXJzKCk7Ci0JfQotCi0JLy8gUmVzZXQgdGhlIHNjYWxlIGNvbWJvcyB0byAxLgotCXZvaWQgcmVzZXRTY2FsZUNvbWJvcygpIHsKLQkJeHNjYWxlID0gMTsgeXNjYWxlID0gMTsKLQkJc2NhbGVYQ29tYm8uc2VsZWN0KHNjYWxlWENvbWJvLmluZGV4T2YoIjEiKSk7Ci0JCXNjYWxlWUNvbWJvLnNlbGVjdChzY2FsZVlDb21iby5pbmRleE9mKCIxIikpOwotCX0KLQkKLQkvLyBSZXNldCB0aGUgc2Nyb2xsIGJhcnMgdG8gMC4KLQl2b2lkIHJlc2V0U2Nyb2xsQmFycygpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJaXggPSAwOyBpeSA9IDA7IHB5ID0gMDsKLQkJcmVzaXplU2Nyb2xsQmFycygpOwotCQlpbWFnZUNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCkuc2V0U2VsZWN0aW9uKDApOwotCQlpbWFnZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQkJcGFsZXR0ZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpLnNldFNlbGVjdGlvbigwKTsKLQl9Ci0JCi0Jdm9pZCByZXNpemVTY3JvbGxCYXJzKCkgewotCQkvLyBTZXQgdGhlIG1heCBhbmQgdGh1bWIgZm9yIHRoZSBpbWFnZSBjYW52YXMgc2Nyb2xsIGJhcnMuCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gaW1hZ2VDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlTY3JvbGxCYXIgdmVydGljYWwgPSBpbWFnZUNhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS53aWR0aCAqIHhzY2FsZSk7Ci0JCWlmICh3aWR0aCA+IGNhbnZhc0JvdW5kcy53aWR0aCkgewotCQkJLy8gVGhlIGltYWdlIGlzIHdpZGVyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCWhvcml6b250YWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWhvcml6b250YWwuc2V0TWF4aW11bSh3aWR0aCk7Ci0JCQlob3Jpem9udGFsLnNldFRodW1iKGNhbnZhc0JvdW5kcy53aWR0aCk7Ci0JCQlob3Jpem9udGFsLnNldFBhZ2VJbmNyZW1lbnQoY2FudmFzQm91bmRzLndpZHRoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRoZSBjYW52YXMgaXMgd2lkZXIgdGhhbiB0aGUgaW1hZ2UuCi0JCQlob3Jpem9udGFsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKGl4ICE9IDApIHsKLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGltYWdlIGlzIGNvbXBsZXRlbHkgdmlzaWJsZS4KLQkJCQlpeCA9IDA7Ci0JCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQkJaW50IGhlaWdodCA9IE1hdGgucm91bmQoaW1hZ2VEYXRhLmhlaWdodCAqIHlzY2FsZSk7Ci0JCWlmIChoZWlnaHQgPiBjYW52YXNCb3VuZHMuaGVpZ2h0KSB7Ci0JCQkvLyBUaGUgaW1hZ2UgaXMgdGFsbGVyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCXZlcnRpY2FsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl2ZXJ0aWNhbC5zZXRNYXhpbXVtKGhlaWdodCk7Ci0JCQl2ZXJ0aWNhbC5zZXRUaHVtYihjYW52YXNCb3VuZHMuaGVpZ2h0KTsKLQkJCXZlcnRpY2FsLnNldFBhZ2VJbmNyZW1lbnQoY2FudmFzQm91bmRzLmhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgY2FudmFzIGlzIHRhbGxlciB0aGFuIHRoZSBpbWFnZS4KLQkJCXZlcnRpY2FsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKGl5ICE9IDApIHsKLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGltYWdlIGlzIGNvbXBsZXRlbHkgdmlzaWJsZS4KLQkJCQlpeSA9IDA7Ci0JCQkJaW1hZ2VDYW52YXMucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXQgdGhlIG1heCBhbmQgdGh1bWIgZm9yIHRoZSBwYWxldHRlIGNhbnZhcyBzY3JvbGwgYmFyLgotCQl2ZXJ0aWNhbCA9IHBhbGV0dGVDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKGltYWdlRGF0YS5wYWxldHRlLmlzRGlyZWN0KSB7Ci0JCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsgLy8gaW5kZXhlZCBwYWxldHRlCi0JCQljYW52YXNCb3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCWludCBwYWxldHRlSGVpZ2h0ID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpLmxlbmd0aCAqIDEwICsgMjA7IC8vIDEwIHBpeGVscyBlYWNoIGluZGV4ICsgMjAgZm9yIG1hcmdpbnMuCi0JCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJdmVydGljYWwuc2V0TWF4aW11bShwYWxldHRlSGVpZ2h0KTsKLQkJCXZlcnRpY2FsLnNldFRodW1iKGNhbnZhc0JvdW5kcy5oZWlnaHQpOwotCQkJdmVydGljYWwuc2V0UGFnZUluY3JlbWVudChjYW52YXNCb3VuZHMuaGVpZ2h0KTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2FsbGVkIHdoZW4gdGhlIGltYWdlIGNhbnZhcycgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaXMgc2VsZWN0ZWQuCi0JICovCi0Jdm9pZCBzY3JvbGxIb3Jpem9udGFsbHkoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gaW1hZ2VDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLnJvdW5kKGltYWdlRGF0YS53aWR0aCAqIHhzY2FsZSk7Ci0JCWludCBoZWlnaHQgPSBNYXRoLnJvdW5kKGltYWdlRGF0YS5oZWlnaHQgKiB5c2NhbGUpOwotCQlpZiAod2lkdGggPiBjYW52YXNCb3VuZHMud2lkdGgpIHsKLQkJCS8vIE9ubHkgc2Nyb2xsIGlmIHRoZSBpbWFnZSBpcyBiaWdnZXIgdGhhbiB0aGUgY2FudmFzLgotCQkJaW50IHggPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHggKyB3aWR0aCA8IGNhbnZhc0JvdW5kcy53aWR0aCkgewotCQkJCS8vIERvbid0IHNjcm9sbCBwYXN0IHRoZSBlbmQgb2YgdGhlIGltYWdlLgotCQkJCXggPSBjYW52YXNCb3VuZHMud2lkdGggLSB3aWR0aDsKLQkJCX0KLQkJCWltYWdlQ2FudmFzLnNjcm9sbCh4LCBpeSwgaXgsIGl5LCB3aWR0aCwgaGVpZ2h0LCBmYWxzZSk7Ci0JCQlpeCA9IHg7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgY2FudmFzJyB2ZXJ0aWNhbCBzY3JvbGxiYXIgaXMgc2VsZWN0ZWQuCi0JICovCi0Jdm9pZCBzY3JvbGxWZXJ0aWNhbGx5KFNjcm9sbEJhciBzY3JvbGxCYXIpIHsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybjsKLQkJUmVjdGFuZ2xlIGNhbnZhc0JvdW5kcyA9IGltYWdlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5yb3VuZChpbWFnZURhdGEud2lkdGggKiB4c2NhbGUpOwotCQlpbnQgaGVpZ2h0ID0gTWF0aC5yb3VuZChpbWFnZURhdGEuaGVpZ2h0ICogeXNjYWxlKTsKLQkJaWYgKGhlaWdodCA+IGNhbnZhc0JvdW5kcy5oZWlnaHQpIHsKLQkJCS8vIE9ubHkgc2Nyb2xsIGlmIHRoZSBpbWFnZSBpcyBiaWdnZXIgdGhhbiB0aGUgY2FudmFzLgotCQkJaW50IHkgPSAtc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHkgKyBoZWlnaHQgPCBjYW52YXNCb3VuZHMuaGVpZ2h0KSB7Ci0JCQkJLy8gRG9uJ3Qgc2Nyb2xsIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW1hZ2UuCi0JCQkJeSA9IGNhbnZhc0JvdW5kcy5oZWlnaHQgLSBoZWlnaHQ7Ci0JCQl9Ci0JCQlpbWFnZUNhbnZhcy5zY3JvbGwoaXgsIHksIGl4LCBpeSwgd2lkdGgsIGhlaWdodCwgZmFsc2UpOwotCQkJaXkgPSB5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcGFsZXR0ZSBjYW52YXMnIHZlcnRpY2FsIHNjcm9sbGJhciBpcyBzZWxlY3RlZC4KLQkgKi8KLQl2b2lkIHNjcm9sbFBhbGV0dGUoU2Nyb2xsQmFyIHNjcm9sbEJhcikgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgcmV0dXJuOwotCQlSZWN0YW5nbGUgY2FudmFzQm91bmRzID0gcGFsZXR0ZUNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCBwYWxldHRlSGVpZ2h0ID0gaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCcygpLmxlbmd0aCAqIDEwICsgMjA7Ci0JCWlmIChwYWxldHRlSGVpZ2h0ID4gY2FudmFzQm91bmRzLmhlaWdodCkgewotCQkJLy8gT25seSBzY3JvbGwgaWYgdGhlIHBhbGV0dGUgaXMgYmlnZ2VyIHRoYW4gdGhlIGNhbnZhcy4KLQkJCWludCB5ID0gLXNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh5ICsgcGFsZXR0ZUhlaWdodCA8IGNhbnZhc0JvdW5kcy5oZWlnaHQpIHsKLQkJCQkvLyBEb24ndCBzY3JvbGwgcGFzdCB0aGUgZW5kIG9mIHRoZSBwYWxldHRlLgotCQkJCXkgPSBjYW52YXNCb3VuZHMuaGVpZ2h0IC0gcGFsZXR0ZUhlaWdodDsKLQkJCX0KLQkJCXBhbGV0dGVDYW52YXMuc2Nyb2xsKDAsIHksIDAsIHB5LCBwYWxldHRlV2lkdGgsIHBhbGV0dGVIZWlnaHQsIGZhbHNlKTsKLQkJCXB5ID0geTsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgU3RyaW5nIGNvbnRhaW5pbmcgYSBsaW5lLWJ5LWxpbmUgZHVtcCBvZgotCSAqIHRoZSBkYXRhIGluIHRoZSBjdXJyZW50IGltYWdlRGF0YS4gVGhlIGxpbmVEZWxpbWl0ZXIKLQkgKiBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMSBvciAyLgotCSAqLwotCVN0cmluZyBkYXRhSGV4RHVtcChTdHJpbmcgbGluZURlbGltaXRlcikgewotCQlmaW5hbCBpbnQgTUFYX0RVTVAgPSAxMDI0ICogMTAyNDsKLQkJaWYgKGltYWdlID09IG51bGwpIHJldHVybiAiIjsKLQkJYm9vbGVhbiB0cnVuY2F0ZWQgPSBmYWxzZTsKLQkJY2hhcltdIGR1bXAgPSBudWxsOwotCQlieXRlW10gYWxwaGFzID0gaW1hZ2VEYXRhLmFscGhhRGF0YTsKLQkJdHJ5IHsKLQkJCWludCBsZW5ndGggPSBpbWFnZURhdGEuaGVpZ2h0ICogKDYgKyAzICogaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSArIGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCkpOwotCQkJaWYgKGFscGhhcyAhPSBudWxsICYmIGFscGhhcy5sZW5ndGggPiAwKSB7Ci0JCQkJbGVuZ3RoICs9IGltYWdlRGF0YS5oZWlnaHQgKiAoNiArIDMgKiBpbWFnZURhdGEud2lkdGggKyBsaW5lRGVsaW1pdGVyLmxlbmd0aCgpKSArIDYgKyBsaW5lRGVsaW1pdGVyLmxlbmd0aCgpOwotCQkJfQotCQkJZHVtcCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewotCQkJLyogVG9vIG11Y2ggZGF0YSB0byBkdW1wIC0gdHJ1bmNhdGUuICovCi0JCQlkdW1wID0gbmV3IGNoYXJbTUFYX0RVTVBdOwotCQkJdHJ1bmNhdGVkID0gdHJ1ZTsKLQkJfQotCQlpbnQgaW5kZXggPSAwOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICUgaW1hZ2VEYXRhLmJ5dGVzUGVyTGluZSA9PSAwKSB7Ci0JCQkJCWludCBsaW5lID0gaSAvIGltYWdlRGF0YS5ieXRlc1BlckxpbmU7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwMDAgJSAxMCwgMTApOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMDAgJSAxMCwgMTApOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMCAlIDEwLCAxMCk7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAlIDEwLCAxMCk7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSAnOic7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJfQotCQkJCWJ5dGUgYiA9IGltYWdlRGF0YS5kYXRhW2ldOwotCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoKGIgJiAweEYwKSA+PiA0LCAxNik7Ci0JCQkJZHVtcFtpbmRleCsrXSA9IENoYXJhY3Rlci5mb3JEaWdpdChiICYgMHgwRiwgMTYpOwotCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJaWYgKChpICsgMSkgJSBpbWFnZURhdGEuYnl0ZXNQZXJMaW5lID09IDApIHsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDApOwotCQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChhbHBoYXMgIT0gbnVsbCAmJiBhbHBoYXMubGVuZ3RoID4gMCkgewotCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDEpOwotCQkJCX0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5ldyBjaGFyW117J0EnLCdsJywncCcsJ2gnLCdhJywnOid9LCAwLCBkdW1wLCBpbmRleCwgNik7Ci0JCQkJaW5kZXggKz02OwotCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQlpZiAobGluZURlbGltaXRlci5sZW5ndGgoKSA+IDEpIHsKLQkJCQkJZHVtcFtpbmRleCsrXSA9IGxpbmVEZWxpbWl0ZXIuY2hhckF0KDEpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAlIGltYWdlRGF0YS53aWR0aCA9PSAwKSB7Ci0JCQkJCQlpbnQgbGluZSA9IGkgLyBpbWFnZURhdGEud2lkdGg7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMDAwICUgMTAsIDEwKTsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQobGluZSAvIDEwMCAlIDEwLCAxMCk7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgLyAxMCAlIDEwLCAxMCk7Ci0JCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGxpbmUgJSAxMCwgMTApOwotCQkJCQkJZHVtcFtpbmRleCsrXSA9ICc6JzsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJCX0KLQkJCQkJYnl0ZSBiID0gYWxwaGFzW2ldOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChiICYgMHhGMCkgPj4gNCwgMTYpOwotCQkJCQlkdW1wW2luZGV4KytdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGIgJiAweDBGLCAxNik7Ci0JCQkJCWR1bXBbaW5kZXgrK10gPSAnICc7Ci0JCQkJCWlmICgoaSArIDEpICUgaW1hZ2VEYXRhLndpZHRoID09IDApIHsKLQkJCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgwKTsKLQkJCQkJCWlmIChsaW5lRGVsaW1pdGVyLmxlbmd0aCgpID4gMSkgewotCQkJCQkJCWR1bXBbaW5kZXgrK10gPSBsaW5lRGVsaW1pdGVyLmNoYXJBdCgxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7fQotCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBuZXcgU3RyaW5nKGR1bXApOwotCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCS8qIFRvbyBtdWNoIGRhdGEgdG8gZGlzcGxheSBpbiB0aGUgdGV4dCB3aWRnZXQgLSB0cnVuY2F0ZS4gKi8KLQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcoZHVtcCwgMCwgTUFYX0RVTVApOwotCQkJdHJ1bmNhdGVkID0gdHJ1ZTsKLQkJfQotCQlpZiAodHJ1bmNhdGVkKSByZXN1bHQgKz0gIlxuIC4uLmRhdGEgZHVtcCB0cnVuY2F0ZWQgYXQgIiArIE1BWF9EVU1QICsgImJ5dGVzLi4uIjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoKLQkgKiBPcGVuIGFuIGVycm9yIGRpYWxvZyBkaXNwbGF5aW5nIHRoZSBzcGVjaWZpZWQgaW5mb3JtYXRpb24uCi0JICovCi0Jdm9pZCBzaG93RXJyb3JEaWFsb2coU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIGZpbGVuYW1lLCBUaHJvd2FibGUgZSkgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCVN0cmluZyBtZXNzYWdlID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIkVycm9yIiksIG5ldyBTdHJpbmdbXSB7b3BlcmF0aW9uLCBmaWxlbmFtZX0pOwotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gIiI7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgU1dURXhjZXB0aW9uKSB7Ci0JCQkJU1dURXhjZXB0aW9uIHN3dGUgPSAoU1dURXhjZXB0aW9uKSBlOwotCQkJCWVycm9yTWVzc2FnZSA9IHN3dGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChzd3RlLnRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSArPSAiOlxuIiArIHN3dGUudGhyb3dhYmxlLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgU1dURXJyb3IpIHsKLQkJCQlTV1RFcnJvciBzd3RlID0gKFNXVEVycm9yKSBlOwotCQkJCWVycm9yTWVzc2FnZSA9IHN3dGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChzd3RlLnRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSArPSAiOlxuIiArIHN3dGUudGhyb3dhYmxlLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJYm94LnNldE1lc3NhZ2UobWVzc2FnZSArIGVycm9yTWVzc2FnZSk7Ci0JCWJveC5vcGVuKCk7Ci0JfQotCQotCS8qCi0JICogT3BlbiBhIGRpYWxvZyBhc2tpbmcgdGhlIHVzZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHR5cGUgb2YgQk1QIGZpbGUgdG8gc2F2ZS4KLQkgKi8KLQlpbnQgc2hvd0JNUERpYWxvZygpIHsKLQkJZmluYWwgaW50IFtdIGJtcFR5cGUgPSBuZXcgaW50WzFdOwotCQlibXBUeXBlWzBdID0gU1dULklNQUdFX0JNUDsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgcmFkaW9TZWxlY3RlZCA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJ1dHRvbiByYWRpbyA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQkJCQlpZiAocmFkaW8uZ2V0U2VsZWN0aW9uKCkpIGJtcFR5cGVbMF0gPSAoKEludGVnZXIpcmFkaW8uZ2V0RGF0YSgpKS5pbnRWYWx1ZSgpOwotCQkJfQotCQl9OwotCQkvLyBuZWVkIHRvIGV4dGVybmFsaXplIHN0cmluZ3MKLQkJZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCi0JCWRpYWxvZy5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZSIpKTsKLQkJZGlhbG9nLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZV9sYWJlbCIpKTsKLQkJCi0JCUJ1dHRvbiByYWRpbyA9IG5ldyBCdXR0b24oZGlhbG9nLCBTV1QuUkFESU8pOwotCQlyYWRpby5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIlNhdmVfYXNfdHlwZV9ub19jb21wcmVzcyIpKTsKLQkJcmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyYWRpby5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9CTVApKTsKLQkJcmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIocmFkaW9TZWxlY3RlZCk7Ci0KLQkJcmFkaW8gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlJBRElPKTsKLQkJcmFkaW8uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzX3R5cGVfcmxlX2NvbXByZXNzIikpOwotCQlyYWRpby5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9CTVBfUkxFKSk7Ci0JCXJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvU2VsZWN0ZWQpOwotCQkKLQkJcmFkaW8gPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlJBRElPKTsKLQkJcmFkaW8uc2V0VGV4dChidW5kbGUuZ2V0U3RyaW5nKCJTYXZlX2FzX3R5cGVfb3MyIikpOwotCQlyYWRpby5zZXREYXRhKG5ldyBJbnRlZ2VyKFNXVC5JTUFHRV9PUzJfQk1QKSk7Ci0JCXJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHJhZGlvU2VsZWN0ZWQpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uKGRpYWxvZywgU1dULlBVU0gpOwotCQlvay5zZXRUZXh0KGJ1bmRsZS5nZXRTdHJpbmcoIk9LIikpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWRhdGEud2lkdGhIaW50ID0gNzU7Ci0JCW9rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRpYWxvZy5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWRpYWxvZy5wYWNrKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXdoaWxlICghZGlhbG9nLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJcmV0dXJuIGJtcFR5cGVbMF07Ci0JfQkKLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIGhvdyB0byBhbmFseXplIHRoZSBieXRlcwotCSAqIGluIHRoZSBoZXggZHVtcC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGRlcHRoSW5mbyhpbnQgZGVwdGgpIHsKLQkJT2JqZWN0W10gYXJncyA9IHtuZXcgSW50ZWdlcihkZXB0aCksICIifTsKLQkJc3dpdGNoIChkZXB0aCkgewotCQkJY2FzZSAxOgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfcGl4ZWxzIiksIAotCQkJCSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcig4KSwgIiBbMDEyMzQ1NjddIn0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfcGl4ZWxzIiksCi0JCQkJICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKDQpLCAiWzAwMTEyMjMzXSJ9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX3BpeGVscyIpLAotCQkJCSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcigyKSwgIlswMDAwMTExMV0ifSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQkJYXJnc1sxXSA9IGJ1bmRsZS5nZXRTdHJpbmcoIk9uZV9ieXRlIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWFyZ3NbMV0gPSBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiTXVsdGlfYnl0ZXMiKSwgbmV3IEludGVnZXIoMikpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlhcmdzWzFdID0gY3JlYXRlTXNnKGJ1bmRsZS5nZXRTdHJpbmcoIk11bHRpX2J5dGVzIiksIG5ldyBJbnRlZ2VyKDMpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJYXJnc1sxXSA9IGNyZWF0ZU1zZyhidW5kbGUuZ2V0U3RyaW5nKCJNdWx0aV9ieXRlcyIpLCBuZXcgSW50ZWdlcig0KSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWFyZ3NbMV0gPSBidW5kbGUuZ2V0U3RyaW5nKCJVbnN1cHBvcnRlZF9sYyIpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVNc2coYnVuZGxlLmdldFN0cmluZygiRGVwdGhfaW5mbyIpLCBhcmdzKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgotCSAqIElmIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpcyB0b28gc21hbGwKLQkgKiB0byBzZWUgYSB2aXN1YWwgY2hhbmdlLCB0aGVuIHJldHVybiBhIGhpZ2hlciBudW1iZXIuCi0JICovCi0Jc3RhdGljIGludCB2aXNpYmxlRGVsYXkoaW50IG1zKSB7Ci0JCWlmIChtcyA8IDIwKSByZXR1cm4gbXMgKyAzMDsKLQkJaWYgKG1zIDwgMzApIHJldHVybiBtcyArIDEwOwotCQlyZXR1cm4gbXM7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBieXRlIHZhbHVlIGFzIGEgaGV4IHN0cmluZywKLQkgKiBwcmVzZXJ2aW5nIGxlYWRpbmcgMCdzLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgdG9IZXhCeXRlU3RyaW5nKGludCBpKSB7Ci0JCWlmIChpIDw9IDB4MGYpCi0JCQlyZXR1cm4gIjAiICsgSW50ZWdlci50b0hleFN0cmluZyhpKTsKLQkJcmV0dXJuIEludGVnZXIudG9IZXhTdHJpbmcoaSAmIDB4ZmYpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgNC1ieXRlIHZhbHVlIGFzIGEgaGV4IHN0cmluZywKLQkgKiBwcmVzZXJ2aW5nIGxlYWRpbmcgMCdzLgotCSAqIChhIGJpdCAnYnJ1dGUgZm9yY2UnLi4uIHNob3VsZCBwcm9iYWJseSB1c2UgYSBsb29wLi4uKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgdG9IZXg0Qnl0ZVN0cmluZyhpbnQgaSkgewotCQlTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyhpKTsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSAxKQotCQkJcmV0dXJuICIwMDAwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSAyKQotCQkJcmV0dXJuICIwMDAwMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDMpCi0JCQlyZXR1cm4gIjAwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA0KQotCQkJcmV0dXJuICIwMDAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA1KQotCQkJcmV0dXJuICIwMDAiICsgaGV4OwotCQlpZiAoaGV4Lmxlbmd0aCgpID09IDYpCi0JCQlyZXR1cm4gIjAwIiArIGhleDsKLQkJaWYgKGhleC5sZW5ndGgoKSA9PSA3KQotCQkJcmV0dXJuICIwIiArIGhleDsKLQkJcmV0dXJuIGhleDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc3BlY2lmaWVkCi0JICogdHJhbnNwYXJlbnQgb3IgYmFja2dyb3VuZCBwaXhlbC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIHBpeGVsSW5mbyhpbnQgcGl4ZWwpIHsKLQkJaWYgKHBpeGVsID09IC0xKSB7Ci0JCQlyZXR1cm4gcGl4ZWwgKyAiICgiICsgYnVuZGxlLmdldFN0cmluZygiTm9uZV9sYyIpICsgIikiOwotCQl9Ci0JCXJldHVybiBwaXhlbCArICIgKDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcocGl4ZWwpICsgIikiOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpZWQgZGlzcG9zYWwgbWV0aG9kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZGlzcG9zYWxTdHJpbmcoaW50IGRpc3Bvc2FsTWV0aG9kKSB7Ci0JCXN3aXRjaCAoZGlzcG9zYWxNZXRob2QpIHsKLQkJCWNhc2UgU1dULkRNX0ZJTExfTk9ORTogcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoIk5vbmVfbGMiKTsKLQkJCWNhc2UgU1dULkRNX0ZJTExfQkFDS0dST1VORDogcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoIkJhY2tncm91bmRfbGMiKTsKLQkJCWNhc2UgU1dULkRNX0ZJTExfUFJFVklPVVM6IHJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJQcmV2aW91c19sYyIpOwotCQl9Ci0JCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJVbnNwZWNpZmllZF9sYyIpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIFN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZmlsZSB0eXBlLgotCSAqLwotCVN0cmluZyBmaWxlVHlwZVN0cmluZyhpbnQgZmlsZXR5cGUpIHsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9CTVApCi0JCQlyZXR1cm4gIkJNUCI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfQk1QX1JMRSkKLQkJCXJldHVybiAiUkxFIiArIGltYWdlRGF0YS5kZXB0aCArICIgQk1QIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9PUzJfQk1QKQotCQkJcmV0dXJuICJPUy8yIEJNUCI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfR0lGKQotCQkJcmV0dXJuICJHSUYiOwotCQlpZiAoZmlsZXR5cGUgPT0gU1dULklNQUdFX0lDTykKLQkJCXJldHVybiAiSUNPIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9KUEVHKQotCQkJcmV0dXJuICJKUEVHIjsKLQkJaWYgKGZpbGV0eXBlID09IFNXVC5JTUFHRV9QTkcpCi0JCQlyZXR1cm4gIlBORyI7Ci0JCWlmIChmaWxldHlwZSA9PSBTV1QuSU1BR0VfVElGRikKLQkJCXJldHVybiAiVElGRiI7Ci0JCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKCJVbmtub3duX2FjIik7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZmlsZSdzIGltYWdlIHR5cGUsIGJhc2VkIG9uIGl0cyBleHRlbnNpb24uCi0JICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgdmVyeSByb2J1c3Qgd2F5IHRvIGRldGVybWluZSBpbWFnZSB0eXBlLAotCSAqIGFuZCBpdCBpcyBvbmx5IHRvIGJlIHVzZWQgaW4gdGhlIGFic2VuY2Ugb2YgYW55IGJldHRlciBtZXRob2QuCi0JICovCi0JaW50IGRldGVybWluZUZpbGVUeXBlKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmcgZXh0ID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJibXAiKSkgewotCQkJcmV0dXJuIHNob3dCTVBEaWFsb2coKTsKLQkJfQotCQlpZiAoZXh0LmVxdWFsc0lnbm9yZUNhc2UoImdpZiIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9HSUY7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgiaWNvIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX0lDTzsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqcGciKSB8fCBleHQuZXF1YWxzSWdub3JlQ2FzZSgianBlZyIpIHx8IGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqZmlmIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX0pQRUc7Ci0JCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZSgicG5nIikpCi0JCQlyZXR1cm4gU1dULklNQUdFX1BORzsKLQkJaWYgKGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJ0aWYiKSB8fCBleHQuZXF1YWxzSWdub3JlQ2FzZSgidGlmZiIpKQotCQkJcmV0dXJuIFNXVC5JTUFHRV9USUZGOwotCQlyZXR1cm4gU1dULklNQUdFX1VOREVGSU5FRDsKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBjcmVhdGVNc2coU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgewotCQlNZXNzYWdlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBNZXNzYWdlRm9ybWF0KG1zZyk7Ci0JCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGFyZ3MpOwotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIGNyZWF0ZU1zZyhTdHJpbmcgbXNnLCBPYmplY3QgYXJnKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgZm9ybWF0dGVyID0gbmV3IE1lc3NhZ2VGb3JtYXQobXNnKTsKLQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQobmV3IE9iamVjdFtde2FyZ30pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YUxpbmVTdHlsZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YUxpbmVTdHlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQ4ZTg1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9qYXZhdmlld2VyL0phdmFMaW5lU3R5bGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLWNsYXNzIEphdmFMaW5lU3R5bGVyIGltcGxlbWVudHMgTGluZVN0eWxlTGlzdGVuZXIgewotCUphdmFTY2FubmVyIHNjYW5uZXIgPSBuZXcgSmF2YVNjYW5uZXIoKTsKLQlpbnRbXSB0b2tlbkNvbG9yczsKLQlDb2xvcltdIGNvbG9yczsKLQlWZWN0b3IgYmxvY2tDb21tZW50cyA9IG5ldyBWZWN0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRj0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9MPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdPUkQ9CQkwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFPQkJMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVk9CQkJMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UPQkJMzsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HPQkJNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVEhFUj0JCTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSPQkJNzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fVE9LRU49IDg7Ci0KLXB1YmxpYyBKYXZhTGluZVN0eWxlcigpIHsKLQlpbml0aWFsaXplQ29sb3JzKCk7Ci0Jc2Nhbm5lciA9IG5ldyBKYXZhU2Nhbm5lcigpOwotfQotCi1Db2xvciBnZXRDb2xvcihpbnQgdHlwZSkgewotCWlmICh0eXBlIDwgMCB8fCB0eXBlID49IHRva2VuQ29sb3JzLmxlbmd0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGNvbG9yc1t0b2tlbkNvbG9yc1t0eXBlXV07Ci19Ci0KLWJvb2xlYW4gaW5CbG9ja0NvbW1lbnQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JZm9yIChpbnQgaT0wOyBpPGJsb2NrQ29tbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJaW50W10gb2Zmc2V0cyA9IChpbnRbXSlibG9ja0NvbW1lbnRzLmVsZW1lbnRBdChpKTsKLQkJLy8gc3RhcnQgb2YgY29tbWVudCBpbiB0aGUgbGluZQotCQlpZiAoKG9mZnNldHNbMF0gPj0gc3RhcnQpICYmIChvZmZzZXRzWzBdIDw9IGVuZCkpIHJldHVybiB0cnVlOwotCQkvLyBlbmQgb2YgY29tbWVudCBpbiB0aGUgbGluZQotCQlpZiAoKG9mZnNldHNbMV0gPj0gc3RhcnQpICYmIChvZmZzZXRzWzFdIDw9IGVuZCkpIHJldHVybiB0cnVlOwotCQlpZiAoKG9mZnNldHNbMF0gPD0gc3RhcnQpICYmIChvZmZzZXRzWzFdID49IGVuZCkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZUNvbG9ycygpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQljb2xvcnM9IG5ldyBDb2xvcltdIHsKLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgMCwgMCkpLAkJLy8gYmxhY2sKLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMjU1LCAwLCAwKSksCS8vIHJlZAotCQluZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigwLCAyNTUsIDApKSwJLy8gZ3JlZW4KLQkJbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgICAwLCAyNTUpKQkvLyBibHVlCi0JfTsKLQl0b2tlbkNvbG9ycz0gbmV3IGludFtNQVhJTVVNX1RPS0VOXTsKLQl0b2tlbkNvbG9yc1tXT1JEXT0JCTA7Ci0JdG9rZW5Db2xvcnNbV0hJVEVdPQkJMDsKLQl0b2tlbkNvbG9yc1tLRVldPQkJMzsgCi0JdG9rZW5Db2xvcnNbQ09NTUVOVF09CTE7IAotCXRva2VuQ29sb3JzW1NUUklOR109IAkyOyAKLQl0b2tlbkNvbG9yc1tPVEhFUl09CQkwOwotCXRva2VuQ29sb3JzW05VTUJFUl09CTA7Ci19Ci0KLXZvaWQgZGlzcG9zZUNvbG9ycygpIHsKLQlmb3IgKGludCBpPTA7aTxjb2xvcnMubGVuZ3RoO2krKykgewotCQljb2xvcnNbaV0uZGlzcG9zZSgpOwotCX0KLX0KLQotLyoqCi0gKiBFdmVudC5kZXRhaWwJCQlsaW5lIHN0YXJ0IG9mZnNldCAoaW5wdXQpCQotICogRXZlbnQudGV4dCAJCQlsaW5lIHRleHQgKGlucHV0KQotICogTGluZVN0eWxlRXZlbnQuc3R5bGVzIAlFbnVtZXJhdGlvbiBvZiBTdHlsZVJhbmdlcywgbmVlZCB0byBiZSBpbiBvcmRlci4gKG91dHB1dCkKLSAqIExpbmVTdHlsZUV2ZW50LmJhY2tncm91bmQgCWxpbmUgYmFja2dyb3VuZCBjb2xvciAob3V0cHV0KQotICovCi1wdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQlWZWN0b3Igc3R5bGVzID0gbmV3IFZlY3RvcigpOwotCWludCB0b2tlbjsKLQlTdHlsZVJhbmdlIGxhc3RTdHlsZTsKLQkvLyBJZiB0aGUgbGluZSBpcyBwYXJ0IG9mIGEgYmxvY2sgY29tbWVudCwgY3JlYXRlIG9uZSBzdHlsZSBmb3IgdGhlIGVudGlyZSBsaW5lLgotCWlmIChpbkJsb2NrQ29tbWVudChldmVudC5saW5lT2Zmc2V0LCBldmVudC5saW5lT2Zmc2V0ICsgZXZlbnQubGluZVRleHQubGVuZ3RoKCkpKSB7Ci0JCXN0eWxlcy5hZGRFbGVtZW50KG5ldyBTdHlsZVJhbmdlKGV2ZW50LmxpbmVPZmZzZXQsIGV2ZW50LmxpbmVUZXh0Lmxlbmd0aCgpLCBnZXRDb2xvcihDT01NRU5UKSwgbnVsbCkpOwotCQlldmVudC5zdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVtzdHlsZXMuc2l6ZSgpXTsKLQkJc3R5bGVzLmNvcHlJbnRvKGV2ZW50LnN0eWxlcyk7Ci0JCXJldHVybjsKLQl9Ci0JQ29sb3IgZGVmYXVsdEZnQ29sb3IgPSAoKENvbnRyb2wpZXZlbnQud2lkZ2V0KS5nZXRGb3JlZ3JvdW5kKCk7Ci0Jc2Nhbm5lci5zZXRSYW5nZShldmVudC5saW5lVGV4dCk7Ci0JdG9rZW4gPSBzY2FubmVyLm5leHRUb2tlbigpOwotCXdoaWxlICh0b2tlbiAhPSBFT0YpIHsKLQkJaWYgKHRva2VuID09IE9USEVSKSB7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciBub24tY29sb3JlZCB0b2tlbnMKLQkJfSBlbHNlIGlmICh0b2tlbiAhPSBXSElURSkgewotCQkJQ29sb3IgY29sb3IgPSBnZXRDb2xvcih0b2tlbik7Ci0JCQkvLyBPbmx5IGNyZWF0ZSBhIHN0eWxlIGlmIHRoZSB0b2tlbiBjb2xvciBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgCi0JCQkvLyB3aWRnZXQncyBkZWZhdWx0IGZvcmVncm91bmQgY29sb3IgYW5kIHRoZSB0b2tlbidzIHN0eWxlIGlzIG5vdCAKLQkJCS8vIGJvbGQuICBLZXl3b3JkcyBhcmUgYm9sZGVkLgotCQkJaWYgKCghY29sb3IuZXF1YWxzKGRlZmF1bHRGZ0NvbG9yKSkgfHwgKHRva2VuID09IEtFWSkpIHsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uoc2Nhbm5lci5nZXRTdGFydE9mZnNldCgpICsgZXZlbnQubGluZU9mZnNldCwgc2Nhbm5lci5nZXRMZW5ndGgoKSwgY29sb3IsIG51bGwpOwotCQkJCWlmICh0b2tlbiA9PSBLRVkpIHsKLQkJCQkJc3R5bGUuZm9udFN0eWxlID0gU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChzdHlsZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCXN0eWxlcy5hZGRFbGVtZW50KHN0eWxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBNZXJnZSBzaW1pbGFyIHN0eWxlcy4gIERvaW5nIHNvIHdpbGwgaW1wcm92ZSBwZXJmb3JtYW5jZS4KLQkJCQkJbGFzdFN0eWxlID0gKFN0eWxlUmFuZ2Upc3R5bGVzLmxhc3RFbGVtZW50KCk7Ci0JCQkJCWlmIChsYXN0U3R5bGUuc2ltaWxhclRvKHN0eWxlKSAmJiAobGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdHlsZS5zdGFydCkpIHsKLQkJCQkJCWxhc3RTdHlsZS5sZW5ndGggKz0gc3R5bGUubGVuZ3RoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOyAKLQkJCQkJfQotCQkJCX0gCi0JCQl9IAotCQl9IGVsc2UgaWYgKCghc3R5bGVzLmlzRW1wdHkoKSkgJiYgKChsYXN0U3R5bGU9KFN0eWxlUmFuZ2Upc3R5bGVzLmxhc3RFbGVtZW50KCkpLmZvbnRTdHlsZSA9PSBTV1QuQk9MRCkpIHsKLQkJCWludCBzdGFydCA9IHNjYW5uZXIuZ2V0U3RhcnRPZmZzZXQoKSArIGV2ZW50LmxpbmVPZmZzZXQ7Ci0JCQlsYXN0U3R5bGUgPSAoU3R5bGVSYW5nZSlzdHlsZXMubGFzdEVsZW1lbnQoKTsKLQkJCS8vIEEgZm9udCBzdHlsZSBvZiBTV1QuQk9MRCBpbXBsaWVzIHRoYXQgdGhlIGxhc3Qgc3R5bGUKLQkJCS8vIHJlcHJlc2VudHMgYSBqYXZhIGtleXdvcmQuCi0JCQlpZiAobGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdGFydCkgewotCQkJCS8vIEhhdmUgdGhlIHdoaXRlIHNwYWNlIHRha2Ugb24gdGhlIHN0eWxlIGJlZm9yZSBpdCB0byAKLQkJCQkvLyBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIHN0eWxlIHJhbmdlcyBjcmVhdGVkIGFuZCB0aGUKLQkJCQkvLyBudW1iZXIgb2YgZm9udCBzdHlsZSBjaGFuZ2VzIGR1cmluZyByZW5kZXJpbmcuCi0JCQkJbGFzdFN0eWxlLmxlbmd0aCArPSBzY2FubmVyLmdldExlbmd0aCgpOwotCQkJfQotCQl9IAotCQl0b2tlbj0gc2Nhbm5lci5uZXh0VG9rZW4oKTsKLQl9Ci0JZXZlbnQuc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2Vbc3R5bGVzLnNpemUoKV07Ci0Jc3R5bGVzLmNvcHlJbnRvKGV2ZW50LnN0eWxlcyk7Ci19Ci1wdWJsaWMgdm9pZCBwYXJzZUJsb2NrQ29tbWVudHMoU3RyaW5nIHRleHQpIHsKLQlibG9ja0NvbW1lbnRzID0gbmV3IFZlY3RvcigpOwotCVN0cmluZ1JlYWRlciBidWZmZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRleHQpOwotCWludCBjaDsKLQlib29sZWFuIGJsa0NvbW1lbnQgPSBmYWxzZTsKLQlpbnQgY250ID0gMDsKLQlpbnRbXSBvZmZzZXRzID0gbmV3IGludFsyXTsKLQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkKLQl0cnkgewotCXdoaWxlICghZG9uZSkgewotCQlzd2l0Y2ggKGNoID0gYnVmZmVyLnJlYWQoKSkgewotCQkJY2FzZSAtMSA6IHsKLQkJCQlpZiAoYmxrQ29tbWVudCkgewotCQkJCQlvZmZzZXRzWzFdID0gY250OwotCQkJCQlibG9ja0NvbW1lbnRzLmFkZEVsZW1lbnQob2Zmc2V0cyk7Ci0JCQkJfQotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSAnLycgOiB7Ci0JCQkJY2ggPSBidWZmZXIucmVhZCgpOwotCQkJCWlmICgoY2ggPT0gJyonKSAmJiAoIWJsa0NvbW1lbnQpKSB7Ci0JCQkJCW9mZnNldHMgPSBuZXcgaW50WzJdOwotCQkJCQlvZmZzZXRzWzBdID0gY250OwotCQkJCQlibGtDb21tZW50ID0gdHJ1ZTsKLQkJCQkJY250Kys7CQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNudCsrOwotCQkJCX0JCQkJCQkKLQkJCQljbnQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgJyonIDogewotCQkJCWlmIChibGtDb21tZW50KSB7Ci0JCQkJCWNoID0gYnVmZmVyLnJlYWQoKTsKLQkJCQkJY250Kys7Ci0JCQkJCWlmIChjaCA9PSAnLycpIHsKLQkJCQkJCWJsa0NvbW1lbnQgPSBmYWxzZTsJCi0JCQkJCQlvZmZzZXRzWzFdID0gY250OwotCQkJCQkJYmxvY2tDb21tZW50cy5hZGRFbGVtZW50KG9mZnNldHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNudCsrOwkKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY250Kys7CQkJCQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQkJCi0JfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZSBlcnJvcnMKLQl9Ci19Ci0KLS8qKgotICogQSBzaW1wbGUgZnV6enkgc2Nhbm5lciBmb3IgSmF2YQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNjYW5uZXIgewotCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBmZ0tleXM9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBmQnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmRG9jOwotCXByb3RlY3RlZCBpbnQgZlBvczsKLQlwcm90ZWN0ZWQgaW50IGZFbmQ7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnRUb2tlbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmRW9mU2Vlbj0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGZnS2V5d29yZHM9IHsgCi0JCSJhYnN0cmFjdCIsCi0JCSJib29sZWFuIiwgImJyZWFrIiwgImJ5dGUiLAotCQkiY2FzZSIsICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwgImNvbnRpbnVlIiwKLQkJImRlZmF1bHQiLCAiZG8iLCAiZG91YmxlIiwKLQkJImVsc2UiLCAiZXh0ZW5kcyIsCi0JCSJmYWxzZSIsICJmaW5hbCIsICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsCi0JCSJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbnN0YW5jZW9mIiwgImludCIsICJpbnRlcmZhY2UiLAotCQkibG9uZyIsCi0JCSJuYXRpdmUiLCAibmV3IiwgIm51bGwiLAotCQkicGFja2FnZSIsICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJwdWJsaWMiLAotCQkicmV0dXJuIiwKLQkJInNob3J0IiwgInN0YXRpYyIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwKLQkJInRoaXMiLCAidGhyb3ciLCAidGhyb3dzIiwgInRyYW5zaWVudCIsICJ0cnVlIiwgInRyeSIsCi0JCSJ2b2lkIiwgInZvbGF0aWxlIiwKLQkJIndoaWxlIgotCX07Ci0KLQlwdWJsaWMgSmF2YVNjYW5uZXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmRpbmcgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlBvcyAtIGZTdGFydFRva2VuOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGxvb2t1cCB0YWJsZS4KLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZnS2V5cz0gbmV3IEhhc2h0YWJsZSgpOwotCQlJbnRlZ2VyIGs9IG5ldyBJbnRlZ2VyKEtFWSk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmZ0tleXdvcmRzLmxlbmd0aDsgaSsrKQotCQkJZmdLZXlzLnB1dChmZ0tleXdvcmRzW2ldLCBrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCB0b2tlbiBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGZTdGFydFRva2VuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgbGV4aWNhbCB0b2tlbiBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBuZXh0VG9rZW4oKSB7Ci0JCWludCBjOwotCQlmU3RhcnRUb2tlbj0gZlBvczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXN3aXRjaCAoYz0gcmVhZCgpKSB7CQkJCi0JCQljYXNlIEVPRjoKLQkJCQlyZXR1cm4gRU9GOwkJCQkKLQkJCWNhc2UgJy8nOgkvLyBjb21tZW50Ci0JCQkJYz0gcmVhZCgpOwotCQkJCWlmIChjID09ICcvJykgewotCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQkJaWYgKChjID09IEVPRikgfHwgKGMgPT0gRU9MKSkgewotCQkJCQkJCXVucmVhZChjKTsKLQkJCQkJCQlyZXR1cm4gQ09NTUVOVDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl1bnJlYWQoYyk7Ci0JCQkJcmV0dXJuIE9USEVSOwotCQkJY2FzZSAnXCcnOgkvLyBjaGFyIGNvbnN0Ci0JCQkJd2hpbGUodHJ1ZSkgewotCQkJCQljPSByZWFkKCk7Ci0JCQkJCXN3aXRjaCAoYykgewotCQkJCQkJY2FzZSAnXCcnOgotCQkJCQkJCXJldHVybiBTVFJJTkc7Ci0JCQkJCQljYXNlIEVPRjoKLQkJCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCQkJcmV0dXJuIFNUUklORzsKLQkJCQkJCWNhc2UgJ1xcJzoKLQkJCQkJCQljPSByZWFkKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJfQotCi0JCQljYXNlICciJzoJLy8gc3RyaW5nCi0JCQkJd2hpbGUodHJ1ZSkgewotCQkJCQljPSByZWFkKCk7Ci0JCQkJCXN3aXRjaCAoYykgewotCQkJCQkJY2FzZSAnIic6Ci0JCQkJCQkJcmV0dXJuIFNUUklORzsKLQkJCQkJCWNhc2UgRU9GOgotCQkJCQkJCXVucmVhZChjKTsKLQkJCQkJCQlyZXR1cm4gU1RSSU5HOwotCQkJCQkJY2FzZSAnXFwnOgotCQkJCQkJCWM9IHJlYWQoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQl9Ci0KLQkJCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQkJCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkJCQlkbyB7Ci0JCQkJCWM9IHJlYWQoKTsKLQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKWMpKTsKLQkJCQl1bnJlYWQoYyk7Ci0JCQkJcmV0dXJuIE5VTUJFUjsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpYykpIHsKLQkJCQkJZG8gewotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpYykpOwotCQkJCQl1bnJlYWQoYyk7Ci0JCQkJCXJldHVybiBXSElURTsKLQkJCQl9Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKGNoYXIpYykpIHsKLQkJCQkJZkJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCQkJCWRvIHsKLQkJCQkJCWZCdWZmZXIuYXBwZW5kKChjaGFyKWMpOwotCQkJCQkJYz0gcmVhZCgpOwotCQkJCQl9IHdoaWxlKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydCgoY2hhciljKSk7Ci0JCQkJCXVucmVhZChjKTsKLQkJCQkJSW50ZWdlciBpPSAoSW50ZWdlcikgZmdLZXlzLmdldChmQnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoaSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGkuaW50VmFsdWUoKTsKLQkJCQkJCXJldHVybiBXT1JEOwotCQkJCX0KLQkJCQlyZXR1cm4gT1RIRVI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG5leHQgY2hhcmFjdGVyLgotCSAqLwotCXByb3RlY3RlZCBpbnQgcmVhZCgpIHsKLQkJaWYgKGZQb3MgPD0gZkVuZCkgewotCQkJcmV0dXJuIGZEb2MuY2hhckF0KGZQb3MrKyk7Ci0JCX0KLQkJcmV0dXJuIEVPRjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSYW5nZShTdHJpbmcgdGV4dCkgewotCQlmRG9jPSB0ZXh0OwotCQlmUG9zPSAwOwotCQlmRW5kPSBmRG9jLmxlbmd0aCgpIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVucmVhZChpbnQgYykgewotCQlpZiAoYyAhPSBFT0YpCi0JICAgIAlmUG9zLS07Ci0JfQotfQotCi0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2phdmF2aWV3ZXIvSmF2YVZpZXdlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzMWY1N2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvamF2YXZpZXdlci9KYXZhVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5qYXZhdmlld2VyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVmlld2VyIHsgIAotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgdGV4dDsKLQlKYXZhTGluZVN0eWxlciBsaW5lU3R5bGVyID0gbmV3IEphdmFMaW5lU3R5bGVyKCk7Ci0JRmlsZURpYWxvZyBmaWxlRGlhbG9nOwotCXN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX2phdmF2aWV3ZXIiKTsKLQotTWVudSBjcmVhdGVGaWxlTWVudSgpIHsKLQlNZW51IGJhciA9IHNoZWxsLmdldE1lbnVCYXIgKCk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKGJhcik7Ci0JTWVudUl0ZW0gaXRlbTsKLQotCS8vIE9wZW4gCi0JaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiT3Blbl9tZW51aXRlbSIpKTsKLQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ08nKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJb3BlbkZpbGUoKTsKLQkJfQotCX0pOwotCi0JLy8gRXhpdAotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIkV4aXRfbWVudWl0ZW0iKSk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbWVudUZpbGVFeGl0ICgpOwotCQl9Ci0JfSk7Ci0JcmV0dXJuIG1lbnU7Ci19Ci0KLXZvaWQgY3JlYXRlTWVudUJhciAoKSB7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0KLQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZmlsZUl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRmlsZV9tZW51aXRlbSIpKTsKLQlmaWxlSXRlbS5zZXRNZW51IChjcmVhdGVGaWxlTWVudSAoKSk7Ci0KLX0KLQotdm9pZCBjcmVhdGVTaGVsbCAoRGlzcGxheSBkaXNwbGF5KSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIldpbmRvd190aXRsZSIpKTsJCi0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyIChuZXcgU2hlbGxBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQgKFNoZWxsRXZlbnQgZSkgewotCQkJbGluZVN0eWxlci5kaXNwb3NlQ29sb3JzKCk7Ci0JCQl0ZXh0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKGxpbmVTdHlsZXIpOwotCQl9Ci0JfSk7Ci19Ci12b2lkIGNyZWF0ZVN0eWxlZFRleHQoKSB7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0Jc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQl0ZXh0LnNldExheW91dERhdGEoc3BlYyk7Ci0JdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaW5lU3R5bGVyKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlDb2xvciBiZyA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQl0ZXh0LnNldEJhY2tncm91bmQoYmcpOwotfQotCi12b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbXNnKSB7Ci0JTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCWJveC5zZXRNZXNzYWdlKG1zZyk7Ci0JYm94Lm9wZW4oKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlKYXZhVmlld2VyIGV4YW1wbGUgPSBuZXcgSmF2YVZpZXdlciAoKTsKLQlTaGVsbCBzaGVsbCA9IGV4YW1wbGUub3BlbiAoZGlzcGxheSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKQotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotcHVibGljIFNoZWxsIG9wZW4gKERpc3BsYXkgZGlzcGxheSkgewotCWNyZWF0ZVNoZWxsIChkaXNwbGF5KTsKLQljcmVhdGVNZW51QmFyICgpOwotCWNyZWF0ZVN0eWxlZFRleHQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXZvaWQgb3BlbkZpbGUoKSB7CQotCWlmIChmaWxlRGlhbG9nID09IG51bGwpIHsKLQkJZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JfQotCi0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouamF2YSIsICIqLioifSk7Ci0JU3RyaW5nIG5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQkKLQlvcGVuKG5hbWUpOwotfQotCi12b2lkIG9wZW4oU3RyaW5nIG5hbWUpIHsKLQlmaW5hbCBTdHJpbmcgdGV4dFN0cmluZzsKLQkKLQlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHJldHVybjsKLQotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5hbWUpOwotCWlmICghZmlsZS5leGlzdHMoKSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHJlc291cmNlcy5nZXRTdHJpbmcoIkVycl9maWxlX25vX2V4aXN0IiksIG5ldyBTdHJpbmdbXSB7ZmlsZS5nZXROYW1lKCl9KTsKLQkJZGlzcGxheUVycm9yKG1lc3NhZ2UpOwotCQlyZXR1cm47Ci0JfQotCi0JdHJ5IHsKLQkJRmlsZUlucHV0U3RyZWFtIHN0cmVhbT0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlLmdldFBhdGgoKSk7Ci0JCXRyeSB7Ci0JCQlSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCQkJY2hhcltdIHJlYWRCdWZmZXI9IG5ldyBjaGFyWzIwNDhdOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigoaW50KSBmaWxlLmxlbmd0aCgpKTsKLQkJCWludCBuOwotCQkJd2hpbGUgKChuID0gaW4ucmVhZChyZWFkQnVmZmVyKSkgPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCX0KLQkJCXRleHRTdHJpbmcgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBFcnJfZmlsZV9pbwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJFcnJfZmlsZV9pbyIpLCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCQlkaXNwbGF5RXJyb3IobWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocmVzb3VyY2VzLmdldFN0cmluZygiRXJyX25vdF9mb3VuZCIpLCBuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSk7Ci0JCWRpc3BsYXlFcnJvcihtZXNzYWdlKTsKLQkJcmV0dXJuOwotCX0KLQkvLyBHdWFyZCBhZ2FpbnN0IHN1cGVyZmx1b3VzIG1vdXNlIG1vdmUgZXZlbnRzIC0tIGRlZmVyIGFjdGlvbiB1bnRpbCBsYXRlcgotCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCQl9Ci0JfSk7CQotCQotCS8vIHBhcnNlIHRoZSBibG9jayBjb21tZW50cyB1cCBmcm9udCBzaW5jZSBibG9jayBjb21tZW50cyBjYW4gZ28gYWNyb3NzCi0JLy8gbGluZXMgLSBpbmVmZmljaWVudCB3YXkgb2YgZG9pbmcgdGhpcwotCWxpbmVTdHlsZXIucGFyc2VCbG9ja0NvbW1lbnRzKHRleHRTdHJpbmcpOwotfQotCi12b2lkIG1lbnVGaWxlRXhpdCAoKSB7Ci0Jc2hlbGwuY2xvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0ZpbGxMYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRmlsbExheW91dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNjNGYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRmlsbExheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgRmlsbExheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlCdXR0b24gaG9yaXpvbnRhbCwgdmVydGljYWw7Ci0JU3Bpbm5lciBtYXJnaW5XaWR0aCwgbWFyZ2luSGVpZ2h0LCBzcGFjaW5nOwotCS8qIFRoZSBleGFtcGxlIGxheW91dCBpbnN0YW5jZSAqLwotCUZpbGxMYXlvdXQgZmlsbExheW91dDsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIGNvbWJvRWRpdG9yLCBuYW1lRWRpdG9yOwotCUNDb21ibyBjb21ibzsKLQlUZXh0IG5hbWVUZXh0OwotCWZpbmFsIGludCBOQU1FX0NPTCA9IDA7Ci0JZmluYWwgaW50IFRPVEFMX0NPTFMgPSAyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCUZpbGxMYXlvdXRUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCi0JCS8qIEFkZCBUYWJsZUVkaXRvcnMgKi8KLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJbmFtZUVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCWluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJaWYgKGluZGV4ID09IC0xKSByZXR1cm47Ci0JCQkJVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotCQkJCW5ld0l0ZW0gPSB0YWJsZS5nZXRJdGVtIChpbmRleCk7Ci0JCQkJaWYgKG5ld0l0ZW0gPT0gb2xkSXRlbSB8fCBuZXdJdGVtICE9IGxhc3RTZWxlY3RlZCkgewotCQkJCQlsYXN0U2VsZWN0ZWQgPSBuZXdJdGVtOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRhYmxlLnNob3dTZWxlY3Rpb24gKCk7Ci0JCQkJCi0JCQkJY29tYm8gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULlJFQURfT05MWSk7Ci0JCQkJY3JlYXRlQ29tYm9FZGl0b3IgKGNvbWJvLCBjb21ib0VkaXRvcik7Ci0JCQkJCi0JCQkJbmFtZVRleHQgPSBuZXcgVGV4dCh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJbmFtZVRleHQuc2V0VGV4dCgoKFN0cmluZ1tdKWRhdGEuZWxlbWVudEF0KGluZGV4KSlbTkFNRV9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yKG5hbWVUZXh0LCBuYW1lRWRpdG9yLCBOQU1FX0NPTCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0JCS8qIENvbnRyb2xzIHRoZSB0eXBlIG9mIEZpbGxMYXlvdXQgKi8KLQkJR3JvdXAgdHlwZUdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJdHlwZUdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUeXBlIikpOwotCQl0eXBlR3JvdXAuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXR5cGVHcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQkJaG9yaXpvbnRhbCA9IG5ldyBCdXR0b24gKHR5cGVHcm91cCwgU1dULlJBRElPKTsKLQkJaG9yaXpvbnRhbC5zZXRUZXh0ICgiU1dULkhPUklaT05UQUwiKTsKLQkJaG9yaXpvbnRhbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWhvcml6b250YWwuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlob3Jpem9udGFsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXZlcnRpY2FsID0gbmV3IEJ1dHRvbiAodHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQl2ZXJ0aWNhbC5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCXZlcnRpY2FsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJdmVydGljYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsgCi0JCQotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgRmlsbExheW91dCAqLwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWFyZ2luc19TcGFjaW5nIikpOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbldpZHRoLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luV2lkdGguYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5IZWlnaHQiKTsKLQkJbWFyZ2luSGVpZ2h0ID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5IZWlnaHQuc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5IZWlnaHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCW1hcmdpbkhlaWdodC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJzcGFjaW5nIik7Ci0JCXNwYWNpbmcgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCXNwYWNpbmcuc2V0U2VsZWN0aW9uKDApOwotCQlzcGFjaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMgKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwotCXZvaWQgY3JlYXRlTGF5b3V0ICgpIHsKLQkJZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0ICgpOwotCQlsYXlvdXRDb21wb3NpdGUuc2V0TGF5b3V0IChmaWxsTGF5b3V0KTsKLQl9Ci0JCi0JLyoqIAotCSAqIERpc3Bvc2VzIHRoZSBlZGl0b3JzIHdpdGhvdXQgcGxhY2luZyB0aGVpciBjb250ZW50cwotCSAqIGludG8gdGhlIHRhYmxlLgotCSAqLwotCXZvaWQgZGlzcG9zZUVkaXRvcnMgKCkgewotCQljb21ib0VkaXRvci5zZXRFZGl0b3IgKG51bGwsIG51bGwsIC0xKTsKLQkJY29tYm8uZGlzcG9zZSAoKTsKLQkJbmFtZVRleHQuZGlzcG9zZSgpOwotCX0KLQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0JU3RyaW5nQnVmZmVyIGdlbmVyYXRlTGF5b3V0Q29kZSAoKSB7Ci0JCVN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0RmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQgKCk7XG4iKTsKLQkJaWYgKGZpbGxMYXlvdXQudHlwZSA9PSBTV1QuVkVSVElDQUwpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZpbGxMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDtcbiIpOwotCQl9Ci0JCWlmIChmaWxsTGF5b3V0Lm1hcmdpbldpZHRoICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kKCJcdFx0ZmlsbExheW91dC5tYXJnaW5XaWR0aCA9ICIgKyBmaWxsTGF5b3V0Lm1hcmdpbldpZHRoICsgIjtcbiIpOwotCQl9Ci0JCWlmIChmaWxsTGF5b3V0Lm1hcmdpbkhlaWdodCAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCgiXHRcdGZpbGxMYXlvdXQubWFyZ2luSGVpZ2h0ID0gIiArIGZpbGxMYXlvdXQubWFyZ2luSGVpZ2h0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChmaWxsTGF5b3V0LnNwYWNpbmcgIT0gMCkgewotCQkJY29kZS5hcHBlbmQoIlx0XHRmaWxsTGF5b3V0LnNwYWNpbmcgPSAiICsgZmlsbExheW91dC5zcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kKCJcdFx0c2hlbGwuc2V0TGF5b3V0IChmaWxsTGF5b3V0KTtcbiIpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuW2ldOwotCQkJY29kZS5hcHBlbmQoZ2V0Q2hpbGRDb2RlKGNvbnRyb2wsIGkpKTsKLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHRvIGluc2VydCB3aGVuIGEgbmV3IGNoaWxkIGNvbnRyb2wgaXMgYWRkZWQgdG8gdGhlIHRhYmxlLgotCSAqLwotCVN0cmluZ1tdIGdldEluc2VydFN0cmluZyAoU3RyaW5nIG5hbWUsIFN0cmluZyBjb250cm9sVHlwZSkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7bmFtZSwgY29udHJvbFR5cGV9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10geyAiQ29udHJvbCBOYW1lIiwgIkNvbnRyb2wgVHlwZSIgfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiRmlsbExheW91dCI7Ci0JfQotCQotCS8qKgotCSAqIFRha2VzIGluZm9ybWF0aW9uIGZyb20gVGFibGVFZGl0b3JzIGFuZCBzdG9yZXMgaXQuCi0JICovCi0Jdm9pZCByZXNldEVkaXRvcnMgKGJvb2xlYW4gdGFiKSB7Ci0JCVRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCXRyeSB7CQkJCQotCQkJCW5ldyBTdHJpbmcgKG5hbWVUZXh0LmdldFRleHQgKCkpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQluYW1lVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKE5BTUVfQ09MKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7bmFtZVRleHQuZ2V0VGV4dCAoKSwgY29tYm8uZ2V0VGV4dCAoKX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgVE9UQUxfQ09MUzsgaSsrKSB7Ci0JCQkJb2xkSXRlbS5zZXRUZXh0IChpLCAoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAocm93KSkgW2ldKTsKLQkJCX0KLQkJCWlmICghdGFiKSBkaXNwb3NlRWRpdG9ycyAoKTsKLQkJfQotCQlzZXRMYXlvdXRTdGF0ZSAoKTsKLQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAodHJ1ZSk7Ci0JCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXRTdGF0ZSAoKSB7Ci0JCWlmICh2ZXJ0aWNhbC5nZXRTZWxlY3Rpb24oKSkgewotCQkJZmlsbExheW91dC50eXBlID0gU1dULlZFUlRJQ0FMOwotCQl9IGVsc2UgewotCQkJZmlsbExheW91dC50eXBlID0gU1dULkhPUklaT05UQUw7Ci0JCX0KLQkJCi0JCS8qIFNldCB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyAqLwotCQlmaWxsTGF5b3V0Lm1hcmdpbldpZHRoID0gbWFyZ2luV2lkdGguZ2V0U2VsZWN0aW9uKCk7CQkKLQkJZmlsbExheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQuZ2V0U2VsZWN0aW9uKCk7CQkKLQkJZmlsbExheW91dC5zcGFjaW5nID0gc3BhY2luZy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0Zvcm1MYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRm9ybUxheW91dFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWEwY2JjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvRm9ybUxheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotY2xhc3MgRm9ybUxheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlTcGlubmVyIG1hcmdpbldpZHRoLCBtYXJnaW5IZWlnaHQsIG1hcmdpbkxlZnQsIG1hcmdpblJpZ2h0LCBtYXJnaW5Ub3AsIG1hcmdpbkJvdHRvbSwgc3BhY2luZzsKLQkvKiBUaGUgZXhhbXBsZSBsYXlvdXQgaW5zdGFuY2UgKi8KLQlGb3JtTGF5b3V0IGZvcm1MYXlvdXQ7Ci0JLyogVGFibGVFZGl0b3JzIGFuZCByZWxhdGVkIGNvbnRyb2xzKi8KLQlUYWJsZUVkaXRvciBuYW1lRWRpdG9yLCBjb21ib0VkaXRvciwgd2lkdGhFZGl0b3IsIGhlaWdodEVkaXRvcjsKLQlUYWJsZUVkaXRvciBsZWZ0RWRpdG9yLCByaWdodEVkaXRvciwgdG9wRWRpdG9yLCBib3R0b21FZGl0b3I7Ci0JQ0NvbWJvIGNvbWJvOwotCVRleHQgbmFtZVRleHQsIHdpZHRoVGV4dCwgaGVpZ2h0VGV4dDsKLQlCdXR0b24gbGVmdEF0dGFjaCwgcmlnaHRBdHRhY2gsIHRvcEF0dGFjaCwgYm90dG9tQXR0YWNoOwotCQotCS8qIENvbnN0YW50cyAqLwotCWZpbmFsIGludCBOQU1FX0NPTCA9IDA7Ci0JZmluYWwgaW50IENPTUJPX0NPTCA9IDE7Ci0JZmluYWwgaW50IFdJRFRIX0NPTCA9IDI7Ci0JZmluYWwgaW50IEhFSUdIVF9DT0wgPSAzOwotCWZpbmFsIGludCBMRUZUX0NPTCA9IDQ7Ci0JZmluYWwgaW50IFJJR0hUX0NPTCA9IDU7Ci0JZmluYWwgaW50IFRPUF9DT0wgPSA2OwotCWZpbmFsIGludCBCT1RUT01fQ09MID0gNzsKLQkKLQlmaW5hbCBpbnQgTU9ESUZZX0NPTFMgPSA0OwkvLyBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgd2l0aCBjb21ibyBvciB0ZXh0IGVkaXRvcnMKLQlmaW5hbCBpbnQgVE9UQUxfQ09MUyA9IDg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlGb3JtTGF5b3V0VGFiKExheW91dEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25zdGFudCBmb3IgdGhlIGFsaWdubWVudCBmb3IgYW4KLQkgKiBhdHRhY2htZW50IGdpdmVuIGEgc3RyaW5nLgotCSAqLwotCWludCBhbGlnbm1lbnRDb25zdGFudCAoU3RyaW5nIGFsaWduKSB7Ci0JCWlmIChhbGlnbi5lcXVhbHMoIkxFRlQiKSkgcmV0dXJuIFNXVC5MRUZUOwotCQlpZiAoYWxpZ24uZXF1YWxzKCJSSUdIVCIpKSByZXR1cm4gU1dULlJJR0hUOwotCQlpZiAoYWxpZ24uZXF1YWxzKCJUT1AiKSkgcmV0dXJuIFNXVC5UT1A7Ci0JCWlmIChhbGlnbi5lcXVhbHMoIkJPVFRPTSIpKSByZXR1cm4gU1dULkJPVFRPTTsKLQkJaWYgKGFsaWduLmVxdWFscygiQ0VOVEVSIikpIHJldHVybiBTV1QuQ0VOVEVSOwotCQlyZXR1cm4gU1dULkRFRkFVTFQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhbGlnbm1lbnQgZm9yIGFuCi0JICogYXR0YWNobWVudCBnaXZlbiBhIGNvbnN0YW50LgotCSAqLwotCVN0cmluZyBhbGlnbm1lbnRTdHJpbmcgKGludCBhbGlnbikgewotCQlzd2l0Y2ggKGFsaWduKSB7Ci0JCQljYXNlIFNXVC5MRUZUOiByZXR1cm4gIkxFRlQiOwotCQkJY2FzZSBTV1QuUklHSFQ6IHJldHVybiAiUklHSFQiOwotCQkJY2FzZSBTV1QuVE9QOiByZXR1cm4gIlRPUCI7Ci0JCQljYXNlIFNXVC5CT1RUT006IHJldHVybiAiQk9UVE9NIjsKLQkJCWNhc2UgU1dULkNFTlRFUjogcmV0dXJuICJDRU5URVIiOwotCQl9Ci0JCXJldHVybiAiREVGQVVMVCI7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYXR0YWNobWVudCBmaWVsZCBpbiBjYXNlIHRoZSB0eXBlIG9mIGNvbnRyb2wKLQkgKiBoYXMgY2hhbmdlZC4gCi0JICovCi0JU3RyaW5nIGNoZWNrQXR0YWNobWVudCAoU3RyaW5nIG9sZEF0dGFjaCwgRm9ybUF0dGFjaG1lbnQgbmV3QXR0YWNoKSB7Ci0JCVN0cmluZyBjb250cm9sQ2xhc3MgPSBuZXdBdHRhY2guY29udHJvbC5nZXRDbGFzcygpLnRvU3RyaW5nICgpOwotCQlTdHJpbmcgY29udHJvbFR5cGUgPSBjb250cm9sQ2xhc3Muc3Vic3RyaW5nIChjb250cm9sQ2xhc3MubGFzdEluZGV4T2YgKCcuJykgKyAxKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG9sZEF0dGFjaC5sZW5ndGggKCkgJiYgIUNoYXJhY3Rlci5pc0RpZ2l0KG9sZEF0dGFjaC5jaGFyQXQgKGkpKSkgewotCQkJaSsrOwotCQl9Ci0JCVN0cmluZyBpbmRleCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKGksIG9sZEF0dGFjaC5pbmRleE9mICgnLCcpKTsKLQkJcmV0dXJuIGNvbnRyb2xUeXBlICsgaW5kZXggKyAiLCIgKyBuZXdBdHRhY2gub2Zmc2V0ICsgIjoiICsgYWxpZ25tZW50U3RyaW5nIChuZXdBdHRhY2guYWxpZ25tZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd2lkZ2V0cyBpbiB0aGUgImNoaWxkIiBncm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkV2lkZ2V0cyAoKSB7Ci0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ2hpbGRXaWRnZXRzICgpOwotCQkKLQkJLyogUmVzaXplIHRoZSBjb2x1bW5zICovCi0JCXRhYmxlLmdldENvbHVtbiAoTEVGVF9DT0wpLnNldFdpZHRoICg5MCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoUklHSFRfQ09MKS5zZXRXaWR0aCAoOTApOwotCQl0YWJsZS5nZXRDb2x1bW4gKFRPUF9DT0wpLnNldFdpZHRoICg5MCk7Ci0JCXRhYmxlLmdldENvbHVtbiAoQk9UVE9NX0NPTCkuc2V0V2lkdGggKDkwKTsKLQkJCQkKLQkJLyogQWRkIFRhYmxlRWRpdG9ycyAqLwotCQluYW1lRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWNvbWJvRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXdpZHRoRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWhlaWdodEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlsZWZ0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXJpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXRvcEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlib3R0b21FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdGFibGUuYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzKCk7Ci0JCQkJaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZS54LCBlLnkpOwotICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSB0YWJsZS5nZXRJdGVtIChwdCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBvbGRJdGVtIHx8IG5ld0l0ZW0gIT0gbGFzdFNlbGVjdGVkKSB7Ci0JCQkJCWxhc3RTZWxlY3RlZCA9IG5ld0l0ZW07Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGFibGUuc2hvd1NlbGVjdGlvbiAoKTsKLQkJCQkKLQkJCQljb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuUkVBRF9PTkxZKTsKLQkJCQljcmVhdGVDb21ib0VkaXRvciAoY29tYm8sIGNvbWJvRWRpdG9yKTsKLQkJCQkKLQkJCQluYW1lVGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJbmFtZVRleHQuc2V0VGV4dCAoKChTdHJpbmdbXSlkYXRhLmVsZW1lbnRBdChpbmRleCkpW05BTUVfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvcihuYW1lVGV4dCwgbmFtZUVkaXRvciwgTkFNRV9DT0wpOwotCQkJCQotCQkJCXdpZHRoVGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtXSURUSF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yICh3aWR0aFRleHQsIHdpZHRoRWRpdG9yLCBXSURUSF9DT0wpOwotCQkJCQotCQkJCWhlaWdodFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW0hFSUdIVF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoZWlnaHRUZXh0LCBoZWlnaHRFZGl0b3IsIEhFSUdIVF9DT0wpOwotCQkJCQotCQkJCWxlZnRBdHRhY2ggPSBuZXcgQnV0dG9uICh0YWJsZSwgU1dULlBVU0gpOwotCQkJCWxlZnRBdHRhY2guc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkF0dGFjaF9FZGl0IikpOwotCQkJCWxlZnRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWxlZnRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWxlZnRFZGl0b3IubWluaW11bVdpZHRoID0gbGVmdEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCWxlZnRFZGl0b3Iuc2V0RWRpdG9yIChsZWZ0QXR0YWNoLCBuZXdJdGVtLCBMRUZUX0NPTCk7Ci0JCQkJbGVmdEF0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJU2hlbGwgc2hlbGwgPSB0YWJGb2xkZXJQYWdlLmdldFNoZWxsICgpOwotCQkJCQkJQXR0YWNoRGlhbG9nIGRpYWxvZyA9IG5ldyBBdHRhY2hEaWFsb2cgKHNoZWxsKTsKLQkJCQkJCWRpYWxvZy5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiTGVmdF9BdHRhY2htZW50IikpOwotCQkJCQkJZGlhbG9nLnNldENvbHVtbiAoTEVGVF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChMRUZUX0NPTCwgYXR0YWNoKTsKLQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCXJpZ2h0QXR0YWNoID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlyaWdodEF0dGFjaC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQXR0YWNoX0VkaXQiKSk7Ci0JCQkJcmlnaHRFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXJpZ2h0RWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlyaWdodEVkaXRvci5taW5pbXVtV2lkdGggPSByaWdodEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCXJpZ2h0RWRpdG9yLnNldEVkaXRvciAocmlnaHRBdHRhY2gsIG5ld0l0ZW0sIFJJR0hUX0NPTCk7Ci0JCQkJcmlnaHRBdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCQkJCUF0dGFjaERpYWxvZyBkaWFsb2cgPSBuZXcgQXR0YWNoRGlhbG9nIChzaGVsbCk7Ci0JCQkJCQlkaWFsb2cuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlJpZ2h0X0F0dGFjaG1lbnQiKSk7Ci0JCQkJCQlkaWFsb2cuc2V0Q29sdW1uIChSSUdIVF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChSSUdIVF9DT0wsIGF0dGFjaCk7Ci0JCQkJCQlpZiAobmV3SXRlbS5nZXRUZXh0IChMRUZUX0NPTCkuZW5kc1dpdGggKCIpIikpIG5ld0l0ZW0uc2V0VGV4dCAoTEVGVF9DT0wsICIiKTsKLQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCXRvcEF0dGFjaCA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuUFVTSCk7Ci0JCQkJdG9wQXR0YWNoLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJBdHRhY2hfRWRpdCIpKTsKLQkJCQl0b3BFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCXRvcEVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJdG9wRWRpdG9yLm1pbmltdW1XaWR0aCA9IHRvcEF0dGFjaC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQkJCXRvcEVkaXRvci5zZXRFZGl0b3IgKHRvcEF0dGFjaCwgbmV3SXRlbSwgVE9QX0NPTCk7Ci0JCQkJdG9wQXR0YWNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlTaGVsbCBzaGVsbCA9IHRhYkZvbGRlclBhZ2UuZ2V0U2hlbGwgKCk7Ci0JCQkJCQlBdHRhY2hEaWFsb2cgZGlhbG9nID0gbmV3IEF0dGFjaERpYWxvZyAoc2hlbGwpOwotCQkJCQkJZGlhbG9nLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJUb3BfQXR0YWNobWVudCIpKTsKLQkJCQkJCWRpYWxvZy5zZXRDb2x1bW4gKFRPUF9DT0wpOwotCQkJCQkJU3RyaW5nIGF0dGFjaCA9IGRpYWxvZy5vcGVuICgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0IChUT1BfQ09MLCBhdHRhY2gpOwotCQkJCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYm90dG9tQXR0YWNoID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5QVVNIKTsKLQkJCQlib3R0b21BdHRhY2guc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkF0dGFjaF9FZGl0IikpOwotCQkJCWJvdHRvbUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJYm90dG9tRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlib3R0b21FZGl0b3IubWluaW11bVdpZHRoID0gYm90dG9tQXR0YWNoLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCQkJYm90dG9tRWRpdG9yLnNldEVkaXRvciAoYm90dG9tQXR0YWNoLCBuZXdJdGVtLCBCT1RUT01fQ09MKTsKLQkJCQlib3R0b21BdHRhY2guYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVNoZWxsIHNoZWxsID0gdGFiRm9sZGVyUGFnZS5nZXRTaGVsbCAoKTsKLQkJCQkJCUF0dGFjaERpYWxvZyBkaWFsb2cgPSBuZXcgQXR0YWNoRGlhbG9nIChzaGVsbCk7Ci0JCQkJCQlkaWFsb2cuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkJvdHRvbV9BdHRhY2htZW50IikpOwotCQkJCQkJZGlhbG9nLnNldENvbHVtbiAoQk9UVE9NX0NPTCk7Ci0JCQkJCQlTdHJpbmcgYXR0YWNoID0gZGlhbG9nLm9wZW4gKCk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQgKEJPVFRPTV9DT0wsIGF0dGFjaCk7Ci0JCQkJCQlpZiAobmV3SXRlbS5nZXRUZXh0IChUT1BfQ09MKS5lbmRzV2l0aCAoIikiKSkgbmV3SXRlbS5zZXRUZXh0IChUT1BfQ09MLCAiIik7Ci0JCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotICAgICAgICAgICAgICAgIAlSZWN0YW5nbGUgcmVjdCA9IG5ld0l0ZW0uZ2V0Qm91bmRzIChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotICAgICAgICAgICAgICAgICAgICAJc3dpdGNoIChpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkJY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAJCQlyZXNldEVkaXRvcnMgKCk7Ci0gICAgICAgICAgICAgICAgICAgIAkJCWJyZWFrOwotCQkJCQkJCWNhc2UgQ09NQk9fQ09MIDoKLQkJCQkJCQkJY29tYm8uc2V0Rm9jdXMgKCk7CQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFdJRFRIX0NPTCA6CQotCQkJCQkJCQl3aWR0aFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSEVJR0hUX0NPTCA6Ci0JCQkJCQkJCWhlaWdodFRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0JCQl9Ci0JCX0pOwkJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbCB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMgKCkgewotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgRm9ybUxheW91dCAqLwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJNYXJnaW5zX1NwYWNpbmciKSk7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCAoMiwgZmFsc2UpKTsKLQkJbWFyZ2luR3JvdXAuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbldpZHRoLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luV2lkdGguYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luSGVpZ2h0Iik7Ci0JCW1hcmdpbkhlaWdodCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luSGVpZ2h0LnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5MZWZ0Iik7Ci0JCW1hcmdpbkxlZnQgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbkxlZnQuc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5MZWZ0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luUmlnaHQiKTsKLQkJbWFyZ2luUmlnaHQgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpblJpZ2h0LnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luUmlnaHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5Ub3AiKTsKLQkJbWFyZ2luVG9wID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5Ub3Auc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5Ub3AuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5Cb3R0b20iKTsKLQkJbWFyZ2luQm90dG9tID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5Cb3R0b20uc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5Cb3R0b20uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgic3BhY2luZyIpOwotCQlzcGFjaW5nID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQlzcGFjaW5nLnNldFNlbGVjdGlvbigwKTsKLQkJc3BhY2luZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dCAoKSB7Ci0JCWZvcm1MYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dCAoZm9ybUxheW91dCk7Ci0JfQotCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzICgpIHsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWNvbWJvLmRpc3Bvc2UgKCk7Ci0JCW5hbWVUZXh0LmRpc3Bvc2UgKCk7Ci0JCXdpZHRoVGV4dC5kaXNwb3NlICgpOwotCQloZWlnaHRUZXh0LmRpc3Bvc2UgKCk7Ci0JCWxlZnRBdHRhY2guZGlzcG9zZSAoKTsKLQkJcmlnaHRBdHRhY2guZGlzcG9zZSAoKTsKLQkJdG9wQXR0YWNoLmRpc3Bvc2UgKCk7Ci0JCWJvdHRvbUF0dGFjaC5kaXNwb3NlICgpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCQotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdEZvcm1MYXlvdXQgZm9ybUxheW91dCA9IG5ldyBGb3JtTGF5b3V0ICgpO1xuIik7Ci0JCWlmIChmb3JtTGF5b3V0Lm1hcmdpbldpZHRoICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZvcm1MYXlvdXQubWFyZ2luV2lkdGggPSAiICsgZm9ybUxheW91dC5tYXJnaW5XaWR0aCArICI7XG4iKTsKLQkJfQotCQlpZiAoZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSAiICsgZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJaWYoZm9ybUxheW91dC5tYXJnaW5MZWZ0ICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGZvcm1MYXlvdXQubWFyZ2luTGVmdCA9ICIgKyBmb3JtTGF5b3V0Lm1hcmdpbkxlZnQgKyAiO1xuIik7Ci0JCX0KLQkJaWYoZm9ybUxheW91dC5tYXJnaW5SaWdodCAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRmb3JtTGF5b3V0Lm1hcmdpblJpZ2h0ID0gIiArIGZvcm1MYXlvdXQubWFyZ2luUmlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJaWYoZm9ybUxheW91dC5tYXJnaW5Ub3AgIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5Ub3AgPSAiICsgZm9ybUxheW91dC5tYXJnaW5Ub3AgKyAiO1xuIik7Ci0JCX0KLQkJaWYoZm9ybUxheW91dC5tYXJnaW5Cb3R0b20gIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Zm9ybUxheW91dC5tYXJnaW5Cb3R0b20gPSAiICsgZm9ybUxheW91dC5tYXJnaW5Cb3R0b20gKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGZvcm1MYXlvdXQuc3BhY2luZyAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRmb3JtTGF5b3V0LnNwYWNpbmcgPSAiICsgZm9ybUxheW91dC5zcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHNoZWxsLnNldExheW91dCAoZm9ybUxheW91dCk7XG4iKTsKLQkJCi0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbiBbaV07Ci0JCQljb2RlLmFwcGVuZCAoZ2V0Q2hpbGRDb2RlIChjb250cm9sLCBpKSk7Ci0JCQlGb3JtRGF0YSBkYXRhID0gKEZvcm1EYXRhKSBjb250cm9sLmdldExheW91dERhdGEgKCk7Ci0JCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0Iik7Ci0JCQkJaWYgKGZpcnN0KSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiRm9ybURhdGEgIik7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBGb3JtRGF0YSAoKTtcbiIpOwkKLQkJCQlpZiAoZGF0YS53aWR0aCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLndpZHRoID0gIiArIGRhdGEud2lkdGggKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLmhlaWdodCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhlaWdodCA9ICIgKyBkYXRhLmhlaWdodCArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEubGVmdCAhPSBudWxsKSB7Ci0JCQkJCWlmIChkYXRhLmxlZnQuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKExFRlRfQ09MKTsKLQkJCQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChjb250cm9sU3RyaW5nLnN1YnN0cmluZyAoY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpIC0gMSwgY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpKSkuaW50VmFsdWUgKCk7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBuYW1lcyBbaW5kZXhdICsgIiwgIiArIGRhdGEubGVmdC5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS5sZWZ0LmFsaWdubWVudCkgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGRhdGEucmlnaHQgIT0gbnVsbCB8fCAoZGF0YS5sZWZ0Lm51bWVyYXRvciAhPSAwIHx8ZGF0YS5sZWZ0Lm9mZnNldCAhPSAwKSkgewotCQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEubGVmdC5udW1lcmF0b3IgKyAiLCAiICsgZGF0YS5sZWZ0Lm9mZnNldCArICIpO1xuIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRhdGEucmlnaHQgIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS5yaWdodC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCQlTdHJpbmcgY29udHJvbFN0cmluZyA9IGl0ZW0uZ2V0VGV4dCAoUklHSFRfQ09MKTsKLQkJCQkJCWludCBpbmRleCA9IG5ldyBJbnRlZ2VyIChjb250cm9sU3RyaW5nLnN1YnN0cmluZyAoY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpIC0gMSwgY29udHJvbFN0cmluZy5pbmRleE9mICgnLCcpKSkuaW50VmFsdWUgKCk7Ci0JCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLnJpZ2h0Lm9mZnNldCArICIsIFNXVC4iICsgYWxpZ25tZW50U3RyaW5nIChkYXRhLnJpZ2h0LmFsaWdubWVudCkgKyAiKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEucmlnaHQubnVtZXJhdG9yICsgIiwgIiArIGRhdGEucmlnaHQub2Zmc2V0ICsgIik7XG4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGF0YS50b3AgIT0gbnVsbCkgewotCQkJCQlpZiAoZGF0YS50b3AuY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCQkJU3RyaW5nIGNvbnRyb2xTdHJpbmcgPSBpdGVtLmdldFRleHQgKFRPUF9DT0wpOwotCQkJCQkJaW50IGluZGV4ID0gbmV3IEludGVnZXIgKGNvbnRyb2xTdHJpbmcuc3Vic3RyaW5nIChjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykgLSAxLCBjb250cm9sU3RyaW5nLmluZGV4T2YgKCcsJykpKS5pbnRWYWx1ZSAoKTsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgbmFtZXMgW2luZGV4XSArICIsICIgKyBkYXRhLnRvcC5vZmZzZXQgKyAiLCBTV1QuIiArIGFsaWdubWVudFN0cmluZyAoZGF0YS50b3AuYWxpZ25tZW50KSArICIpO1xuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoZGF0YS5ib3R0b20gIT0gbnVsbCB8fCAoZGF0YS50b3AubnVtZXJhdG9yICE9IDAgfHxkYXRhLnRvcC5vZmZzZXQgIT0gMCkpIHsKLQkJCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAoIiArIGRhdGEudG9wLm51bWVyYXRvciArICIsICIgKyBkYXRhLnRvcC5vZmZzZXQgKyAiKTtcbiIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkYXRhLmJvdHRvbSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkYXRhLmJvdHRvbS5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCQlTdHJpbmcgY29udHJvbFN0cmluZyA9IGl0ZW0uZ2V0VGV4dCAoQk9UVE9NX0NPTCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBuZXcgSW50ZWdlciAoY29udHJvbFN0cmluZy5zdWJzdHJpbmcgKGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSAtIDEsIGNvbnRyb2xTdHJpbmcuaW5kZXhPZiAoJywnKSkpLmludFZhbHVlICgpOwotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKCIgKyBuYW1lcyBbaW5kZXhdICsgIiwgIiArIGRhdGEuYm90dG9tLm9mZnNldCArICIsIFNXVC4iICsgYWxpZ25tZW50U3RyaW5nIChkYXRhLmJvdHRvbS5hbGlnbm1lbnQpICsgIik7XG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgiICsgZGF0YS5ib3R0b20ubnVtZXJhdG9yICsgIiwgIiArIGRhdGEuYm90dG9tLm9mZnNldCArICIpO1xuIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7XG4iKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHRvIGluc2VydCB3aGVuIGEgbmV3IGNoaWxkIGNvbnRyb2wgaXMgYWRkZWQgdG8gdGhlIHRhYmxlLgotCSAqLwotCVN0cmluZ1tdIGdldEluc2VydFN0cmluZyAoU3RyaW5nIG5hbWUsIFN0cmluZyBjb250cm9sVHlwZSkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7bmFtZSwgY29udHJvbFR5cGUsICItMSIsICItMSIsCi0JCQkJIjAsMCAoIiArIExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJEZWZhdWx0IikgKyAiKSIsICIiLCAKLQkJCQkiMCwwICgiICsgTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkRlZmF1bHQiKSArICIpIiwgIiJ9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10gewotCQkJIkNvbnRyb2wgTmFtZSIsCi0JCQkiQ29udHJvbCBUeXBlIiwgCi0JCQkid2lkdGgiLCAKLQkJCSJoZWlnaHQiLCAKLQkJCSJsZWZ0IiwgCi0JCQkicmlnaHQiLCAKLQkJCSJ0b3AiLCAKLQkJCSJib3R0b20iCi0JCX07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkZvcm1MYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCXRyeSB7Ci0JCQkJbmV3IFN0cmluZyAobmFtZVRleHQuZ2V0VGV4dCAoKSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW5hbWVUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoTkFNRV9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHdpZHRoVGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoV0lEVEhfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyKGhlaWdodFRleHQuZ2V0VGV4dCgpKS5pbnRWYWx1ZSgpOwotCQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0KEhFSUdIVF9DT0wpKTsKLQkJCX0KLQkJCVN0cmluZ1tdIGluc2VydCA9IG5ldyBTdHJpbmcgW10ge25hbWVUZXh0LmdldFRleHQoKSwgY29tYm8uZ2V0VGV4dCAoKSwgd2lkdGhUZXh0LmdldFRleHQgKCksIGhlaWdodFRleHQuZ2V0VGV4dCAoKX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgTU9ESUZZX0NPTFM7IGkrKykgewotCQkJCW9sZEl0ZW0uc2V0VGV4dCAoaSwgKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKHJvdykpIFtpXSk7Ci0JCQl9Ci0JCQlpZiAoIXRhYikgZGlzcG9zZUVkaXRvcnMgKCk7Ci0JCX0KLQkJc2V0TGF5b3V0U3RhdGUgKCk7Ci0JCXJlZnJlc2hMYXlvdXRDb21wb3NpdGUgKCk7Ci0JCXNldExheW91dERhdGEgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5sYXlvdXQgKHRydWUpOwotCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluaXRpYWwgd2VpZ2h0IG9mIHRoZSBsYXlvdXQgYW5kIGNvbnRyb2wgZ3JvdXBzIHdpdGhpbiB0aGUgU2FzaEZvcm0uCi0JICogQHJldHVybiB0aGUgZGVzaXJlZCBzYXNoIHdlaWdodHMgZm9yIHRoZSB0YWIgcGFnZQotCSAqLwotCWludFtdIHNhc2hXZWlnaHRzICgpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7NDAsIDYwfTsJCQotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gYXR0YWNobWVudCB0byB0aGUgZWRnZSBvZiBhIHdpZGdldCB1c2luZyB0aGUKLQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgdGFibGUuCi0JICovCi0JRm9ybUF0dGFjaG1lbnQgc2V0QXR0YWNobWVudCAoU3RyaW5nIGF0dGFjaG1lbnQpIHsKLQkJU3RyaW5nIGNvbnRyb2wsIGFsaWduOwotCQlpbnQgcG9zaXRpb24sIG9mZnNldDsKLQkJaW50IGNvbW1hID0gYXR0YWNobWVudC5pbmRleE9mICgnLCcpOwotCQljaGFyIGZpcnN0ID0gYXR0YWNobWVudC5jaGFyQXQgKDApOwotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGZpcnN0KSkgewotCQkJLyogQ2FzZSB3aGVyZSB0aGVyZSBpcyBhIGNvbnRyb2wgKi8KLQkJCWNvbnRyb2wgPSBhdHRhY2htZW50LnN1YnN0cmluZyAoMCwgY29tbWEpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBjb250cm9sLmxlbmd0aCAoKSAmJiAhQ2hhcmFjdGVyLmlzRGlnaXQgKGNvbnRyb2wuY2hhckF0IChpKSkpIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlTdHJpbmcgZW5kID0gY29udHJvbC5zdWJzdHJpbmcgKGkpOwotCQkJaW50IGluZGV4ID0gbmV3IEludGVnZXIgKGVuZCkuaW50VmFsdWUgKCk7Ci0JCQlDb250cm9sIGF0dGFjaENvbnRyb2wgPSBjaGlsZHJlbiBbaW5kZXhdOwotCQkJaW50IGNvbG9uID0gYXR0YWNobWVudC5pbmRleE9mICgnOicpOwotCQkJdHJ5IHsKLQkJCQlvZmZzZXQgPSBuZXcgSW50ZWdlciAoYXR0YWNobWVudC5zdWJzdHJpbmcgKGNvbW1hICsgMSwgY29sb24pKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2Zmc2V0ID0gMDsKLQkJCX0KLQkJCWFsaWduID0gYXR0YWNobWVudC5zdWJzdHJpbmcgKGNvbG9uICsgMSk7Ci0JCQlyZXR1cm4gbmV3IEZvcm1BdHRhY2htZW50IChhdHRhY2hDb250cm9sLCBvZmZzZXQsIGFsaWdubWVudENvbnN0YW50IChhbGlnbikpOwotCQl9IGVsc2UgewotCQkJLyogQ2FzZSB3aGVyZSB0aGVyZSBpcyBhIHBvc2l0aW9uICovCi0JCQl0cnkgewotCQkJCXBvc2l0aW9uID0gbmV3IEludGVnZXIgKGF0dGFjaG1lbnQuc3Vic3RyaW5nICgwLGNvbW1hKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXBvc2l0aW9uID0gMDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJb2Zmc2V0ID0gbmV3IEludGVnZXIgKGF0dGFjaG1lbnQuc3Vic3RyaW5nIChjb21tYSArIDEpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2Zmc2V0ID0gMDsKLQkJCX0KLQkJCXJldHVybiBuZXcgRm9ybUF0dGFjaG1lbnQgKHBvc2l0aW9uLCBvZmZzZXQpOwkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQlGb3JtRGF0YSBkYXRhOwotCQlpbnQgd2lkdGgsIGhlaWdodDsKLQkJU3RyaW5nIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJd2lkdGggPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKFdJRFRIX0NPTCkpLmludFZhbHVlICgpOwotCQkJaGVpZ2h0ID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChIRUlHSFRfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCQkJaWYgKHdpZHRoID4gMCkgZGF0YS53aWR0aCA9IHdpZHRoOwotCQkJaWYgKGhlaWdodCA+IDApIGRhdGEuaGVpZ2h0ID0gaGVpZ2h0OwotCQkJCi0JCQlsZWZ0ID0gaXRlbXMgW2ldLmdldFRleHQgKExFRlRfQ09MKTsKLQkJCWlmIChsZWZ0Lmxlbmd0aCAoKSA+IDApIHsKLQkJCQlkYXRhLmxlZnQgPSBzZXRBdHRhY2htZW50IChsZWZ0KTsKLQkJCQlpZiAoZGF0YS5sZWZ0LmNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudCA9IGNoZWNrQXR0YWNobWVudCAobGVmdCwgZGF0YS5sZWZ0KTsKLQkJCQkJaXRlbXMgW2ldLnNldFRleHQgKExFRlRfQ09MLCBhdHRhY2htZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyaWdodCA9IGl0ZW1zIFtpXS5nZXRUZXh0IChSSUdIVF9DT0wpOwotCQkJaWYgKHJpZ2h0Lmxlbmd0aCAoKSA+IDApIHsKLQkJCQlkYXRhLnJpZ2h0ID0gc2V0QXR0YWNobWVudCAocmlnaHQpOwotCQkJCWlmIChkYXRhLnJpZ2h0LmNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudCA9IGNoZWNrQXR0YWNobWVudCAocmlnaHQsIGRhdGEucmlnaHQpOwotCQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoUklHSFRfQ09MLCBhdHRhY2htZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQl0b3AgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoVE9QX0NPTCk7Ci0JCQlpZiAodG9wLmxlbmd0aCAoKSA+IDAgKSB7Ci0JCQkJZGF0YS50b3AgPSBzZXRBdHRhY2htZW50ICh0b3ApOwotCQkJCWlmIChkYXRhLnRvcC5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSBjaGVja0F0dGFjaG1lbnQgKHRvcCwgZGF0YS50b3ApOwotCQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoVE9QX0NPTCwgYXR0YWNobWVudCk7Ci0JCQkJfQotCQkJfQotCQkJYm90dG9tID0gaXRlbXMgW2ldLmdldFRleHQgKEJPVFRPTV9DT0wpOwotCQkJaWYgKGJvdHRvbS5sZW5ndGggKCkgPiAwKSB7Ci0JCQkJZGF0YS5ib3R0b20gPSBzZXRBdHRhY2htZW50IChib3R0b20pOwotCQkJCWlmIChkYXRhLmJvdHRvbS5jb250cm9sICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSBjaGVja0F0dGFjaG1lbnQgKGJvdHRvbSwgZGF0YS5ib3R0b20pOwotCQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoQk9UVE9NX0NPTCwgYXR0YWNobWVudCk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGRyZW4gW2ldLnNldExheW91dERhdGEgKGRhdGEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXRTdGF0ZSAoKSB7Ci0JCS8qIFNldCB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyAqLwotCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gbWFyZ2luV2lkdGguZ2V0U2VsZWN0aW9uICgpOwkJCi0JCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0LmdldFNlbGVjdGlvbiAoKTsJCQotCQlmb3JtTGF5b3V0Lm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0LmdldFNlbGVjdGlvbiAoKTsKLQkJZm9ybUxheW91dC5tYXJnaW5SaWdodCA9IG1hcmdpblJpZ2h0LmdldFNlbGVjdGlvbiAoKTsKLQkJZm9ybUxheW91dC5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3AuZ2V0U2VsZWN0aW9uICgpOwotCQlmb3JtTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IG1hcmdpbkJvdHRvbS5nZXRTZWxlY3Rpb24gKCk7Ci0JCWZvcm1MYXlvdXQuc3BhY2luZyA9IHNwYWNpbmcuZ2V0U2VsZWN0aW9uICgpOwotCX0JCi0JCi0JLyoqCi0JICogPGNvZGU+QXR0YWNoRGlhbG9nPC9jb2RlPiBpcyB0aGUgY2xhc3MgdGhhdCBjcmVhdGVzIGEKLQkgKiBkaWFsb2cgc3BlY2lmaWMgZm9yIHRoaXMgZXhhbXBsZS4gSXQgY3JlYXRlcyBhIGRpYWxvZwotCSAqIHdpdGggY29udHJvbHMgdG8gc2V0IHRoZSB2YWx1ZXMgaW4gYSBGb3JtQXR0YWNobWVudC4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgQXR0YWNoRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOwotCQlTdHJpbmcgY29udHJvbElucHV0LCBwb3NpdGlvbklucHV0LCBhbGlnbm1lbnRJbnB1dCwgb2Zmc2V0SW5wdXQ7Ci0JCWludCBjb2wgPSAwOwotCQkKLQkJcHVibGljIEF0dGFjaERpYWxvZyAoU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKLQkJfQotCQkKLQkJcHVibGljIEF0dGFjaERpYWxvZyAoU2hlbGwgcGFyZW50KSB7Ci0JCQl0aGlzIChwYXJlbnQsIDApOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4gKGludCBjb2wpIHsKLQkJCXRoaXMuY29sID0gY29sOwotCQl9Ci0JIAotCQlwdWJsaWMgU3RyaW5nIG9wZW4gKCkgewotCQkJU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50ICgpOwotCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKHBhcmVudCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCXNoZWxsLnNldFRleHQgKGdldFRleHQgKCkpOwotCQkJc2hlbGwuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoMywgdHJ1ZSkpOwotCQkJCi0JCQkvKiBGaW5kIG91dCB3aGF0IHdhcyBwcmV2aW91c2x5IHNldCBhcyBhbiBhdHRhY2htZW50ICovCi0JCQlUYWJsZUl0ZW0gbmV3SXRlbSA9IGxlZnRFZGl0b3IuZ2V0SXRlbSAoKTsKLQkJCXJlc3VsdCA9IG5ld0l0ZW0uZ2V0VGV4dCAoY29sKTsKLQkJCVN0cmluZyBvbGRBdHRhY2ggPSByZXN1bHQ7Ci0JCQlTdHJpbmcgb2xkUG9zID0gIjAiLCBvbGRDb250cm9sID0gIiIsIG9sZEFsaWduID0gIkRFRkFVTFQiLCBvbGRPZmZzZXQgPSAiMCI7Ci0JCQlib29sZWFuIGlzQ29udHJvbCA9IGZhbHNlOwotCQkJaWYgKG9sZEF0dGFjaC5sZW5ndGggKCkgIT0gMCkgewotCQkJCWNoYXIgZmlyc3QgPSBvbGRBdHRhY2guY2hhckF0ICgwKTsKLQkJCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGZpcnN0KSkgewotCQkJCQkvKiBXZSBoYXZlIGEgY29udHJvbCAqLwotCQkJCQlpc0NvbnRyb2wgPSB0cnVlOwotCQkJCQlvbGRDb250cm9sID0gb2xkQXR0YWNoLnN1YnN0cmluZyAoMCwgb2xkQXR0YWNoLmluZGV4T2YgKCcsJykpOwotCQkJCQlvbGRBbGlnbiA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKG9sZEF0dGFjaC5pbmRleE9mICgnOicpICsgMSk7Ci0JCQkJCW9sZE9mZnNldCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKG9sZEF0dGFjaC5pbmRleE9mICgnLCcpICsgMSwgb2xkQXR0YWNoLmluZGV4T2YgKCc6JykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIFdlIGhhdmUgYSBwb3NpdGlvbiAqLwotCQkJCQlvbGRQb3MgPSBvbGRBdHRhY2guc3Vic3RyaW5nICgwLCBvbGRBdHRhY2guaW5kZXhPZiAoJywnKSk7Ci0JCQkJCW9sZE9mZnNldCA9IG9sZEF0dGFjaC5zdWJzdHJpbmcgKG9sZEF0dGFjaC5pbmRleE9mICgnLCcpICsgMSk7Ci0JCQkJCWlmIChvbGRPZmZzZXQuZW5kc1dpdGggKCIpIikpIHsgLy8gaS5lLiAoRGVmYXVsdCkKLQkJCQkJCW9sZE9mZnNldCA9IG9sZE9mZnNldC5zdWJzdHJpbmcgKDAsIG9sZE9mZnNldC5pbmRleE9mICgnICcpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyogQWRkIHBvc2l0aW9uIGZpZWxkICovCi0JCQlmaW5hbCBCdXR0b24gcG9zQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5SQURJTyk7Ci0JCQlwb3NCdXR0b24uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlBvc2l0aW9uIikpOwotCQkJcG9zQnV0dG9uLnNldFNlbGVjdGlvbiAoIWlzQ29udHJvbCk7CQkJCi0JCQlmaW5hbCBDb21ibyBwb3NpdGlvbiA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5OT05FKTsKLQkJCXBvc2l0aW9uLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiMCIsIjI1IiwiMzMiLCI1MCIsIjY3IiwiNzUiLCIxMDAifSk7Ci0JCQlwb3NpdGlvbi5zZXRWaXNpYmxlSXRlbUNvdW50ICg3KTsKLQkJCXBvc2l0aW9uLnNldFRleHQgKG9sZFBvcyk7Ci0JCQlwb3NpdGlvbi5zZXRFbmFibGVkICghaXNDb250cm9sKTsJCQkKLQkJCXBvc2l0aW9uLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCQkKLQkJCS8qIEFkZCBjb250cm9sIGZpZWxkICovCi0JCQlmaW5hbCBCdXR0b24gY29udEJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUkFESU8pOwotCQkJY29udEJ1dHRvbi5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiQ29udHJvbCIpKTsKLQkJCWNvbnRCdXR0b24uc2V0U2VsZWN0aW9uIChpc0NvbnRyb2wpOwotCQkJZmluYWwgQ29tYm8gY29udHJvbCA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5SRUFEX09OTFkpOwotCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCQlUYWJsZUl0ZW0gY3VycmVudEl0ZW0gPSBsZWZ0RWRpdG9yLmdldEl0ZW0gKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKTsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW1zIFtpXS5nZXRUZXh0ICgwKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKGl0ZW1zIFtpXSAhPSBjdXJyZW50SXRlbSkgewotCQkJCQkJY29udHJvbC5hZGQgKGl0ZW1zIFtpXS5nZXRUZXh0IChDT01CT19DT0wpICsgaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2xkQ29udHJvbC5sZW5ndGggKCkgIT0gMCkgY29udHJvbC5zZXRUZXh0IChvbGRDb250cm9sKTsKLQkJCWVsc2UgY29udHJvbC5zZWxlY3QgKDApOwotCQkJY29udHJvbC5zZXRFbmFibGVkIChpc0NvbnRyb2wpOwotCQkJY29udHJvbC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCQkJCi0JCQkvKiBBZGQgYWxpZ25tZW50IGZpZWxkICovCi0JCQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSkuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkFsaWdubWVudCIpKTsKLQkJCWZpbmFsIENvbWJvIGFsaWdubWVudCA9IG5ldyBDb21ibyAoc2hlbGwsIFNXVC5OT05FKTsKLQkJCVN0cmluZ1tdIGFsaWdubWVudFZhbHVlczsKLQkJCWlmIChjb2wgPT0gTEVGVF9DT0wgfHwgY29sID09IFJJR0hUX0NPTCkgewotCQkJCWFsaWdubWVudFZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyJTV1QuTEVGVCIsICJTV1QuUklHSFQiLCAiU1dULkNFTlRFUiIsICJTV1QuREVGQVVMVCJ9OwotCQkJfSBlbHNlIHsKLQkJCQkvLyBjb2wgPT0gVE9QX0NPTCB8fCBjb2wgPT0gQk9UVE9NX0NPTAotCQkJCWFsaWdubWVudFZhbHVlcyA9IG5ldyBTdHJpbmcgW10geyJTV1QuVE9QIiwgIlNXVC5CT1RUT00iLCAiU1dULkNFTlRFUiIsICJTV1QuREVGQVVMVCJ9OwotCQkJfQotCQkJYWxpZ25tZW50LnNldEl0ZW1zIChhbGlnbm1lbnRWYWx1ZXMpOwotCQkJYWxpZ25tZW50LnNldFRleHQgKCJTV1QuIiArIG9sZEFsaWduKTsKLQkJCWFsaWdubWVudC5zZXRFbmFibGVkIChpc0NvbnRyb2wpOwotCQkJYWxpZ25tZW50LnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCQkKLQkJCS8qIEFkZCBvZmZzZXQgZmllbGQgKi8KLQkJCW5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiT2Zmc2V0IikpOwotCQkJZmluYWwgVGV4dCBvZmZzZXQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCW9mZnNldC5zZXRUZXh0IChvbGRPZmZzZXQpOwotCQkJb2Zmc2V0LnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0JCQkKLQkJCS8qIEFkZCBsaXN0ZW5lcnMgZm9yIGNob29zaW5nIGJldHdlZW4gcG9zaXRpb24gYW5kIGNvbnRyb2wgKi8KLQkJCXBvc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXBvc2l0aW9uLnNldEVuYWJsZWQgKHRydWUpOwotCQkJCQljb250cm9sLnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCQkJYWxpZ25tZW50LnNldEVuYWJsZWQgKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWNvbnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlwb3NpdGlvbi5zZXRFbmFibGVkIChmYWxzZSk7Ci0JCQkJCWNvbnRyb2wuc2V0RW5hYmxlZCAodHJ1ZSk7Ci0JCQkJCWFsaWdubWVudC5zZXRFbmFibGVkICh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJQnV0dG9uIGNsZWFyID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJCWNsZWFyLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDbGVhciIpKTsKLQkJCWNsZWFyLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkVORCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQljbGVhci5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXJlc3VsdCA9ICIiOwotCQkJCQlzaGVsbC5jbG9zZSAoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCS8qIE9LIGJ1dHRvbiBzZXRzIGRhdGEgaW50byB0YWJsZSAqLwotCQkJQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJPSyIpKTsKLQkJCW9rLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlvay5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWNvbnRyb2xJbnB1dCA9IGNvbnRyb2wuZ2V0VGV4dCAoKTsKLQkJCQkJYWxpZ25tZW50SW5wdXQgPSBhbGlnbm1lbnQuZ2V0VGV4dCAoKS5zdWJzdHJpbmcgKDQpOwotCQkJCQlwb3NpdGlvbklucHV0ID0gcG9zaXRpb24uZ2V0VGV4dCAoKTsKLQkJCQkJaWYgKHBvc2l0aW9uSW5wdXQubGVuZ3RoICgpID09IDApIHBvc2l0aW9uSW5wdXQgPSAiMCI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXcgSW50ZWdlciAocG9zaXRpb25JbnB1dCkuaW50VmFsdWUgKCk7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHQpIHsKLQkJCQkJCXBvc2l0aW9uSW5wdXQgPSAiMCI7Ci0JCQkJCX0KLQkJCQkJb2Zmc2V0SW5wdXQgPSBvZmZzZXQuZ2V0VGV4dCAoKTsKLQkJCQkJaWYgKG9mZnNldElucHV0Lmxlbmd0aCAoKSA9PSAwKSBvZmZzZXRJbnB1dCA9ICIwIjsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5ldyBJbnRlZ2VyIChvZmZzZXRJbnB1dCkuaW50VmFsdWUgKCk7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHQpIHsKLQkJCQkJCW9mZnNldElucHV0ID0gIjAiOwotCQkJCQl9Ci0JCQkJCWlmIChwb3NCdXR0b24uZ2V0U2VsZWN0aW9uKCkgfHwgY29udHJvbElucHV0Lmxlbmd0aCAoKSA9PSAwKSB7Ci0JCQkJCQlyZXN1bHQgPSBwb3NpdGlvbklucHV0ICsgIiwiICsgb2Zmc2V0SW5wdXQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXN1bHQgPSBjb250cm9sSW5wdXQgKyAiLCIgKyBvZmZzZXRJbnB1dCArICI6IiArIGFsaWdubWVudElucHV0OwotCQkJCQl9Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJQnV0dG9uIGNhbmNlbCA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCQljYW5jZWwuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNhbmNlbCIpKTsKLQkJCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uIChvayk7Ci0JCQlzaGVsbC5wYWNrICgpOwotCQkJLyogQ2VudGVyIHRoZSBkaWFsb2cgKi8KLQkJCVBvaW50IGNlbnRlciA9IHBhcmVudC5nZXRMb2NhdGlvbiAoKTsKLQkJCWNlbnRlci54ID0gY2VudGVyLnggKyAocGFyZW50LmdldEJvdW5kcyAoKS53aWR0aCAvIDIpIC0gKHNoZWxsLmdldEJvdW5kcyAoKS53aWR0aCAvIDIpOwotCQkJY2VudGVyLnkgPSBjZW50ZXIueSArIChwYXJlbnQuZ2V0Qm91bmRzICgpLmhlaWdodCAvIDIpIC0gKHNoZWxsLmdldEJvdW5kcyAoKS5oZWlnaHQgLyAyKTsKLQkJCXNoZWxsLnNldExvY2F0aW9uIChjZW50ZXIpOwotCQkJc2hlbGwub3BlbiAoKTsKLQkJCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJCWlmIChkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvR3JpZExheW91dFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9HcmlkTGF5b3V0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NGZlZjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9HcmlkTGF5b3V0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1jbGFzcyBHcmlkTGF5b3V0VGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBDb250cm9scyBmb3Igc2V0dGluZyBsYXlvdXQgcGFyYW1ldGVycyAqLwotCVNwaW5uZXIgbnVtQ29sdW1uczsKLQlCdXR0b24gbWFrZUNvbHVtbnNFcXVhbFdpZHRoOwotCVNwaW5uZXIgbWFyZ2luV2lkdGgsIG1hcmdpbkhlaWdodCwgbWFyZ2luTGVmdCwgbWFyZ2luUmlnaHQsIG1hcmdpblRvcCwgbWFyZ2luQm90dG9tLCBob3Jpem9udGFsU3BhY2luZywgdmVydGljYWxTcGFjaW5nOwotCS8qIFRoZSBleGFtcGxlIGxheW91dCBpbnN0YW5jZSAqLwotCUdyaWRMYXlvdXQgZ3JpZExheW91dDsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIG5hbWVFZGl0b3IsIGNvbWJvRWRpdG9yLCB3aWR0aEVkaXRvciwgaGVpZ2h0RWRpdG9yOwotCVRhYmxlRWRpdG9yIHZBbGlnbkVkaXRvciwgaEFsaWduRWRpdG9yLCBoR3JhYkVkaXRvciwgdkdyYWJFZGl0b3IsIGhTcGFuRWRpdG9yLCB2U3BhbkVkaXRvcjsKLQlUYWJsZUVkaXRvciBoSW5kZW50RWRpdG9yLCB2SW5kZW50RWRpdG9yLCBtaW5XaWR0aEVkaXRvciwgbWluSGVpZ2h0RWRpdG9yLCBleGNsdWRlRWRpdG9yOwotCUNDb21ibyBjb21ibywgdkFsaWduLCBoQWxpZ24sIGhHcmFiLCB2R3JhYiwgZXhjbHVkZTsKLQlUZXh0IG5hbWVUZXh0LCB3aWR0aFRleHQsIGhlaWdodFRleHQsIGhTcGFuLCB2U3BhbiwgaEluZGVudCwgdkluZGVudCwgbWluV2lkdGhUZXh0LCBtaW5IZWlnaHRUZXh0OwotCS8qIENvbnN0YW50cyAqLwotCXN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0wgPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgQ09NQk9fQ09MID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IFdJRFRIX0NPTCA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBIRUlHSFRfQ09MID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IEhBTElHTl9DT0wgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgVkFMSUdOX0NPTCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBIR1JBQl9DT0wgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgVkdSQUJfQ09MID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IEhTUEFOX0NPTCA9IDg7Ci0Jc3RhdGljIGZpbmFsIGludCBWU1BBTl9DT0wgPSA5OwotCXN0YXRpYyBmaW5hbCBpbnQgSElOREVOVF9DT0wgPSAxMDsKLQlzdGF0aWMgZmluYWwgaW50IFZJTkRFTlRfQ09MID0gMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBNSU5XSURUSF9DT0wgPSAxMjsKLQlzdGF0aWMgZmluYWwgaW50IE1JTkhFSUdIVF9DT0wgPSAxMzsKLQlzdGF0aWMgZmluYWwgaW50IEVYQ0xVREVfQ09MID0gMTQ7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBUT1RBTF9DT0xTID0gMTU7Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCUdyaWRMYXlvdXRUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQlzdXBlcihpbnN0YW5jZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgaW4gdGhlICJjaGlsZCIgZ3JvdXAuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMgKCkgewotCQkvKiBDcmVhdGUgdGhlIFRyYXZlcnNlTGlzdGVuZXIgKi8KLQkJZmluYWwgVHJhdmVyc2VMaXN0ZW5lciB0cmF2ZXJzZUxpc3RlbmVyID0gbmV3IFRyYXZlcnNlTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkIChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTiB8fCBlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpCi0JCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkKLQkJCQkJZGlzcG9zZUVkaXRvcnMgKCk7Ci0JCQl9Ci0JCX07Ci0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cyAoKTsKLQkJCQotCQkvKiBBZGQgaG92ZXJzIHRvIHRoZSBjb2x1bW4gaGVhZGVycyB3aG9zZSBmaWVsZCBuYW1lcyBoYXZlIGJlZW4gc2hvcnRlbmVkIHRvIHNhdmUgc3BhY2UgKi8KLQkJdGFibGUuZ2V0Q29sdW1uIChIQUxJR05fQ09MKS5zZXRUb29sVGlwVGV4dCAoImhvcml6b250YWxBbGlnbm1lbnQiKTsKLQkJdGFibGUuZ2V0Q29sdW1uIChWQUxJR05fQ09MKS5zZXRUb29sVGlwVGV4dCAoInZlcnRpY2FsQWxpZ25tZW50Iik7Ci0JCXRhYmxlLmdldENvbHVtbiAoSEdSQUJfQ09MKS5zZXRUb29sVGlwVGV4dCAoImdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UiKTsKLQkJdGFibGUuZ2V0Q29sdW1uIChWR1JBQl9DT0wpLnNldFRvb2xUaXBUZXh0ICgiZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UiKTsKLQkJdGFibGUuZ2V0Q29sdW1uIChIU1BBTl9DT0wpLnNldFRvb2xUaXBUZXh0ICgiaG9yaXpvbnRhbFNwYW4iKTsKLQkJdGFibGUuZ2V0Q29sdW1uIChWU1BBTl9DT0wpLnNldFRvb2xUaXBUZXh0ICgidmVydGljYWxTcGFuIik7Ci0JCXRhYmxlLmdldENvbHVtbiAoSElOREVOVF9DT0wpLnNldFRvb2xUaXBUZXh0ICgiaG9yaXpvbnRhbEluZGVudCIpOwotCQl0YWJsZS5nZXRDb2x1bW4gKFZJTkRFTlRfQ09MKS5zZXRUb29sVGlwVGV4dCAoInZlcnRpY2FsSW5kZW50Iik7Ci0JCXRhYmxlLmdldENvbHVtbiAoTUlOV0lEVEhfQ09MKS5zZXRUb29sVGlwVGV4dCAoIm1pbmltdW1XaWR0aCIpOwotCQl0YWJsZS5nZXRDb2x1bW4gKE1JTkhFSUdIVF9DT0wpLnNldFRvb2xUaXBUZXh0ICgibWluaW11bUhlaWdodCIpOwotCQkKLQkJLyogQWRkIFRhYmxlRWRpdG9ycyAqLwkJCi0JCW5hbWVFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJd2lkdGhFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaGVpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXZBbGlnbkVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQloQWxpZ25FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaEdyYWJFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdkdyYWJFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaFNwYW5FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdlNwYW5FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaEluZGVudEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQl2SW5kZW50RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCW1pbldpZHRoRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCW1pbkhlaWdodEVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlleGNsdWRlRWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCXRhYmxlLmFkZE1vdXNlTGlzdGVuZXIgKG5ldyBNb3VzZUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycygpOwotCQkJCWluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0JCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGUueCwgZS55KTsKLSAgICAgICAgICAgICAgICBuZXdJdGVtID0gdGFibGUuZ2V0SXRlbSAocHQpOwotICAgICAgICAgICAgICAgIGlmIChuZXdJdGVtID09IG51bGwpIHJldHVybjsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gb2xkSXRlbSB8fCBuZXdJdGVtICE9IGxhc3RTZWxlY3RlZCkgewotCQkJCQlsYXN0U2VsZWN0ZWQgPSBuZXdJdGVtOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRhYmxlLnNob3dTZWxlY3Rpb24gKCk7Ci0JCQkJCi0JCQkJbmFtZVRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCW5hbWVUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtOQU1FX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKG5hbWVUZXh0LCBuYW1lRWRpdG9yLCBOQU1FX0NPTCk7Ci0JCQkJCi0JCQkJY29tYm8gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULlJFQURfT05MWSk7Ci0JCQkJY3JlYXRlQ29tYm9FZGl0b3IgKGNvbWJvLCBjb21ib0VkaXRvcik7Ci0JCQkJCi0JCQkJd2lkdGhUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW1dJRFRIX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKHdpZHRoVGV4dCwgd2lkdGhFZGl0b3IsIFdJRFRIX0NPTCk7Ci0JCQkJCi0JCQkJaGVpZ2h0VGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbSEVJR0hUX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhlaWdodFRleHQsIGhlaWdodEVkaXRvciwgSEVJR0hUX0NPTCk7Ci0JCQkJCi0JCQkJU3RyaW5nIFtdIGFsaWduVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7IkJFR0lOTklORyIsIkNFTlRFUiIsIkVORCIsIkZJTEwifTsKLQkJCQloQWxpZ24gPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWhBbGlnbi5zZXRJdGVtcyAoYWxpZ25WYWx1ZXMpOwotCQkJCWhBbGlnbi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKEhBTElHTl9DT0wpKTsKLQkJCQloQWxpZ25FZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWhBbGlnbkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJaEFsaWduRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQkJCWhBbGlnbkVkaXRvci5zZXRFZGl0b3IgKGhBbGlnbiwgbmV3SXRlbSwgSEFMSUdOX0NPTCk7Ci0JCQkJaEFsaWduLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotCQkJCQotCQkJCXZBbGlnbiA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJdkFsaWduLnNldEl0ZW1zIChhbGlnblZhbHVlcyk7Ci0JCQkJdkFsaWduLnNldFRleHQgKG5ld0l0ZW0uZ2V0VGV4dCAoVkFMSUdOX0NPTCkpOwotCQkJCXZBbGlnbkVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJdkFsaWduRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQl2QWxpZ25FZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJdkFsaWduRWRpdG9yLnNldEVkaXRvciAodkFsaWduLCBuZXdJdGVtLCBWQUxJR05fQ09MKTsKLQkJCQl2QWxpZ24uYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJU3RyaW5nIFtdIGJvb2xWYWx1ZXMgPSBuZXcgU3RyaW5nIFtdIHsiZmFsc2UiLCAidHJ1ZSJ9OwotCQkJCWhHcmFiID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5OT05FKTsKLQkJCQloR3JhYi5zZXRJdGVtcyAoYm9vbFZhbHVlcyk7Ci0JCQkJaEdyYWIuc2V0VGV4dCAobmV3SXRlbS5nZXRUZXh0IChIR1JBQl9DT0wpKTsKLQkJCQloR3JhYkVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCQkJaEdyYWJFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWhHcmFiRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQkJCWhHcmFiRWRpdG9yLnNldEVkaXRvciAoaEdyYWIsIG5ld0l0ZW0sIEhHUkFCX0NPTCk7Ci0JCQkJaEdyYWIuYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJdkdyYWIgPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCXZHcmFiLnNldEl0ZW1zIChib29sVmFsdWVzKTsKLQkJCQl2R3JhYi5zZXRUZXh0IChuZXdJdGVtLmdldFRleHQgKFZHUkFCX0NPTCkpOwotCQkJCXZHcmFiRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQl2R3JhYkVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJdkdyYWJFZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJdkdyYWJFZGl0b3Iuc2V0RWRpdG9yICh2R3JhYiwgbmV3SXRlbSwgVkdSQUJfQ09MKTsKLQkJCQl2R3JhYi5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAKLQkJCQloU3BhbiA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJaFNwYW4uc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW0hTUEFOX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhTcGFuLCBoU3BhbkVkaXRvciwgSFNQQU5fQ09MKTsKLQkJCQkKLQkJCQl2U3BhbiA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJdlNwYW4uc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW1ZTUEFOX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKHZTcGFuLCB2U3BhbkVkaXRvciwgVlNQQU5fQ09MKTsKLQkJCQkKLQkJCQloSW5kZW50ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQloSW5kZW50LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtISU5ERU5UX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKGhJbmRlbnQsIGhJbmRlbnRFZGl0b3IsIEhJTkRFTlRfQ09MKTsKLQkJCQkKLQkJCQl2SW5kZW50ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQl2SW5kZW50LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtWSU5ERU5UX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IgKHZJbmRlbnQsIHZJbmRlbnRFZGl0b3IsIFZJTkRFTlRfQ09MKTsKLQkJCQkKLQkJCQltaW5XaWR0aFRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCW1pbldpZHRoVGV4dC5zZXRUZXh0ICgoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAoaW5kZXgpKSBbTUlOV0lEVEhfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAobWluV2lkdGhUZXh0LCBtaW5XaWR0aEVkaXRvciwgTUlOV0lEVEhfQ09MKTsKLQkJCQkKLQkJCQltaW5IZWlnaHRUZXh0ID0gbmV3IFRleHQgKHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQltaW5IZWlnaHRUZXh0LnNldFRleHQgKCgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChpbmRleCkpIFtNSU5IRUlHSFRfQ09MXSk7Ci0JCQkJY3JlYXRlVGV4dEVkaXRvciAobWluSGVpZ2h0VGV4dCwgbWluSGVpZ2h0RWRpdG9yLCBNSU5IRUlHSFRfQ09MKTsKLQotCQkJCWV4Y2x1ZGUgPSBuZXcgQ0NvbWJvICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWV4Y2x1ZGUuc2V0SXRlbXMgKGJvb2xWYWx1ZXMpOwotCQkJCWV4Y2x1ZGUuc2V0VGV4dCAobmV3SXRlbS5nZXRUZXh0IChFWENMVURFX0NPTCkpOwotCQkJCWV4Y2x1ZGVFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCWV4Y2x1ZGVFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWV4Y2x1ZGVFZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCQkJZXhjbHVkZUVkaXRvci5zZXRFZGl0b3IgKGV4Y2x1ZGUsIG5ld0l0ZW0sIEVYQ0xVREVfQ09MKTsKLQkJCQlleGNsdWRlLmFkZFRyYXZlcnNlTGlzdGVuZXIgKHRyYXZlcnNlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgCVJlY3RhbmdsZSByZWN0ID0gbmV3SXRlbS5nZXRCb3VuZHMgKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlzd2l0Y2ggKGkpIHsKLSAgICAgICAgICAgICAgICAgICAgCQljYXNlIE5BTUVfQ09MOgotICAgICAgICAgICAgICAgICAgICAJCQluYW1lVGV4dC5zZXRGb2N1cyAoKTsKLSAgICAgICAgICAgICAgICAgICAgCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBDT01CT19DT0wgOgotCQkJCQkJCQljb21iby5zZXRGb2N1cyAoKTsJCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgV0lEVEhfQ09MIDoJCi0JCQkJCQkJCXdpZHRoVGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBIRUlHSFRfQ09MIDoKLQkJCQkJCQkJaGVpZ2h0VGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBIQUxJR05fQ09MIDoKLQkJCQkJCQkJaEFsaWduLnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFZBTElHTl9DT0wgOgotCQkJCQkJCQl2QWxpZ24uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSEdSQUJfQ09MIDoKLQkJCQkJCQkJaEdyYWIuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVkdSQUJfQ09MIDoKLQkJCQkJCQkJdkdyYWIuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSFNQQU5fQ09MIDoKLQkJCQkJCQkJaFNwYW4uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgVlNQQU5fQ09MIDoKLQkJCQkJCQkJdlNwYW4uc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSElOREVOVF9DT0wgOgotCQkJCQkJCQloSW5kZW50LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFZJTkRFTlRfQ09MIDoKLQkJCQkJCQkJdkluZGVudC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBNSU5XSURUSF9DT0wgOgkKLQkJCQkJCQkJbWluV2lkdGhUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIE1JTkhFSUdIVF9DT0wgOgotCQkJCQkJCQltaW5IZWlnaHRUZXh0LnNldEZvY3VzICgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIEVYQ0xVREVfQ09MIDoKLQkJCQkJCQkJZXhjbHVkZS5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IAotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sIHdpZGdldHMuCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9sV2lkZ2V0cyAoKSB7Ci0gICAgICAgIC8qIENvbnRyb2xzIHRoZSBjb2x1bW5zIGluIHRoZSBHcmlkTGF5b3V0ICovCi0JCUdyb3VwIGNvbHVtbkdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY29sdW1uR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkNvbHVtbnMiKSk7Ci0JCWNvbHVtbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQljb2x1bW5Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJbmV3IExhYmVsKGNvbHVtbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm51bUNvbHVtbnMiKTsKLQkJbnVtQ29sdW1ucyA9IG5ldyBTcGlubmVyIChjb2x1bW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW51bUNvbHVtbnMuc2V0TWluaW11bSAoMSk7Ci0JCW51bUNvbHVtbnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gbmV3IEJ1dHRvbiAoY29sdW1uR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1ha2VDb2x1bW5zRXF1YWxXaWR0aC5zZXRUZXh0ICgibWFrZUNvbHVtbnNFcXVhbFdpZHRoIik7Ci0JCW1ha2VDb2x1bW5zRXF1YWxXaWR0aC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQltYWtlQ29sdW1uc0VxdWFsV2lkdGguc2V0RW5hYmxlZCAoZmFsc2UpOwotCQltYWtlQ29sdW1uc0VxdWFsV2lkdGguc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDIsIDEpKTsKLQotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyBvZiB0aGUgR3JpZExheW91dCAqLwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJbWFyZ2luR3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTWFyZ2luc19TcGFjaW5nIikpOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgU3Bpbm5lciAobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5XaWR0aC5zZXRTZWxlY3Rpb24oNSk7Ci0JCW1hcmdpbldpZHRoLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luSGVpZ2h0Iik7Ci0JCW1hcmdpbkhlaWdodCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luSGVpZ2h0LnNldFNlbGVjdGlvbig1KTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luTGVmdCIpOwotCQltYXJnaW5MZWZ0ID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5MZWZ0LnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luTGVmdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIm1hcmdpblJpZ2h0Iik7Ci0JCW1hcmdpblJpZ2h0ID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQltYXJnaW5SaWdodC5zZXRTZWxlY3Rpb24oMCk7Ci0JCW1hcmdpblJpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luVG9wIik7Ci0JCW1hcmdpblRvcCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luVG9wLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luVG9wLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luQm90dG9tIik7Ci0JCW1hcmdpbkJvdHRvbSA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luQm90dG9tLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luQm90dG9tLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiaG9yaXpvbnRhbFNwYWNpbmciKTsKLQkJaG9yaXpvbnRhbFNwYWNpbmcgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCWhvcml6b250YWxTcGFjaW5nLnNldFNlbGVjdGlvbig1KTsKLQkJaG9yaXpvbnRhbFNwYWNpbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJ2ZXJ0aWNhbFNwYWNpbmciKTsKLQkJdmVydGljYWxTcGFjaW5nID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQl2ZXJ0aWNhbFNwYWNpbmcuc2V0U2VsZWN0aW9uKDUpOwotCQl2ZXJ0aWNhbFNwYWNpbmcuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotICAgICAgICAKLQkJLyogQWRkIGNvbW1vbiBjb250cm9scyAqLwotCQlzdXBlci5jcmVhdGVDb250cm9sV2lkZ2V0cyAoKTsKLQkJY29udHJvbEdyb3VwLnBhY2soKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQgKCkgewotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXQgKGdyaWRMYXlvdXQpOwotCX0KLQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBkaXNwb3NlRWRpdG9ycyAoKSB7Ci0JCWNvbWJvRWRpdG9yLnNldEVkaXRvciAobnVsbCwgbnVsbCwgLTEpOwotCQljb21iby5kaXNwb3NlICgpOwotCQluYW1lVGV4dC5kaXNwb3NlICgpOwotCQl3aWR0aFRleHQuZGlzcG9zZSAoKTsKLQkJaGVpZ2h0VGV4dC5kaXNwb3NlICgpOwotCQloQWxpZ24uZGlzcG9zZSAoKTsKLQkJdkFsaWduLmRpc3Bvc2UgKCk7Ci0JCWhHcmFiLmRpc3Bvc2UgKCk7Ci0JCXZHcmFiLmRpc3Bvc2UgKCk7Ci0JCWhTcGFuLmRpc3Bvc2UgKCk7Ci0JCXZTcGFuLmRpc3Bvc2UgKCk7Ci0JCWhJbmRlbnQuZGlzcG9zZSAoKTsKLQkJdkluZGVudC5kaXNwb3NlICgpOwotCQltaW5XaWR0aFRleHQuZGlzcG9zZSAoKTsKLQkJbWluSGVpZ2h0VGV4dC5kaXNwb3NlICgpOwotCQlleGNsdWRlLmRpc3Bvc2UgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCQotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgiKTsKLQkJaWYgKGdyaWRMYXlvdXQubnVtQ29sdW1ucyAhPSAxIHx8IGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7Ci0JCQljb2RlLmFwcGVuZCAoZ3JpZExheW91dC5udW1Db2x1bW5zICsgIiwgIiArIGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoKTsKLQkJfQotCQljb2RlLmFwcGVuZCgiKTtcbiIpOwotCQlpZiAoZ3JpZExheW91dC5tYXJnaW5XaWR0aCAhPSA1KSB7Ci0JCQljb2RlLmFwcGVuZCgiXHRcdGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAiICsgZ3JpZExheW91dC5tYXJnaW5XaWR0aCArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgIT0gNSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAiICsgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGdyaWRMYXlvdXQubWFyZ2luTGVmdCAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAiICsgZ3JpZExheW91dC5tYXJnaW5MZWZ0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChncmlkTGF5b3V0Lm1hcmdpblJpZ2h0ICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQubWFyZ2luUmlnaHQgPSAiICsgZ3JpZExheW91dC5tYXJnaW5SaWdodCArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC5tYXJnaW5Ub3AgIT0gMCkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC5tYXJnaW5Ub3AgPSAiICsgZ3JpZExheW91dC5tYXJnaW5Ub3AgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKGdyaWRMYXlvdXQubWFyZ2luQm90dG9tICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gIiArIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tICsgIjtcbiIpOwotCQl9Ci0JCWlmIChncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nICE9IDUpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAiICsgZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyArICI7XG4iKTsKLQkJfQotCQlpZiAoZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgIT0gNSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0Z3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAiICsgZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgKyAiO1xuIik7Ci0JCX0KLQkJY29kZS5hcHBlbmQgKCJcdFx0c2hlbGwuc2V0TGF5b3V0IChncmlkTGF5b3V0KTtcbiIpOwotCQkKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWJvb2xlYW4gYm91bmRzLCBhbGlnbiwgZ3JhYiwgc3BhbjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW4gW2ldOwotCQkJY29kZS5hcHBlbmQgKGdldENoaWxkQ29kZSAoY29udHJvbCwgaSkpOwotCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29udHJvbC5nZXRMYXlvdXREYXRhICgpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCS8qIFVzZSB0aGUgbW9zdCBlZmZpY2llbnQgY29uc3RydWN0b3IgKi8KLQkJCQlib3VuZHMgPSBkYXRhLndpZHRoSGludCAhPSBTV1QuREVGQVVMVCB8fCBkYXRhLmhlaWdodEhpbnQgIT0gU1dULkRFRkFVTFQ7Ci0JCQkJYWxpZ24gPSBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgIT0gU1dULkJFR0lOTklORyB8fCBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ICE9IFNXVC5DRU5URVI7Ci0JCQkJZ3JhYiA9IGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSB8fCBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlOwotCQkJCXNwYW4gPSBkYXRhLmhvcml6b250YWxTcGFuICE9IDEgfHwgZGF0YS52ZXJ0aWNhbFNwYW4gIT0gMTsKLQotCQkJCWNvZGUuYXBwZW5kICgiXHRcdCIpOwotCQkJCWlmIChmaXJzdCkgewotCQkJCQljb2RlLmFwcGVuZCAoIkdyaWREYXRhICIpOwotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoYWxpZ24gfHwgZ3JhYiB8fCBzcGFuKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBHcmlkRGF0YSAoIik7Ci0JCQkJCWNvZGUuYXBwZW5kIChhbGlnbm1lbnRTdHJpbmcoZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50KSArICIsICIpOwotCQkJCQljb2RlLmFwcGVuZCAoYWxpZ25tZW50U3RyaW5nKGRhdGEudmVydGljYWxBbGlnbm1lbnQpICsgIiwgIik7Ci0JCQkJCWNvZGUuYXBwZW5kIChkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgKyAiLCAiKTsKLQkJCQkJY29kZS5hcHBlbmQgKGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UpOwotCQkJCQlpZiAoc3BhbikgewotCQkJCQkJY29kZS5hcHBlbmQgKCIsICIgKyBkYXRhLmhvcml6b250YWxTcGFuKTsKLQkJCQkJCWNvZGUuYXBwZW5kICgiLCAiICsgZGF0YS52ZXJ0aWNhbFNwYW4pOwotCQkJCQl9Ci0JCQkJCWNvZGUuYXBwZW5kKCIpO1xuIik7Ci0JCQkJCWlmIChkYXRhLndpZHRoSGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS53aWR0aEhpbnQgPSAiICsgZGF0YS53aWR0aEhpbnQgKyAiO1xuIik7Ci0JCQkJCX0KLQkJCQkJaWYgKGRhdGEuaGVpZ2h0SGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5oZWlnaHRIaW50ID0gIiArIGRhdGEuaGVpZ2h0SGludCArICI7XG4iKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChib3VuZHMpIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBHcmlkRGF0YSAoIik7Ci0JCQkJCQljb2RlLmFwcGVuZCAoZGF0YS53aWR0aEhpbnQgPT0gU1dULkRFRkFVTFQgPyAiU1dULkRFRkFVTFQiIDogU3RyaW5nLnZhbHVlT2YoZGF0YS53aWR0aEhpbnQpICsgIiwgIik7Ci0JCQkJCQljb2RlLmFwcGVuZCAoZGF0YS5oZWlnaHRIaW50ID09IFNXVC5ERUZBVUxUID8gIlNXVC5ERUZBVUxUIiA6IFN0cmluZy52YWx1ZU9mKGRhdGEuaGVpZ2h0SGludCkpOwotCQkJCQkJY29kZS5hcHBlbmQoIik7XG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgiZGF0YSA9IG5ldyBHcmlkRGF0YSAoKTtcbiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChkYXRhLmhvcml6b250YWxJbmRlbnQgIT0gMCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLmhvcml6b250YWxJbmRlbnQgPSAiICsgZGF0YS5ob3Jpem9udGFsSW5kZW50ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS52ZXJ0aWNhbEluZGVudCAhPSAwKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEudmVydGljYWxJbmRlbnQgPSAiICsgZGF0YS52ZXJ0aWNhbEluZGVudCArICI7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGRhdGEubWluaW11bVdpZHRoICE9IDApIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0ZGF0YS5taW5pbXVtV2lkdGggPSAiICsgZGF0YS5taW5pbXVtV2lkdGggKyAiO1xuIik7Ci0JCQkJfQotCQkJCWlmIChkYXRhLm1pbmltdW1IZWlnaHQgIT0gMCkgewotCQkJCQljb2RlLmFwcGVuZCAoIlx0XHRkYXRhLm1pbmltdW1IZWlnaHQgPSAiICsgZGF0YS5taW5pbXVtSGVpZ2h0ICsgIjtcbiIpOwotCQkJCX0KLQkJCQlpZiAoZGF0YS5leGNsdWRlKSB7Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdGRhdGEuZXhjbHVkZSA9IHRydWU7XG4iKTsKLQkJCQl9Ci0JCQkJaWYgKGNvZGUuc3Vic3RyaW5nIChjb2RlLmxlbmd0aCAoKSAtIDMzKS5lcXVhbHMgKCJHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhICgpO1xuIikpIHsKLQkJCQkJY29kZS5kZWxldGUgKGNvZGUubGVuZ3RoICgpIC0gMzMsIGNvZGUubGVuZ3RoICgpKTsKLQkJCQkJZmlyc3QgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY29kZS5zdWJzdHJpbmcgKGNvZGUubGVuZ3RoICgpIC0gMjQpLmVxdWFscyAoImRhdGEgPSBuZXcgR3JpZERhdGEgKCk7XG4iKSkgeyAKLQkJCQkJY29kZS5kZWxldGUgKGNvZGUubGVuZ3RoICgpIC0gMjQsIGNvZGUubGVuZ3RoICgpKTsKLQkJCQl9IGVsc2UgewkKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7XG4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCVN0cmluZyBhbGlnbm1lbnRTdHJpbmcoaW50IGFsaWdubWVudCkgewotCQlpZiAoYWxpZ25tZW50ID09IFNXVC5CRUdJTk5JTkcpIHJldHVybiAiU1dULkJFR0lOTklORyI7Ci0JCWlmIChhbGlnbm1lbnQgPT0gU1dULkNFTlRFUikgcmV0dXJuICJTV1QuQ0VOVEVSIjsKLQkJaWYgKGFsaWdubWVudCA9PSBTV1QuRU5EKSByZXR1cm4gIlNXVC5FTkQiOwotCQlyZXR1cm4gIlNXVC5GSUxMIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdG8gaW5zZXJ0IHdoZW4gYSBuZXcgY2hpbGQgY29udHJvbCBpcyBhZGRlZCB0byB0aGUgdGFibGUuCi0JICovCi0JU3RyaW5nW10gZ2V0SW5zZXJ0U3RyaW5nIChTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyb2xUeXBlKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHtuYW1lLCBjb250cm9sVHlwZSwKLQkJCQkiLTEiLCItMSIsIkJFR0lOTklORyIsIkNFTlRFUiIsCi0JCQkJImZhbHNlIiwiZmFsc2UiLCIxIiwiMSIsIjAiLCIwIiwKLQkJCQkiMCIsIjAiLCJmYWxzZSJ9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhIGZpZWxkIG5hbWVzLgotCSAqLwotCVN0cmluZyBbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10gewotCQkJIkNvbnRyb2wgTmFtZSIsCi0JCQkiQ29udHJvbCBUeXBlIiwgCi0JCQkid2lkdGgiLCAKLQkJCSJoZWlnaHQiLCAKLQkJCSJoQWxpZ25tZW50IiwgLy8iaG9yaXpvbnRhbEFsaWdubWVudCIsIAotCQkJInZBbGlnbm1lbnQiLCAvLyJ2ZXJ0aWNhbEFsaWdubWVudCIsIAotCQkJImdyYWJIIiwgLy8iZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSIsIAotCQkJImdyYWJWIiwgLy8iZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UiLCAKLQkJCSJoU3BhbiIsIC8vImhvcml6b250YWxTcGFuIiwKLQkJCSJ2U3BhbiIsIC8vInZlcnRpY2FsU3BhbiIsIAotCQkJImhJbmRlbnQiLCAvLyJob3Jpem9udGFsSW5kZW50IiwgCi0JCQkidkluZGVudCIsIC8vInZlcnRpY2FsSW5kZW50IiwKLQkJCSJtaW5XaWR0aCIsIC8vIm1pbmltdW1XaWR0aCIsCi0JCQkibWluSGVpZ2h0IiwgLy8ibWluaW11bUhlaWdodCIsIAotCQkJImV4Y2x1ZGUiCi0JCX07Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgZm9yIHRoZSB0YWIgZm9sZGVyIGl0ZW0uCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQgKCkgewotCQlyZXR1cm4gIkdyaWRMYXlvdXQiOwotCX0KLQkKLQkvKioKLQkgKiBUYWtlcyBpbmZvcm1hdGlvbiBmcm9tIFRhYmxlRWRpdG9ycyBhbmQgc3RvcmVzIGl0LgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0gKCk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCS8qKiBNYWtlIHN1cmUgdXNlciBlbnRlcnMgYSB2YWxpZCBkYXRhKi8KLQkJCXRyeSB7CQkJCQotCQkJCW5ldyBTdHJpbmcgKG5hbWVUZXh0LmdldFRleHQgKCkpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQluYW1lVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKE5BTUVfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyICh3aWR0aFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXdpZHRoVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKFdJRFRIX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAoaGVpZ2h0VGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhFSUdIVF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKGhTcGFuLmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloU3Bhbi5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhTUEFOX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAodlNwYW4uZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXZTcGFuLnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoVlNQQU5fQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyIChoSW5kZW50LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQloSW5kZW50LnNldFRleHQgKG9sZEl0ZW0uZ2V0VGV4dCAoSElOREVOVF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKHZJbmRlbnQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXZJbmRlbnQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChWSU5ERU5UX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAobWluV2lkdGhUZXh0LmdldFRleHQgKCkpLmludFZhbHVlICgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQltaW5XaWR0aFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChNSU5XSURUSF9DT0wpKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbmV3IEludGVnZXIgKG1pbkhlaWdodFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW1pbkhlaWdodFRleHQuc2V0VGV4dCAob2xkSXRlbS5nZXRUZXh0IChNSU5IRUlHSFRfQ09MKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7Ci0JCQkJbmFtZVRleHQuZ2V0VGV4dCAoKSwgY29tYm8uZ2V0VGV4dCAoKSwgd2lkdGhUZXh0LmdldFRleHQgKCksIGhlaWdodFRleHQuZ2V0VGV4dCAoKSwKLQkJCQloQWxpZ24uZ2V0VGV4dCAoKSwgdkFsaWduLmdldFRleHQgKCksIGhHcmFiLmdldFRleHQgKCksIHZHcmFiLmdldFRleHQgKCksIAotCQkJCWhTcGFuLmdldFRleHQgKCksIHZTcGFuLmdldFRleHQgKCksIGhJbmRlbnQuZ2V0VGV4dCAoKSwgdkluZGVudC5nZXRUZXh0ICgpLCAKLQkJCQltaW5XaWR0aFRleHQuZ2V0VGV4dCAoKSwgbWluSGVpZ2h0VGV4dC5nZXRUZXh0ICgpLCBleGNsdWRlLmdldFRleHQgKCkKLQkJCX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBUT1RBTF9DT0xTOyBpKyspIHsKLQkJCQlvbGRJdGVtLnNldFRleHQgKGksICgoU3RyaW5nIFtdKWRhdGEuZWxlbWVudEF0IChyb3cpKSBbaV0pOwotCQkJfQotCQkJaWYgKCF0YWIpIGRpc3Bvc2VFZGl0b3JzICgpOwotCQl9Ci0JCXNldExheW91dFN0YXRlICgpOwotCQlyZWZyZXNoTGF5b3V0Q29tcG9zaXRlICgpOwotCQlzZXRMYXlvdXREYXRhICgpOwotCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICh0cnVlKTsKLQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQl9CQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5pdGlhbCB3ZWlnaHQgb2YgdGhlIGxheW91dCBhbmQgY29udHJvbCBncm91cHMgd2l0aGluIHRoZSBTYXNoRm9ybS4KLQkgKiBAcmV0dXJuIHRoZSBkZXNpcmVkIHNhc2ggd2VpZ2h0cyBmb3IgdGhlIHRhYiBwYWdlCi0JICovCi0JaW50W10gc2FzaFdlaWdodHMgKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHszNSwgNjV9OwkJCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0RGF0YSAoKSB7Ci0JCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBsYXlvdXRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4gKCk7Ci0JCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCQlHcmlkRGF0YSBkYXRhOwotCQlpbnQgaFNwYW4sIHZTcGFuLCBoSW5kZW50LCB2SW5kZW50OwotCQlTdHJpbmcgdkFsaWduLCBoQWxpZ24sIHZHcmFiLCBoR3JhYiwgZXhjbHVkZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoKTsKLQkJCS8qIFNldCB3aWR0aEhpbnQgYW5kIGhlaWdodEhpbnQgKi8KLQkJCWRhdGEud2lkdGhIaW50ID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChXSURUSF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEuaGVpZ2h0SGludCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpLmludFZhbHVlICgpOwotCQkJLyogU2V0IHZlcnRpY2FsIGFsaWdubWVudCBhbmQgaG9yaXpvbnRhbCBhbGlnbm1lbnQgKi8KLQkJCWhBbGlnbiA9IGl0ZW1zIFtpXS5nZXRUZXh0IChIQUxJR05fQ09MKTsKLQkJCWlmIChoQWxpZ24uZXF1YWxzICgiQ0VOVEVSIikpIHsKLQkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQkJfSBlbHNlIGlmIChoQWxpZ24uZXF1YWxzICgiRU5EIikpIHsKLQkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwotCQkJfSBlbHNlIGlmIChoQWxpZ24uZXF1YWxzICgiRklMTCIpKSB7Ci0JCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCQl9Ci0JCQl2QWxpZ24gPSBpdGVtcyBbaV0uZ2V0VGV4dCAoVkFMSUdOX0NPTCk7Ci0JCQlpZiAodkFsaWduLmVxdWFscyAoIkJFR0lOTklORyIpKSB7Ci0JCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCQl9IGVsc2UgaWYgKHZBbGlnbi5lcXVhbHMgKCJFTkQiKSkgewotCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRU5EOwotCQkJfSBlbHNlIGlmICh2QWxpZ24uZXF1YWxzICgiRklMTCIpKSB7Ci0JCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJfSBlbHNlIHsKLQkJCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJCX0KLQkJCS8qIFNldCBzcGFucyBhbmQgaW5kZW50cyAqLwotCQkJaFNwYW4gPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhTUEFOX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IGhTcGFuOwotCQkJdlNwYW4gPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKFZTUEFOX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSB2U3BhbjsKLQkJCWhJbmRlbnQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKEhJTkRFTlRfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBoSW5kZW50OwotCQkJdkluZGVudCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoVklOREVOVF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWRhdGEudmVydGljYWxJbmRlbnQgPSB2SW5kZW50OwotCQkJLyogU2V0IGdyYWJzICovCi0JCQloR3JhYiA9IGl0ZW1zIFtpXS5nZXRUZXh0IChIR1JBQl9DT0wpOwotCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gaEdyYWIuZXF1YWxzICgidHJ1ZSIpOwotCQkJdkdyYWIgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoVkdSQUJfQ09MKTsKLQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB2R3JhYi5lcXVhbHMgKCJ0cnVlIik7Ci0JCQkvKiBTZXQgbWluaW11bSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0JCQlkYXRhLm1pbmltdW1XaWR0aCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoTUlOV0lEVEhfQ09MKSkuaW50VmFsdWUgKCk7Ci0JCQlkYXRhLm1pbmltdW1IZWlnaHQgPSBuZXcgSW50ZWdlciAoaXRlbXMgW2ldLmdldFRleHQgKE1JTkhFSUdIVF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCS8qIFNldCBleGNsdWRlIGJvb2xlYW4gKi8KLQkJCWV4Y2x1ZGUgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoRVhDTFVERV9DT0wpOwotCQkJZGF0YS5leGNsdWRlID0gZXhjbHVkZS5lcXVhbHMgKCJ0cnVlIik7Ci0JCQkKLQkJCWNoaWxkcmVuIFtpXS5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgbGF5b3V0LgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCQkvKiBTZXQgdGhlIGNvbHVtbnMgZm9yIHRoZSBsYXlvdXQgKi8KLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1ucy5nZXRTZWxlY3Rpb24gKCk7Ci0JCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gbWFrZUNvbHVtbnNFcXVhbFdpZHRoLmdldFNlbGVjdGlvbiAoKTsKLQkJbWFrZUNvbHVtbnNFcXVhbFdpZHRoLnNldEVuYWJsZWQgKG51bUNvbHVtbnMuZ2V0U2VsZWN0aW9uICgpID4gMSk7Ci0JCQotCQkvKiBTZXQgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgKi8KLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IG1hcmdpbldpZHRoLmdldFNlbGVjdGlvbiAoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQuZ2V0U2VsZWN0aW9uICgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0LmdldFNlbGVjdGlvbiAoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5SaWdodCA9IG1hcmdpblJpZ2h0LmdldFNlbGVjdGlvbiAoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3AuZ2V0U2VsZWN0aW9uICgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IG1hcmdpbkJvdHRvbS5nZXRTZWxlY3Rpb24gKCk7Ci0JCWdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBob3Jpem9udGFsU3BhY2luZy5nZXRTZWxlY3Rpb24gKCk7Ci0JCWdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gdmVydGljYWxTcGFjaW5nLmdldFNlbGVjdGlvbiAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL0xheW91dEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvTGF5b3V0RXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJlYzVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvTGF5b3V0RXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBMYXlvdXRFeGFtcGxlIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfbGF5b3V0Iik7Ci0JcHJpdmF0ZSBUYWJGb2xkZXIgdGFiRm9sZGVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBMYXlvdXRFeGFtcGxlIGVtYmVkZGVkIGluc2lkZQotCSAqIHRoZSBzdXBwbGllZCBwYXJlbnQgQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBMYXlvdXRFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlciAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVRhYiBbXSB0YWJzID0gbmV3IFRhYiBbXSB7Ci0JCQluZXcgRmlsbExheW91dFRhYiAodGhpcyksCi0JCQluZXcgUm93TGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBHcmlkTGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBGb3JtTGF5b3V0VGFiICh0aGlzKSwKLQkJCW5ldyBTdGFja0xheW91dFRhYiAodGhpcykKLQkJfTsKLQkJZm9yIChpbnQgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtICh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJICAgIGl0ZW0uc2V0VGV4dCAodGFicyBbaV0uZ2V0VGFiVGV4dCAoKSk7Ci0JCSAgICBpdGVtLnNldENvbnRyb2wgKHRhYnMgW2ldLmNyZWF0ZVRhYkZvbGRlclBhZ2UgKHRhYkZvbGRlcikpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdyYWJzIGlucHV0IGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl0YWJGb2xkZXIuc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCi0JICogaW5zdGFuY2Ugb2YgdGhlIExheW91dEV4YW1wbGUuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRhYkZvbGRlciA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQluZXcgTGF5b3V0RXhhbXBsZShzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIndpbmRvdy50aXRsZSIpKTsKLQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lciAobmV3IFNoZWxsQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzaGVsbENsb3NlZChTaGVsbEV2ZW50IGUpIHsKLQkJCQlTaGVsbCBbXSBzaGVsbHMgPSBkaXNwbGF5LmdldFNoZWxscygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2hlbGxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzaGVsbHMgW2ldICE9IHNoZWxsKSBzaGVsbHMgW2ldLmNsb3NlICgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBiaW5kcyBpdAotCSAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsCi0JICogcmV0dXJuIHRoZSBrZXkuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Sb3dMYXlvdXRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvUm93TGF5b3V0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZmFiNmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9Sb3dMYXlvdXRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLWNsYXNzIFJvd0xheW91dFRhYiBleHRlbmRzIFRhYiB7Ci0JLyogQ29udHJvbHMgZm9yIHNldHRpbmcgbGF5b3V0IHBhcmFtZXRlcnMgKi8KLQlCdXR0b24gaG9yaXpvbnRhbCwgdmVydGljYWw7Ci0JQnV0dG9uIHdyYXAsIHBhY2ssIGZpbGwsIGp1c3RpZnk7Ci0JU3Bpbm5lciBtYXJnaW5XaWR0aCwgbWFyZ2luSGVpZ2h0LCBtYXJnaW5MZWZ0LCBtYXJnaW5SaWdodCwgbWFyZ2luVG9wLCBtYXJnaW5Cb3R0b20sIHNwYWNpbmc7Ci0JLyogVGhlIGV4YW1wbGUgbGF5b3V0IGluc3RhbmNlICovCi0JUm93TGF5b3V0IHJvd0xheW91dDsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIGNvbWJvRWRpdG9yLCB3aWR0aEVkaXRvciwgaGVpZ2h0RWRpdG9yLCBuYW1lRWRpdG9yLCBleGNsdWRlRWRpdG9yOwotCUNDb21ibyBjb21ibywgZXhjbHVkZTsKLQlUZXh0IG5hbWVUZXh0LCB3aWR0aFRleHQsIGhlaWdodFRleHQ7Ci0JCi0JLyogQ29uc3RhbnRzICovCi0JZmluYWwgaW50IE5BTUVfQ09MID0gMDsKLQlmaW5hbCBpbnQgQ09NQk9fQ09MID0gMTsKLQlmaW5hbCBpbnQgV0lEVEhfQ09MID0gMjsKLQlmaW5hbCBpbnQgSEVJR0hUX0NPTCA9IDM7Ci0JZmluYWwgaW50IEVYQ0xVREVfQ09MID0gNDsKLQlmaW5hbCBpbnQgVE9UQUxfQ09MUyA9IDU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFiIHdpdGhpbiBhIGdpdmVuIGluc3RhbmNlIG9mIExheW91dEV4YW1wbGUuCi0JICovCi0JUm93TGF5b3V0VGFiKExheW91dEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB3aWRnZXRzIGluIHRoZSAiY2hpbGQiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQ2hpbGRXaWRnZXRzICgpIHsKLQkJLyogQWRkIGNvbW1vbiBjb250cm9scyAqLwotCQlzdXBlci5jcmVhdGVDaGlsZFdpZGdldHMgKCk7Ci0JCQotCQkvKiBBZGQgVGFibGVFZGl0b3JzICovCi0JCW5hbWVFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJY29tYm9FZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJd2lkdGhFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJaGVpZ2h0RWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCWV4Y2x1ZGVFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJdGFibGUuYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzKCk7Ci0JCQkJaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZS54LCBlLnkpOwotICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSB0YWJsZS5nZXRJdGVtIChwdCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW0gPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3SXRlbSA9PSBvbGRJdGVtIHx8IG5ld0l0ZW0gIT0gbGFzdFNlbGVjdGVkKSB7Ci0JCQkJCWxhc3RTZWxlY3RlZCA9IG5ld0l0ZW07Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdGFibGUuc2hvd1NlbGVjdGlvbiAoKTsKLQkJCQkKLQkJCQljb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuUkVBRF9PTkxZKTsKLQkJCQljcmVhdGVDb21ib0VkaXRvciAoY29tYm8sIGNvbWJvRWRpdG9yKTsKLQkJCQkKLQkJCQluYW1lVGV4dCA9IG5ldyBUZXh0KHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQluYW1lVGV4dC5zZXRUZXh0KCgoU3RyaW5nW10pZGF0YS5lbGVtZW50QXQoaW5kZXgpKVtOQU1FX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IobmFtZVRleHQsIG5hbWVFZGl0b3IsIE5BTUVfQ09MKTsKLQkJCQkKLQkJCQl3aWR0aFRleHQgPSBuZXcgVGV4dCh0YWJsZSwgU1dULlNJTkdMRSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQoKChTdHJpbmdbXSlkYXRhLmVsZW1lbnRBdChpbmRleCkpW1dJRFRIX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3Iod2lkdGhUZXh0LCB3aWR0aEVkaXRvciwgV0lEVEhfQ09MKTsKLQkJCQkKLQkJCQloZWlnaHRUZXh0ID0gbmV3IFRleHQodGFibGUsIFNXVC5TSU5HTEUpOwotCQkJCWhlaWdodFRleHQuc2V0VGV4dCAoKChTdHJpbmcgW10pZGF0YS5lbGVtZW50QXQgKGluZGV4KSkgW0hFSUdIVF9DT0xdKTsKLQkJCQljcmVhdGVUZXh0RWRpdG9yIChoZWlnaHRUZXh0LCBoZWlnaHRFZGl0b3IsIEhFSUdIVF9DT0wpOwotICAgICAgICAgICAgICAgIAotCQkJCVN0cmluZyBbXSBib29sVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7ImZhbHNlIiwgInRydWUifTsKLQkJCQlleGNsdWRlID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5OT05FKTsKLQkJCQlleGNsdWRlLnNldEl0ZW1zIChib29sVmFsdWVzKTsKLQkJCQlleGNsdWRlLnNldFRleHQgKG5ld0l0ZW0uZ2V0VGV4dCAoRVhDTFVERV9DT0wpKTsKLQkJCQlleGNsdWRlRWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJCQlleGNsdWRlRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCQlleGNsdWRlRWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCQkJCWV4Y2x1ZGVFZGl0b3Iuc2V0RWRpdG9yIChleGNsdWRlLCBuZXdJdGVtLCBFWENMVURFX0NPTCk7Ci0JCQkJZXhjbHVkZS5hZGRUcmF2ZXJzZUxpc3RlbmVyICh0cmF2ZXJzZUxpc3RlbmVyKTsKLQotCQkJCWZvciAoaW50IGk9MDsgaTx0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgCVJlY3RhbmdsZSByZWN0ID0gbmV3SXRlbS5nZXRCb3VuZHMgKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlzd2l0Y2ggKGkpIHsKLSAgICAgICAgICAgICAgICAgICAgCQljYXNlIE5BTUVfQ09MIDoKLSAgICAgICAgICAgICAgICAgICAgCQkJbmFtZVRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJY2FzZSBDT01CT19DT0wgOgotCQkJCQkJCQljb21iby5zZXRGb2N1cyAoKTsJCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgV0lEVEhfQ09MIDoJCi0JCQkJCQkJCXdpZHRoVGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBIRUlHSFRfQ09MIDoKLQkJCQkJCQkJaGVpZ2h0VGV4dC5zZXRGb2N1cyAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBFWENMVURFX0NPTCA6Ci0JCQkJCQkJCWV4Y2x1ZGUuc2V0Rm9jdXMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wgd2lkZ2V0cy4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJLyogQ29udHJvbHMgdGhlIHR5cGUgb2YgUm93TGF5b3V0ICovCi0JCUdyb3VwIHR5cGVHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXR5cGVHcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiVHlwZSIpKTsKLQkJdHlwZUdyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl0eXBlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWhvcml6b250YWwgPSBuZXcgQnV0dG9uICh0eXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWhvcml6b250YWwuc2V0VGV4dCAoIlNXVC5IT1JJWk9OVEFMIik7Ci0JCWhvcml6b250YWwuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsgCi0JCWhvcml6b250YWwuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlob3Jpem9udGFsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXZlcnRpY2FsID0gbmV3IEJ1dHRvbiAodHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQl2ZXJ0aWNhbC5zZXRUZXh0ICgiU1dULlZFUlRJQ0FMIik7Ci0JCXZlcnRpY2FsLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7IAotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkKLQkJLyogQ29udHJvbHMgdGhlIG1hcmdpbnMgYW5kIHNwYWNpbmcgb2YgdGhlIFJvd0xheW91dCAqLwotCQlHcm91cCBtYXJnaW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJNYXJnaW5zX1NwYWNpbmciKSk7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UsIDEsIDIpKTsKLQkJbmV3IExhYmVsKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgibWFyZ2luV2lkdGgiKTsKLQkJbWFyZ2luV2lkdGggPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbldpZHRoLnNldFNlbGVjdGlvbigwKTsKLQkJbWFyZ2luV2lkdGguYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpbkhlaWdodCIpOwotCQltYXJnaW5IZWlnaHQgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbkhlaWdodC5zZXRTZWxlY3Rpb24oMCk7Ci0JCW1hcmdpbkhlaWdodC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCW1hcmdpbkhlaWdodC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQluZXcgTGFiZWwgKG1hcmdpbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCAoIm1hcmdpbkxlZnQiKTsKLQkJbWFyZ2luTGVmdCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luTGVmdC5zZXRTZWxlY3Rpb24oMyk7Ci0JCW1hcmdpbkxlZnQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJbmV3IExhYmVsIChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQgKCJtYXJnaW5SaWdodCIpOwotCQltYXJnaW5SaWdodCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luUmlnaHQuc2V0U2VsZWN0aW9uKDMpOwotCQltYXJnaW5SaWdodC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIm1hcmdpblRvcCIpOwotCQltYXJnaW5Ub3AgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpblRvcC5zZXRTZWxlY3Rpb24oMyk7Ci0JCW1hcmdpblRvcC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgibWFyZ2luQm90dG9tIik7Ci0JCW1hcmdpbkJvdHRvbSA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luQm90dG9tLnNldFNlbGVjdGlvbigzKTsKLQkJbWFyZ2luQm90dG9tLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbCAobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0ICgic3BhY2luZyIpOwotCQlzcGFjaW5nID0gbmV3IFNwaW5uZXIobWFyZ2luR3JvdXAsIFNXVC5CT1JERVIpOwotCQlzcGFjaW5nLnNldFNlbGVjdGlvbigzKTsKLQkJc3BhY2luZy5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkKLQkJLyogQ29udHJvbHMgb3RoZXIgcGFyYW1ldGVycyBvZiB0aGUgUm93TGF5b3V0ICovCi0JCUdyb3VwIHNwZWNHcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNwZWNHcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiUHJvcGVydGllcyIpKTsKLQkJc3BlY0dyb3VwLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJc3BlY0dyb3VwLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKCkpOwotCQl3cmFwID0gbmV3IEJ1dHRvbiAoc3BlY0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl3cmFwLnNldFRleHQgKCJXcmFwIik7Ci0JCXdyYXAuc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJd3JhcC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOyAKLQkJd3JhcC5hZGRTZWxlY3Rpb25MaXN0ZW5lciAoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlwYWNrID0gbmV3IEJ1dHRvbiAoc3BlY0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlwYWNrLnNldFRleHQgKCJQYWNrIik7Ci0JCXBhY2suc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsgCi0JCXBhY2suc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJcGFjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWZpbGwgPSBuZXcgQnV0dG9uKHNwZWNHcm91cCwgU1dULkNIRUNLKTsKLQkJZmlsbC5zZXRUZXh0KCJGaWxsIik7Ci0JCWZpbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7IAotCQlmaWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJanVzdGlmeSA9IG5ldyBCdXR0b24gKHNwZWNHcm91cCwgU1dULkNIRUNLKTsKLQkJanVzdGlmeS5zZXRUZXh0ICgiSnVzdGlmeSIpOwotCQlqdXN0aWZ5LnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7IAotCQlqdXN0aWZ5LmFkZFNlbGVjdGlvbkxpc3RlbmVyIChzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dCAoKSB7Ci0JCXJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQgKCk7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXQgKHJvd0xheW91dCk7Ci0JfQotCQkKLQkvKiogCi0JICogRGlzcG9zZXMgdGhlIGVkaXRvcnMgd2l0aG91dCBwbGFjaW5nIHRoZWlyIGNvbnRlbnRzCi0JICogaW50byB0aGUgdGFibGUuCi0JICovCi0Jdm9pZCBkaXNwb3NlRWRpdG9ycyAoKSB7Ci0JCWNvbWJvRWRpdG9yLnNldEVkaXRvciAobnVsbCwgbnVsbCwgLTEpOwotCQljb21iby5kaXNwb3NlICgpOwotCQl3aWR0aFRleHQuZGlzcG9zZSAoKTsKLQkJaGVpZ2h0VGV4dC5kaXNwb3NlICgpOwotCQluYW1lVGV4dC5kaXNwb3NlICgpOwotCQlleGNsdWRlLmRpc3Bvc2UgKCk7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCQotCVN0cmluZ0J1ZmZlciBnZW5lcmF0ZUxheW91dENvZGUgKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdFJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0ICgpO1xuIik7Ci0JCWlmIChyb3dMYXlvdXQudHlwZSA9PSBTV1QuVkVSVElDQUwpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC50eXBlID0gU1dULlZFUlRJQ0FMO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC53cmFwID09IGZhbHNlKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQud3JhcCA9IGZhbHNlO1xuIik7Ci0JCX0gCi0JCWlmIChyb3dMYXlvdXQucGFjayA9PSBmYWxzZSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0LnBhY2sgPSBmYWxzZTtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQuZmlsbCA9PSB0cnVlKSB7Ci0JCQljb2RlLmFwcGVuZCgiXHRcdHJvd0xheW91dC5maWxsID0gdHJ1ZTtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQuanVzdGlmeSA9PSB0cnVlKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQuanVzdGlmeSA9IHRydWU7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbldpZHRoICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kKCJcdFx0cm93TGF5b3V0Lm1hcmdpbldpZHRoID0gIiArIHJvd0xheW91dC5tYXJnaW5XaWR0aCArICI7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkhlaWdodCAhPSAwKSB7Ci0JCQljb2RlLmFwcGVuZCgiXHRcdHJvd0xheW91dC5tYXJnaW5IZWlnaHQgPSAiICsgcm93TGF5b3V0Lm1hcmdpbkhlaWdodCArICI7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkxlZnQgIT0gMykgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93TGF5b3V0Lm1hcmdpbkxlZnQgPSAiICsgcm93TGF5b3V0Lm1hcmdpbkxlZnQgKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5tYXJnaW5SaWdodCAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSAiICsgcm93TGF5b3V0Lm1hcmdpblJpZ2h0ICsgIjtcbiIpOwotCQl9Ci0JCWlmIChyb3dMYXlvdXQubWFyZ2luVG9wICE9IDMpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5tYXJnaW5Ub3AgPSAiICsgcm93TGF5b3V0Lm1hcmdpblRvcCArICI7XG4iKTsKLQkJfQotCQlpZiAocm93TGF5b3V0Lm1hcmdpbkJvdHRvbSAhPSAzKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gIiArIHJvd0xheW91dC5tYXJnaW5Cb3R0b20gKyAiO1xuIik7Ci0JCX0KLQkJaWYgKHJvd0xheW91dC5zcGFjaW5nICE9IDMpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdHJvd0xheW91dC5zcGFjaW5nID0gIiArIHJvd0xheW91dC5zcGFjaW5nICsgIjtcbiIpOwotCQl9Ci0JCWNvZGUuYXBwZW5kICgiXHRcdHNoZWxsLnNldExheW91dCAocm93TGF5b3V0KTtcbiIpOwotCQkKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IGNoaWxkcmVuIFtpXTsKLQkJCWNvZGUuYXBwZW5kIChnZXRDaGlsZENvZGUgKGNvbnRyb2wsaSkpOwotCQkJUm93RGF0YSByb3dEYXRhID0gKFJvd0RhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSAoKTsKLQkJCWlmIChyb3dEYXRhICE9IG51bGwpIHsKLQkJCQlpZiAocm93RGF0YS53aWR0aCAhPSAtMSB8fCByb3dEYXRhLmhlaWdodCAhPSAtMSB8fCByb3dEYXRhLmV4Y2x1ZGUpIHsKLQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0Iik7Ci0JCQkJCWlmIChmaXJzdCkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJSb3dEYXRhICIpOwotCQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAocm93RGF0YS53aWR0aCA9PSAtMSAmJiByb3dEYXRhLmhlaWdodCA9PSAtMSkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJyb3dEYXRhID0gbmV3IFJvd0RhdGEgKCk7XG4iKTsKLQkJCQkJfSBlbHNlIGlmIChyb3dEYXRhLndpZHRoID09IC0xKSB7Ci0JCQkJCQljb2RlLmFwcGVuZCAoInJvd0RhdGEgPSBuZXcgUm93RGF0YSAoU1dULkRFRkFVTFQsICIgKyByb3dEYXRhLmhlaWdodCArICIpO1xuIik7Ci0JCQkJCX0gZWxzZSBpZiAocm93RGF0YS5oZWlnaHQgPT0gLTEpIHsKLQkJCQkJCWNvZGUuYXBwZW5kICgicm93RGF0YSA9IG5ldyBSb3dEYXRhICgiICsgcm93RGF0YS53aWR0aCArICIsIFNXVC5ERUZBVUxUKTtcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29kZS5hcHBlbmQgKCJyb3dEYXRhID0gbmV3IFJvd0RhdGEgKCIgKyByb3dEYXRhLndpZHRoICsgIiwgIiArIHJvd0RhdGEuaGVpZ2h0ICsgIik7XG4iKTsJCQkJCi0JCQkJCX0KLQkJCQkJaWYgKHJvd0RhdGEuZXhjbHVkZSkgewotCQkJCQkJY29kZS5hcHBlbmQgKCJcdFx0cm93RGF0YS5leGNsdWRlID0gdHJ1ZTtcbiIpOwotCQkJCQl9Ci0JCQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldExheW91dERhdGEgKHJvd0RhdGEpO1xuIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdG8gaW5zZXJ0IHdoZW4gYSBuZXcgY2hpbGQgY29udHJvbCBpcyBhZGRlZCB0byB0aGUgdGFibGUuCi0JICovCi0JU3RyaW5nW10gZ2V0SW5zZXJ0U3RyaW5nIChTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyb2xUeXBlKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nIFtdIHtuYW1lLCBjb250cm9sVHlwZSwgIi0xIiwgIi0xIiwgImZhbHNlIn07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEgZmllbGQgbmFtZXMuCi0JICovCi0JU3RyaW5nIFtdIGdldExheW91dERhdGFGaWVsZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7IAotCQkJIkNvbnRyb2wgTmFtZSIsCi0JCQkiQ29udHJvbCBUeXBlIiwKLQkJCSJ3aWR0aCIsIAotCQkJImhlaWdodCIsCi0JCQkiZXhjbHVkZSIKLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCAoKSB7Ci0JCXJldHVybiAiUm93TGF5b3V0IjsKLQl9Ci0JCi0JLyoqCi0JICogVGFrZXMgaW5mb3JtYXRpb24gZnJvbSBUYWJsZUVkaXRvcnMgYW5kIHN0b3JlcyBpdC4KLQkgKi8KLQl2b2lkIHJlc2V0RWRpdG9ycyAoYm9vbGVhbiB0YWIpIHsKLQkJVGFibGVJdGVtIG9sZEl0ZW0gPSBjb21ib0VkaXRvci5nZXRJdGVtICgpOwotCQlpZiAob2xkSXRlbSAhPSBudWxsKSB7Ci0JCQlpbnQgcm93ID0gdGFibGUuaW5kZXhPZiAob2xkSXRlbSk7Ci0JCQkvKiBNYWtlIHN1cmUgdXNlciBoYXMgZW50ZXJlZCB2YWxpZCBkYXRhICovCi0JCQl0cnkgewkJCQkKLQkJCQluZXcgU3RyaW5nKG5hbWVUZXh0LmdldFRleHQoKSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCW5hbWVUZXh0LnNldFRleHQob2xkSXRlbS5nZXRUZXh0KE5BTUVfQ09MKSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW5ldyBJbnRlZ2VyICh3aWR0aFRleHQuZ2V0VGV4dCAoKSkuaW50VmFsdWUgKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXdpZHRoVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKFdJRFRIX0NPTCkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQluZXcgSW50ZWdlciAoaGVpZ2h0VGV4dC5nZXRUZXh0ICgpKS5pbnRWYWx1ZSAoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKEhFSUdIVF9DT0wpKTsKLQkJCX0KLQkJCVN0cmluZyBbXSBpbnNlcnQgPSBuZXcgU3RyaW5nIFtdIHsKLQkJCQluYW1lVGV4dC5nZXRUZXh0KCksIGNvbWJvLmdldFRleHQgKCksIHdpZHRoVGV4dC5nZXRUZXh0ICgpLCBoZWlnaHRUZXh0LmdldFRleHQgKCksIGV4Y2x1ZGUuZ2V0VGV4dCAoKX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgVE9UQUxfQ09MUzsgaSsrKSB7Ci0JCQkJb2xkSXRlbS5zZXRUZXh0IChpLCAoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAocm93KSkgW2ldKTsKLQkJCX0KLQkJCWlmICghdGFiKSBkaXNwb3NlRWRpdG9ycyAoKTsKLQkJfQotCQlzZXRMYXlvdXRTdGF0ZSAoKTsKLQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJc2V0TGF5b3V0RGF0YSAoKTsKLQkJbGF5b3V0Q29tcG9zaXRlLmxheW91dCAodHJ1ZSk7Ci0JCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGxheW91dCBkYXRhIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIGxheW91dC4KLQkgKi8KLQl2b2lkIHNldExheW91dERhdGEgKCkgewotCQlDb250cm9sIFtdIGNoaWxkcmVuID0gbGF5b3V0Q29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQkJUm93RGF0YSBkYXRhOwotCQlpbnQgd2lkdGgsIGhlaWdodDsKLQkJU3RyaW5nIGV4Y2x1ZGU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXdpZHRoID0gbmV3IEludGVnZXIgKGl0ZW1zIFtpXS5nZXRUZXh0IChXSURUSF9DT0wpKS5pbnRWYWx1ZSAoKTsKLQkJCWhlaWdodCA9IG5ldyBJbnRlZ2VyIChpdGVtcyBbaV0uZ2V0VGV4dCAoSEVJR0hUX0NPTCkpLmludFZhbHVlICgpOwotCQkJZGF0YSA9IG5ldyBSb3dEYXRhICh3aWR0aCwgaGVpZ2h0KTsKLQkJCWV4Y2x1ZGUgPSBpdGVtcyBbaV0uZ2V0VGV4dCAoRVhDTFVERV9DT0wpOwotCQkJZGF0YS5leGNsdWRlID0gZXhjbHVkZS5lcXVhbHMgKCJ0cnVlIik7Ci0JCQljaGlsZHJlbiBbaV0uc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXRTdGF0ZSAoKSB7Ci0JCS8qIFNldCB0aGUgdHlwZSBvZiBsYXlvdXQgKi8KLQkJcm93TGF5b3V0LnR5cGUgPSB2ZXJ0aWNhbC5nZXRTZWxlY3Rpb24gKCkgPyBTV1QuVkVSVElDQUwgOiBTV1QuSE9SSVpPTlRBTDsKLQkJCi0JCS8qIFNldCB0aGUgbWFyZ2lucyBhbmQgc3BhY2luZyAqLwotCQlyb3dMYXlvdXQubWFyZ2luV2lkdGggPSBtYXJnaW5XaWR0aC5nZXRTZWxlY3Rpb24gKCk7Ci0JCXJvd0xheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQuZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQuZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSBtYXJnaW5SaWdodC5nZXRTZWxlY3Rpb24gKCk7Ci0JCXJvd0xheW91dC5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3AuZ2V0U2VsZWN0aW9uICgpOwotCQlyb3dMYXlvdXQubWFyZ2luQm90dG9tID0gbWFyZ2luQm90dG9tLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0LnNwYWNpbmcgPSBzcGFjaW5nLmdldFNlbGVjdGlvbiAoKTsKLQkJCi0JCS8qIFNldCB0aGUgb3RoZXIgbGF5b3V0IHByb3BlcnRpZXMgKi8KLQkJcm93TGF5b3V0LndyYXAgPSB3cmFwLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0LnBhY2sgPSBwYWNrLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0LmZpbGwgPSBmaWxsLmdldFNlbGVjdGlvbiAoKTsKLQkJcm93TGF5b3V0Lmp1c3RpZnkgPSBqdXN0aWZ5LmdldFNlbGVjdGlvbiAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1N0YWNrTGF5b3V0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRleGFtcGxlL1N0YWNrTGF5b3V0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTExYWIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9TdGFja0xheW91dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0ZXhhbXBsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFN0YWNrTGF5b3V0VGFiIGV4dGVuZHMgVGFiIHsKLQkvKiBDb250cm9scyBmb3Igc2V0dGluZyBsYXlvdXQgcGFyYW1ldGVycyAqLwotCUJ1dHRvbiBiYWNrQnV0dG9uLCBhZHZhbmNlQnV0dG9uOwotCUxhYmVsIHRvcENvbnRyb2w7Ci0JU3Bpbm5lciBtYXJnaW5XaWR0aCwgbWFyZ2luSGVpZ2h0OwotCS8qIFRoZSBleGFtcGxlIGxheW91dCBpbnN0YW5jZSAqLwotCVN0YWNrTGF5b3V0IHN0YWNrTGF5b3V0OwotCWludCBjdXJyZW50TGF5ZXIgPSAtMTsKLQkvKiBUYWJsZUVkaXRvcnMgYW5kIHJlbGF0ZWQgY29udHJvbHMqLwotCVRhYmxlRWRpdG9yIGNvbWJvRWRpdG9yLCBuYW1lRWRpdG9yOwotCUNDb21ibyBjb21ibzsKLQlUZXh0IG5hbWVUZXh0OwotCWZpbmFsIGludCBOQU1FX0NPTCA9IDA7Ci0JZmluYWwgaW50IFRPVEFMX0NPTFMgPSAyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYiB3aXRoaW4gYSBnaXZlbiBpbnN0YW5jZSBvZiBMYXlvdXRFeGFtcGxlLgotCSAqLwotCVN0YWNrTGF5b3V0VGFiKExheW91dEV4YW1wbGUgaW5zdGFuY2UpIHsKLQkJc3VwZXIoaW5zdGFuY2UpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB3aWRnZXRzIGluIHRoZSAiY2hpbGQiIGdyb3VwLgotCSAqLwotCXZvaWQgY3JlYXRlQ2hpbGRXaWRnZXRzKCkgewotCQkvKiBBZGQgY29tbW9uIGNvbnRyb2xzICovCi0JCXN1cGVyLmNyZWF0ZUNoaWxkV2lkZ2V0cygpOwotCQkKLQkJLyogQWRkIFRhYmxlRWRpdG9ycyAqLwotCQljb21ib0VkaXRvciA9IG5ldyBUYWJsZUVkaXRvcih0YWJsZSk7Ci0JCW5hbWVFZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IodGFibGUpOwotCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyIChuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgeyAJCi0JCQkJcmVzZXRFZGl0b3JzKCk7Ci0JCQkJaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotCQkJCS8vc2V0IHRvcCBsYXllciBvZiBzdGFjayB0byB0aGUgc2VsZWN0ZWQgaXRlbQotCQkJCXNldFRvcENvbnRyb2wgKGluZGV4KTsKLQkJCQkKLQkJCQlUYWJsZUl0ZW0gb2xkSXRlbSA9IGNvbWJvRWRpdG9yLmdldEl0ZW0oKTsKLQkJCQluZXdJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCQkJaWYgKG5ld0l0ZW0gPT0gb2xkSXRlbSB8fCBuZXdJdGVtICE9IGxhc3RTZWxlY3RlZCkgewotCQkJCQlsYXN0U2VsZWN0ZWQgPSBuZXdJdGVtOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRhYmxlLnNob3dTZWxlY3Rpb24oKTsJCQkJCi0JCQkJY29tYm8gPSBuZXcgQ0NvbWJvKHRhYmxlLCBTV1QuUkVBRF9PTkxZKTsJCQkJCi0JCQkJY3JlYXRlQ29tYm9FZGl0b3IoY29tYm8sIGNvbWJvRWRpdG9yKTsKLQkJCQkKLQkJCQluYW1lVGV4dCA9IG5ldyBUZXh0KHRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJCQluYW1lVGV4dC5zZXRUZXh0KCgoU3RyaW5nW10pZGF0YS5lbGVtZW50QXQoaW5kZXgpKVtOQU1FX0NPTF0pOwotCQkJCWNyZWF0ZVRleHRFZGl0b3IobmFtZVRleHQsIG5hbWVFZGl0b3IsIE5BTUVfQ09MKTsKLQkJCX0KLQkJfSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbCB3aWRnZXRzLgotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbFdpZGdldHMoKSB7Ci0gICAgICAgIC8qIENvbnRyb2xzIHRoZSB0b3BDb250cm9sIGluIHRoZSBTdGFja0xheW91dCAqLwotCQlHcm91cCBjb2x1bW5Hcm91cCA9IG5ldyBHcm91cCAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbkdyb3VwLnNldFRleHQgKCJ0b3BDb250cm9sIik7Ly8oTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIlRvcF9Db250cm9sIikpOwotCQljb2x1bW5Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29sdW1uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJhY2tCdXR0b24gPSBuZXcgQnV0dG9uKGNvbHVtbkdyb3VwLCBTV1QuUFVTSCk7Ci0JICAgIGJhY2tCdXR0b24uc2V0VGV4dCgiPDwiKTsKLQkgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYmFja0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSAoU1dULkVORCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJhY2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCSAgICAJc2V0VG9wQ29udHJvbCAoY3VycmVudExheWVyIC0gMSk7Ci0JICAgICAgICB9Ci0JCX0pOwotCQl0b3BDb250cm9sID0gbmV3IExhYmVsIChjb2x1bW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCXRvcENvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWFkdmFuY2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbHVtbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCWFkdmFuY2VCdXR0b24uc2V0VGV4dCgiPj4iKTsKLQkJYWR2YW5jZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYWR2YW5jZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJICAgIAlzZXRUb3BDb250cm9sIChjdXJyZW50TGF5ZXIgKyAxKTsKLQkgICAgICAgIH0KLQkJfSk7CQkKLQotCQkvKiBDb250cm9scyB0aGUgbWFyZ2lucyBvZiB0aGUgU3RhY2tMYXlvdXQgKi8KLQkJR3JvdXAgbWFyZ2luR3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hcmdpbkdyb3VwLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIk1hcmdpbnMiKSk7Ci0JCW1hcmdpbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQltYXJnaW5Hcm91cC5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQluZXcgTGFiZWwobWFyZ2luR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJtYXJnaW5XaWR0aCIpOwotCQltYXJnaW5XaWR0aCA9IG5ldyBTcGlubmVyKG1hcmdpbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbWFyZ2luV2lkdGguc2V0U2VsZWN0aW9uKDApOwotCQltYXJnaW5XaWR0aC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCW5ldyBMYWJlbChtYXJnaW5Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIm1hcmdpbkhlaWdodCIpOwotCQltYXJnaW5IZWlnaHQgPSBuZXcgU3Bpbm5lcihtYXJnaW5Hcm91cCwgU1dULkJPUkRFUik7Ci0JCW1hcmdpbkhlaWdodC5zZXRTZWxlY3Rpb24oMCk7Ci0JCW1hcmdpbkhlaWdodC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbWFyZ2luSGVpZ2h0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCi0JCS8qIEFkZCBjb21tb24gY29udHJvbHMgKi8KLQkJc3VwZXIuY3JlYXRlQ29udHJvbFdpZGdldHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVMYXlvdXQoKSB7Ci0JCXN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXQoc3RhY2tMYXlvdXQpOwotCX0KLQkKLQl2b2lkIGNyZWF0ZUxheW91dENvbXBvc2l0ZSgpIHsKLQkJbGF5b3V0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShsYXlvdXRHcm91cCwgU1dULkJPUkRFUik7Ci0JCWxheW91dENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQkJY3JlYXRlTGF5b3V0KCk7Ci0JfQotCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2VFZGl0b3JzKCkgewotCQljb21ib0VkaXRvci5zZXRFZGl0b3IobnVsbCwgbnVsbCwgLTEpOwotCQljb21iby5kaXNwb3NlKCk7Ci0JCW5hbWVUZXh0LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVMYXlvdXRDb2RlKCkgewotCQlTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY29kZS5hcHBlbmQoIlx0XHRTdGFja0xheW91dCBzdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCAoKTtcbiIpOwotCQlpZiAoc3RhY2tMYXlvdXQubWFyZ2luV2lkdGggIT0gMCkgewotCQkJY29kZS5hcHBlbmQoIlx0XHRzdGFja0xheW91dC5tYXJnaW5XaWR0aCA9ICIgKyBzdGFja0xheW91dC5tYXJnaW5XaWR0aCArICI7XG4iKTsKLQkJfQotCQlpZiAoc3RhY2tMYXlvdXQubWFyZ2luSGVpZ2h0ICE9IDApIHsKLQkJCWNvZGUuYXBwZW5kKCJcdFx0c3RhY2tMYXlvdXQubWFyZ2luSGVpZ2h0ID0gIiArIHN0YWNrTGF5b3V0Lm1hcmdpbkhlaWdodCArICI7XG4iKTsKLQkJfQotCQljb2RlLmFwcGVuZCgiXHRcdHNoZWxsLnNldExheW91dCAoc3RhY2tMYXlvdXQpO1xuIik7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW5baV07Ci0JCQljb2RlLmFwcGVuZCAoZ2V0Q2hpbGRDb2RlKGNvbnRyb2wsIGkpKTsKLQkJfQotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBjdXJyZW50TGF5ZXIgIT0gLTEpIHsKLQkJCWNvZGUuYXBwZW5kKCJcblx0XHRzdGFja0xheW91dC50b3BDb250cm9sID0gIiArIG5hbWVzW2N1cnJlbnRMYXllcl0gKyAiO1xuIik7Ci0JCX0KLQkJcmV0dXJuIGNvZGU7Ci0JfQotCQotCWJvb2xlYW4gbmVlZHNDdXN0b20oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB0byBpbnNlcnQgd2hlbiBhIG5ldyBjaGlsZCBjb250cm9sIGlzIGFkZGVkIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlTdHJpbmdbXSBnZXRJbnNlcnRTdHJpbmcgKFN0cmluZyBuYW1lLCBTdHJpbmcgY29udHJvbFR5cGUpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcgW10ge25hbWUsIGNvbnRyb2xUeXBlfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXlvdXQgZGF0YSBmaWVsZCBuYW1lcy4KLQkgKi8KLQlTdHJpbmdbXSBnZXRMYXlvdXREYXRhRmllbGROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkNvbnRyb2wgTmFtZSIsICJDb250cm9sIFR5cGUifTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJTdGFja0xheW91dCI7Ci0JfQotCQotCS8qKgotCSAqIFRha2VzIGluZm9ybWF0aW9uIGZyb20gVGFibGVFZGl0b3JzIGFuZCBzdG9yZXMgaXQuCi0JICovCi0Jdm9pZCByZXNldEVkaXRvcnMgKGJvb2xlYW4gdGFiKSB7Ci0JCVRhYmxlSXRlbSBvbGRJdGVtID0gY29tYm9FZGl0b3IuZ2V0SXRlbSAoKTsKLQkJY29tYm9FZGl0b3Iuc2V0RWRpdG9yIChudWxsLCBudWxsLCAtMSk7Ci0JCWlmIChvbGRJdGVtICE9IG51bGwpIHsKLQkJCWludCByb3cgPSB0YWJsZS5pbmRleE9mIChvbGRJdGVtKTsKLQkJCXRyeSB7CQkJCQotCQkJCW5ldyBTdHJpbmcgKG5hbWVUZXh0LmdldFRleHQgKCkpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQluYW1lVGV4dC5zZXRUZXh0IChvbGRJdGVtLmdldFRleHQgKE5BTUVfQ09MKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgW10gaW5zZXJ0ID0gbmV3IFN0cmluZyBbXSB7bmFtZVRleHQuZ2V0VGV4dCAoKSwgY29tYm8uZ2V0VGV4dCAoKX07Ci0JCQlkYXRhLnNldEVsZW1lbnRBdCAoaW5zZXJ0LCByb3cpOwotCQkJZm9yIChpbnQgaSA9IDAgOyBpIDwgVE9UQUxfQ09MUzsgaSsrKSB7Ci0JCQkJb2xkSXRlbS5zZXRUZXh0IChpLCAoKFN0cmluZyBbXSlkYXRhLmVsZW1lbnRBdCAocm93KSkgW2ldKTsKLQkJCX0KLQkJCWlmICghdGFiKSBkaXNwb3NlRWRpdG9ycyAoKTsKLQkJfQotCQlzZXRMYXlvdXRTdGF0ZSAoKTsKLQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJc2V0VG9wQ29udHJvbCAoY3VycmVudExheWVyKTsKLQkJbGF5b3V0R3JvdXAubGF5b3V0ICh0cnVlKTsKLQl9CQotCi0Jdm9pZCBzZXRUb3BDb250cm9sIChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4ID09IC0xIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7Ci0JCQljdXJyZW50TGF5ZXIgPSAtMTsKLQkJCXRvcENvbnRyb2wuc2V0VGV4dCAoIiIpOwotCQl9IGVsc2UgewotCQkJY3VycmVudExheWVyID0gaW5kZXg7Ci0JCQlzdGFja0xheW91dC50b3BDb250cm9sID0gY2hpbGRyZW4gW2N1cnJlbnRMYXllcl07Ci0JCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICgpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtKGN1cnJlbnRMYXllcik7Ci0JCQl0b3BDb250cm9sLnNldFRleHQgKGl0ZW0uZ2V0VGV4dCgwKSk7Ci0JCX0KLQkJYmFja0J1dHRvbi5zZXRFbmFibGVkKGNoaWxkcmVuLmxlbmd0aCA+IDEgJiYgY3VycmVudExheWVyID4gMCk7Ci0JCWFkdmFuY2VCdXR0b24uc2V0RW5hYmxlZChjaGlsZHJlbi5sZW5ndGggPiAxICYmIGN1cnJlbnRMYXllciA8IGNoaWxkcmVuLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBsYXlvdXQuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXRTdGF0ZSgpIHsKLQkJLyogU2V0IHRoZSBtYXJnaW5zIGFuZCBzcGFjaW5nICovCi0JCXN0YWNrTGF5b3V0Lm1hcmdpbldpZHRoID0gbWFyZ2luV2lkdGguZ2V0U2VsZWN0aW9uKCk7CQkKLQkJc3RhY2tMYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0LmdldFNlbGVjdGlvbigpOwkJCi0JfQkKLQkKLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dGV4YW1wbGUvVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjUxODUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0ZXhhbXBsZS9UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dGV4YW1wbGU7Ci0KLSAKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiA8Y29kZT5UYWI8L2NvZGU+IGlzIHRoZSBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGV2ZXJ5IHBhZ2UKLSAqIGluIHRoZSBleGFtcGxlJ3MgdGFiIGZvbGRlci4gIEVhY2ggcGFnZSBpbiB0aGUgdGFiIGZvbGRlcgotICogZGlzcGxheXMgYSBsYXlvdXQsIGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gbWFuaXB1bGF0ZSB0aGUKLSAqIGxheW91dC4KLSAqCi0gKiBBIHR5cGljYWwgcGFnZSBpbiBhIFRhYiBjb250YWlucyBhIHR3byBjb2x1bW4gY29tcG9zaXRlLgotICogVGhlIGxlZnQgY29sdW1uIGNvbnRhaW5zIHRoZSBsYXlvdXQgZ3JvdXAsIHdoaWNoIGNvbnRhaW5zCi0gKiB0aGUgImxheW91dCBjb21wb3NpdGUiICh0aGUgb25lIHRoYXQgaGFzIHRoZSBleGFtcGxlIGxheW91dCkuCi0gKiBUaGUgcmlnaHQgY29sdW1uIGNvbnRhaW5zIHRoZSAiY29udHJvbCIgZ3JvdXAuIFRoZSAiY29udHJvbCIKLSAqIGdyb3VwIGFsbG93cyB0aGUgdXNlciB0byBpbnRlcmFjdCB3aXRoIHRoZSBleGFtcGxlLiBUeXBpY2FsCi0gKiBvcGVyYXRpb25zIGFyZSBtb2RpZnlpbmcgbGF5b3V0IHBhcmFtZXRlcnMsIGFkZGluZyBjaGlsZHJlbgotICogdG8gdGhlICJsYXlvdXQgY29tcG9zaXRlIiwgYW5kIG1vZGlmeWluZyBjaGlsZCBsYXlvdXQgZGF0YS4KLSAqIFRoZSAiQ29kZSIgYnV0dG9uIGluIHRoZSAiY29udHJvbCIgZ3JvdXAgb3BlbnMgYSBuZXcgd2luZG93Ci0gKiBjb250YWluaW5nIGNvZGUgdGhhdCB3aWxsIHJlZ2VuZXJhdGUgdGhlIGxheW91dC4gVGhpcyBjb2RlCi0gKiAob3IgcGFydHMgb2YgaXQpIGNhbiBiZSBzZWxlY3RlZCBhbmQgY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRhYiB7CQotCVNoZWxsIHNoZWxsOwotCURpc3BsYXkgZGlzcGxheTsKLQkvKiBDb21tb24gZ3JvdXBzIGFuZCBjb21wb3NpdGVzICovCi0JQ29tcG9zaXRlIHRhYkZvbGRlclBhZ2U7Ci0JU2FzaEZvcm0gc2FzaDsKLQlHcm91cCBsYXlvdXRHcm91cCwgY29udHJvbEdyb3VwLCBjaGlsZEdyb3VwOwotCS8qIFRoZSBjb21wb3NpdGUgdGhhdCBjb250YWlucyB0aGUgZXhhbXBsZSBsYXlvdXQgKi8KLQlDb21wb3NpdGUgbGF5b3V0Q29tcG9zaXRlOwotCS8qIENvbW1vbiBjb250cm9scyBmb3IgbW9kaWZ5aW5nIHRoZSBleGFtcGxlIGxheW91dCAqLwotCVN0cmluZyBbXSBuYW1lczsKLQlDb250cm9sIFtdIGNoaWxkcmVuOwotCVRvb2xJdGVtIGFkZCwgZGVsZXRlLCBjbGVhciwgY29kZTsKLQlpbnQgcHJldlNlbGVjdGVkID0gMDsKLQkvKiBDb21tb24gdmFsdWVzIGZvciB3b3JraW5nIHdpdGggVGFibGVFZGl0b3JzICovCi0JVGFibGUgdGFibGU7Ci0JaW50IGluZGV4OwotCWJvb2xlYW4gY29tYm9SZXNldCA9IGZhbHNlOwotCWZpbmFsIFN0cmluZ1tdIE9QVElPTlMgPSB7IkJ1dHRvbiIsICJDYW52YXMiLCAiQ29tYm8iLCAiQ29tcG9zaXRlIiwJIkNvb2xCYXIiLCAKLQkJCSJHcm91cCIsICJMYWJlbCIsICJMaW5rIiwgIkxpc3QiLCAiUHJvZ3Jlc3NCYXIiLCAiU2NhbGUiLCAiU2xpZGVyIiwgIlN0eWxlZFRleHQiLAotCQkJIlRhYmxlIiwgIlRleHQiLCAiVG9vbEJhciIsICJUcmVlIn07Ci0JVGFibGVJdGVtIG5ld0l0ZW0sIGxhc3RTZWxlY3RlZDsKLQlWZWN0b3IgZGF0YSA9IG5ldyBWZWN0b3IgKCk7Ci0JLyogQ29udHJvbGxpbmcgaW5zdGFuY2UgKi8KLQlmaW5hbCBMYXlvdXRFeGFtcGxlIGluc3RhbmNlOwotCi0JLyogTGlzdGVuZXJzICovCi0JU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlyZXNldEVkaXRvcnMgKCk7Ci0JCX0KLQl9OwotCQkKLQlUcmF2ZXJzZUxpc3RlbmVyIHRyYXZlcnNlTGlzdGVuZXIgPSBuZXcgVHJhdmVyc2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZCAoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWIgd2l0aGluIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgTGF5b3V0RXhhbXBsZS4KLQkgKi8KLQlUYWIoTGF5b3V0RXhhbXBsZSBpbnN0YW5jZSkgewotCQl0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJjaGlsZHJlbiIgZ3JvdXAuIFRoaXMgaXMgdGhlIGdyb3VwIHRoYXQgYWxsb3dzCi0JICogeW91IHRvIGFkZCBjaGlsZHJlbiB0byB0aGUgbGF5b3V0LiBJdCBleGlzdHMgd2l0aGluIHRoZQotCSAqIGNvbnRyb2xHcm91cC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNoaWxkR3JvdXAgKCkgewotCQljaGlsZEdyb3VwID0gbmV3IEdyb3VwIChjb250cm9sR3JvdXAsIFNXVC5OT05FKTsKLQkJY2hpbGRHcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDaGlsZHJlbiIpKTsKLQkJY2hpbGRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQgKCkpOwotCQljaGlsZEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsgCi0KLQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoY2hpbGRHcm91cCwgU1dULkZMQVQpOwkKLQkJdG9vbEJhci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJYWRkID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQlhZGQuc2V0VGV4dChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJBZGQiKSk7CQotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQkJVG9vbEl0ZW0gaXRlbSA9IChUb29sSXRlbSlldmVudC53aWRnZXQ7Ci0JCQkJCVRvb2xCYXIgYmFyID0gaXRlbS5nZXRQYXJlbnQgKCk7Ci0JCQkJCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgT1BUSU9OUy5sZW5ndGg7IGkrKykgewotCQkJCQkJZmluYWwgTWVudUl0ZW0gbmV3SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlJBRElPKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCAoT1BUSU9OUyBbaV0pOwkJCQkJCQotCQkJCQkJbmV3SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lciAobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IChNZW51SXRlbSlldmVudC53aWRnZXQ7Ci0JCQkJCQkJCWlmIChtZW51SXRlbS5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJCQkJCU1lbnUgbWVudSAgPSBtZW51SXRlbS5nZXRQYXJlbnQgKCk7Ci0JCQkJCQkJCQlwcmV2U2VsZWN0ZWQgPSBtZW51LmluZGV4T2YgKG1lbnVJdGVtKTsKLQkJCQkJCQkJCVN0cmluZyBjb250cm9sVHlwZSA9IG1lbnVJdGVtLmdldFRleHQgKCk7Ci0JCQkJCQkJCQlTdHJpbmcgbmFtZSA9IGNvbnRyb2xUeXBlLnRvTG93ZXJDYXNlICgpICsgU3RyaW5nLnZhbHVlT2YgKHRhYmxlLmdldEl0ZW1Db3VudCAoKSk7Ci0JCQkJCQkJCQlTdHJpbmcgW10gaW5zZXJ0ID0gZ2V0SW5zZXJ0U3RyaW5nIChuYW1lLCBjb250cm9sVHlwZSk7Ci0JCQkJCQkJCQlpZiAoaW5zZXJ0ICE9IG51bGwpIHsKLQkJCQkJCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJCQkJCQkJaXRlbS5zZXRUZXh0IChpbnNlcnQpOwotCQkJCQkJCQkJCWRhdGEuYWRkRWxlbWVudCAoaW5zZXJ0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwkJCQkJCQkKLQkJCQkJCW5ld0l0ZW0uc2V0U2VsZWN0aW9uIChpID09IHByZXZTZWxlY3RlZCk7Ci0JCQkJCX0KLQkJCQkJUG9pbnQgcHQgPSBkaXNwbGF5Lm1hcCAoYmFyLCBudWxsLCBldmVudC54LCBldmVudC55KTsKLQkJCQkJbWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQkJCQotCQkJCQl3aGlsZSAobWVudSAhPSBudWxsICYmICFtZW51LmlzRGlzcG9zZWQgKCkgJiYgbWVudS5pc1Zpc2libGUgKCkpIHsKLQkJCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIHsKLQkJCQkJCQlkaXNwbGF5LnNsZWVwICgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1lbnUuZGlzcG9zZSAoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgY29udHJvbFR5cGUgPSBPUFRJT05TIFtwcmV2U2VsZWN0ZWRdOwotCQkJCQlTdHJpbmcgbmFtZSA9IGNvbnRyb2xUeXBlLnRvTG93ZXJDYXNlICgpICsgU3RyaW5nLnZhbHVlT2YgKHRhYmxlLmdldEl0ZW1Db3VudCAoKSk7Ci0JCQkJCVN0cmluZyBbXSBpbnNlcnQgPSBnZXRJbnNlcnRTdHJpbmcgKG5hbWUsIGNvbnRyb2xUeXBlKTsKLQkJCQkJaWYgKGluc2VydCAhPSBudWxsKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJCQkJCWl0ZW0uc2V0VGV4dCAoaW5zZXJ0KTsKLQkJCQkJCWRhdGEuYWRkRWxlbWVudCAoaW5zZXJ0KTsKLQkJCQkJfQotCQkJCQlyZXNldEVkaXRvcnMgKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQluZXcgVG9vbEl0ZW0odG9vbEJhcixTV1QuU0VQQVJBVE9SKTsKLQotCQlkZWxldGUgPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlkZWxldGUuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkRlbGV0ZSIpKTsKLQkJZGVsZXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlpbnQgW10gc2VsZWN0ZWQgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzICgpOwotCQkJCXRhYmxlLnJlbW92ZSAoc2VsZWN0ZWQpOwotCQkJCS8qIFJlZnJlc2ggdGhlIGNvbnRyb2wgaW5kaWNlcyBvZiB0aGUgdGFibGUgKi8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpKTsKLQkJCQkJaXRlbS5zZXRUZXh0ICgwLCBpdGVtLmdldFRleHQgKDApKTsKLQkJCQl9Ci0JCQkJcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKTsKLQkJCQlsYXlvdXRDb21wb3NpdGUubGF5b3V0ICh0cnVlKTsKLQkJCQlsYXlvdXRHcm91cC5sYXlvdXQgKHRydWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCW5ldyBUb29sSXRlbSh0b29sQmFyLFNXVC5TRVBBUkFUT1IpOwotCQljbGVhciA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWNsZWFyLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJDbGVhciIpKTsKLQkJY2xlYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKG5ldyBTZWxlY3Rpb25BZGFwdGVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVzZXRFZGl0b3JzICgpOwotCQkJCWNoaWxkcmVuID0gbGF5b3V0Q29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJY2hpbGRyZW4gW2ldLmRpc3Bvc2UgKCk7Ci0JCQkJfQotCQkJCXRhYmxlLnJlbW92ZUFsbCAoKTsKLQkJCQlkYXRhLmNsZWFyICgpOwotCQkJCWNoaWxkcmVuID0gbmV3IENvbnRyb2wgWzBdOwotCQkJCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQl0b29sQmFyLnBhY2soKTsKLQkJCi0JCW5ldyBUb29sSXRlbSAodG9vbEJhcixTV1QuU0VQQVJBVE9SKTsKLQkJY29kZSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQljb2RlLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJHZW5lcmF0ZV9Db2RlIikpOwotCQljb2RlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7CQotCQkJCXNoZWxsLnNldFRleHQoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiR2VuZXJhdGVkX0NvZGUiKSk7Ci0JCQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCQlTdHJpbmcgbGF5b3V0Q29kZSA9IGdlbmVyYXRlQ29kZSgpLnRvU3RyaW5nICgpOwotCQkJCWlmIChsYXlvdXRDb2RlLmxlbmd0aCgpID09IDApIHJldHVybjsKLQkJCQl0ZXh0LnNldFRleHQobGF5b3V0Q29kZSk7Ci0JCQkJCi0JCQkJTWVudSBiYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCQkJc2hlbGwuc2V0TWVudUJhcihiYXIpOwotCQkJCU1lbnVJdGVtIGVkaXRJdGVtID0gbmV3IE1lbnVJdGVtKGJhciwgU1dULkNBU0NBREUpOwotCQkJCWVkaXRJdGVtLnNldFRleHQoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiRWRpdCIpKTsKLQkJCQlNZW51IG1lbnUgPSBuZXcgTWVudShiYXIpOwotCQkJCU1lbnVJdGVtIHNlbGVjdCA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCQkJc2VsZWN0LnNldFRleHQoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiU2VsZWN0X0FsbCIpKTsKLQkJCQlzZWxlY3Quc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQScpOwotCQkJCXNlbGVjdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCU1lbnVJdGVtIGNvcHkgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCQkJCWNvcHkuc2V0VGV4dChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJDb3B5IikpOwotCQkJCWNvcHkuc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQycpOwotCQkJCWNvcHkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXRleHQuY29weSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJTWVudUl0ZW0gZXhpdCA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7Ci0JCQkJZXhpdC5zZXRUZXh0KExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkV4aXQiKSk7Ci0JCQkJZXhpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWVkaXRJdGVtLnNldE1lbnUobWVudSk7Ci0JCQkJCi0JCQkJc2hlbGwucGFjaygpOwotCQkJCXNoZWxsLnNldFNpemUoNTAwLCA2MDApOwotCQkJCXNoZWxsLm9wZW4oKTsKLQkJCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCWNyZWF0ZUNoaWxkV2lkZ2V0cygpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9scyBmb3IgbW9kaWZ5aW5nIHRoZSAiY2hpbGRyZW4iIAotCSAqIHRhYmxlLCBhbmQgdGhlIHRhYmxlIGl0c2VsZi4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGF1Z21lbnQgdGhlCi0JICogc3RhbmRhcmQgdGFibGUuCi0JICovCi0Jdm9pZCBjcmVhdGVDaGlsZFdpZGdldHMoKSB7Ci0JCS8qIENyZWF0ZSB0aGUgImNoaWxkcmVuIiB0YWJsZSAqLwotCQl0YWJsZSA9IG5ldyBUYWJsZSAoY2hpbGRHcm91cCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5ISURFX1NFTEVDVElPTik7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCQlGb250RGF0YSBkZWZbXSA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCXRhYmxlLnNldEZvbnQobmV3IEZvbnQoZGlzcGxheSwgZGVmWzBdLmdldE5hbWUoKSwgMTAsIFNXVC5OT05FKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMywgMSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCXRhYmxlLnNldExheW91dERhdGEgKGdyaWREYXRhKTsKLQkJdGFibGUuYWRkVHJhdmVyc2VMaXN0ZW5lciAodHJhdmVyc2VMaXN0ZW5lcik7Ci0JCQotCQkvKiBBZGQgY29sdW1ucyB0byB0aGUgdGFibGUgKi8KLQkJU3RyaW5nIFtdIGNvbHVtbkhlYWRlcnMgPSBnZXRMYXlvdXREYXRhRmllbGROYW1lcyAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5IZWFkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJCWNvbHVtbi5zZXRUZXh0IChjb2x1bW5IZWFkZXJzIFtpXSk7Ci0JCQlpZiAoaSA9PSAwKSBjb2x1bW4uc2V0V2lkdGggKDEwMCk7Ci0JCQllbHNlIGlmIChpID09IDEpIGNvbHVtbi5zZXRXaWR0aCAoOTApOwotCQkJZWxzZSBjb2x1bW4ucGFjayAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhYmxlRWRpdG9yIHdpdGggYSBDQ29tYm8gaW4gdGhlIGZpcnN0IGNvbHVtbgotCSAqIG9mIHRoZSB0YWJsZS4gVGhpcyBDQ29tYm8gbGlzdHMgYWxsIHRoZSBjb250cm9scyB0aGF0Ci0JICogdGhlIHVzZXIgY2FuIHNlbGVjdCB0byBwbGFjZSBvbiB0aGVpciBsYXlvdXQuCi0JICovCi0Jdm9pZCBjcmVhdGVDb21ib0VkaXRvciAoQ0NvbWJvIGNvbWJvLCBUYWJsZUVkaXRvciBjb21ib0VkaXRvcikgewotCQljb21iby5zZXRJdGVtcyAoT1BUSU9OUyk7Ci0JCWNvbWJvLnNldFRleHQgKG5ld0l0ZW0uZ2V0VGV4dCAoMSkpOwotCQkKLQkJLyogU2V0IHVwIGVkaXRvciAqLwotCQljb21ib0VkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCWNvbWJvRWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJY29tYm9FZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JCWNvbWJvRWRpdG9yLnNldEVkaXRvciAoY29tYm8sIG5ld0l0ZW0sIDEpOwotCQkKLQkJLyogQWRkIGxpc3RlbmVyICovCi0JCWNvbWJvLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCB8fCBlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfUkVUVVJOKSB7Ci0gICAgICAgICAgICAJCWNvbWJvUmVzZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXNldEVkaXRvcnMgKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgCWRpc3Bvc2VFZGl0b3JzICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlICJjb250cm9sIiBncm91cC4gVGhpcyBpcyB0aGUgZ3JvdXAgb24gdGhlCi0JICogcmlnaHQgaGFsZiBvZiBlYWNoIGV4YW1wbGUgdGFiLiBJdCBjb250YWlucyBjb250cm9scwotCSAqIGZvciBhZGRpbmcgbmV3IGNoaWxkcmVuIHRvIHRoZSBsYXlvdXRDb21wb3NpdGUsIGFuZAotCSAqIGZvciBtb2RpZnlpbmcgdGhlIGNoaWxkcmVuJ3MgbGF5b3V0IGRhdGEuCi0JICovCQotCXZvaWQgY3JlYXRlQ29udHJvbEdyb3VwICgpIHsKLQkJY29udHJvbEdyb3VwID0gbmV3IEdyb3VwIChzYXNoLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xHcm91cC5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJQYXJhbWV0ZXJzIikpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgyLCB0cnVlKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTA7Ci0JCWNvbnRyb2xHcm91cC5zZXRMYXlvdXQgKGxheW91dCk7Ci0JCWZpbmFsIEJ1dHRvbiBwcmVmZXJyZWRCdXR0b24gPSBuZXcgQnV0dG9uIChjb250cm9sR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCXByZWZlcnJlZEJ1dHRvbi5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiUHJlZmVycmVkX1NpemUiKSk7Ci0JCXByZWZlcnJlZEJ1dHRvbi5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJcHJlZmVycmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlc2V0RWRpdG9ycyAoKTsKLQkJCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKWxheW91dENvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJaWYgKHByZWZlcnJlZEJ1dHRvbi5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJZGF0YS5oZWlnaHRIaW50ID0gZGF0YS53aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsJCi0JCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSAwOwotCQkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dERhdGEgKGRhdGEpOwotCQkJCWxheW91dEdyb3VwLmxheW91dCAodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlwcmVmZXJyZWRCdXR0b24uc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhIChTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsJCi0JCWNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpOwotCX0KLQkJCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgImNvbnRyb2wiIHdpZGdldCBjaGlsZHJlbi4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGF1Z21lbnQKLQkgKiB0aGUgc3RhbmRhcmQgY29udHJvbHMgY3JlYXRlZC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xXaWRnZXRzICgpIHsKLQkJY3JlYXRlQ2hpbGRHcm91cCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dCAoKSB7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbXBvc2l0ZSB0aGF0IGNvbnRhaW5zIHRoZSBleGFtcGxlIGxheW91dC4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dENvbXBvc2l0ZSAoKSB7Ci0JCWxheW91dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGxheW91dEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJbGF5b3V0Q29tcG9zaXRlLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWNyZWF0ZUxheW91dCAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGF5b3V0IGdyb3VwLiBUaGlzIGlzIHRoZSBncm91cCBvbiB0aGUKLQkgKiBsZWZ0IGhhbGYgb2YgZWFjaCBleGFtcGxlIHRhYi4KLQkgKi8KLQl2b2lkIGNyZWF0ZUxheW91dEdyb3VwICgpIHsKLQkJbGF5b3V0R3JvdXAgPSBuZXcgR3JvdXAgKHNhc2gsIFNXVC5OT05FKTsKLQkJbGF5b3V0R3JvdXAuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygiTGF5b3V0IikpOwotCQlsYXlvdXRHcm91cC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0ICgpKTsKLQkJY3JlYXRlTGF5b3V0Q29tcG9zaXRlICgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlIGZvciB0aGUgdGFiIGZvbGRlcgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlIChUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0JCS8qIENhY2hlIHRoZSBzaGVsbCBhbmQgZGlzcGxheS4gKi8KLQkJc2hlbGwgPSB0YWJGb2xkZXIuZ2V0U2hlbGwgKCk7Ci0JCWRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCi0JCS8qIENyZWF0ZSBhIHR3byBjb2x1bW4gcGFnZSB3aXRoIGEgU2FzaEZvcm0qLwotCQl0YWJGb2xkZXJQYWdlID0gbmV3IENvbXBvc2l0ZSAodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlclBhZ2Uuc2V0TGF5b3V0RGF0YSAobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0YWJGb2xkZXJQYWdlLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCQlzYXNoID0gbmV3IFNhc2hGb3JtICh0YWJGb2xkZXJQYWdlLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCi0JCS8qIENyZWF0ZSB0aGUgImxheW91dCIgYW5kICJjb250cm9sIiBjb2x1bW5zICovCi0JCWNyZWF0ZUxheW91dEdyb3VwICgpOwotCQljcmVhdGVDb250cm9sR3JvdXAgKCk7Ci0JCQotCQlzYXNoLnNldFdlaWdodHMoc2FzaFdlaWdodHMgKCkpOwkJCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluaXRpYWwgd2VpZ2h0IG9mIHRoZSBsYXlvdXQgYW5kIGNvbnRyb2wgZ3JvdXBzIHdpdGhpbiB0aGUgU2FzaEZvcm0uCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSB0YWItc3BlY2lmaWMgd2VpZ2h0cy4KLQkgKiBAcmV0dXJuIHRoZSBkZXNpcmVkIHNhc2ggd2VpZ2h0cyBmb3IgdGhlIHRhYiBwYWdlCi0JICovCi0JaW50W10gc2FzaFdlaWdodHMgKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHs1MCwgNTB9OwkJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGFibGVFZGl0b3Igd2l0aCBhIFRleHQgaW4gdGhlIGdpdmVuIGNvbHVtbgotCSAqIG9mIHRoZSB0YWJsZS4KLQkgKi8KLQl2b2lkIGNyZWF0ZVRleHRFZGl0b3IgKFRleHQgdGV4dCwgVGFibGVFZGl0b3IgdGV4dEVkaXRvciwgaW50IGNvbHVtbikgewotCQl0ZXh0LnNldEZvbnQgKHRhYmxlLmdldEZvbnQgKCkpOwotCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJdGV4dEVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCXRleHRFZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQl0ZXh0RWRpdG9yLnNldEVkaXRvciAodGV4dCwgbmV3SXRlbSwgY29sdW1uKTsKLQkJCi0JCXRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIAlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc2V0RWRpdG9ycyAodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgCWRpc3Bvc2VFZGl0b3JzICgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JfQotCQotCS8qKiAKLQkgKiBEaXNwb3NlcyB0aGUgZWRpdG9ycyB3aXRob3V0IHBsYWNpbmcgdGhlaXIgY29udGVudHMKLQkgKiBpbnRvIHRoZSB0YWJsZS4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgZGlzcG9zZUVkaXRvcnMgKCkgewotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgbmVlZGVkIHRvIHByb2R1Y2UgdGhlIGV4YW1wbGUgbGF5b3V0LgotCSAqLwkKLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVDb2RlICgpIHsKLQkJLyogTWFrZSBzdXJlIGFsbCBpbmZvcm1hdGlvbiBiZWluZyBlbnRlcmVkIGlzIHN0b3JlZCBpbiB0aGUgdGFibGUgKi8KLQkJcmVzZXRFZGl0b3JzICgpOwotCQkKLQkJLyogR2V0IG5hbWVzIGZvciBjb250cm9scyBpbiB0aGUgbGF5b3V0ICovCi0JCW5hbWVzID0gbmV3IFN0cmluZyBbY2hpbGRyZW4ubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJVGFibGVJdGVtIG15SXRlbSA9IHRhYmxlLmdldEl0ZW0oaSk7Ci0JCQlTdHJpbmcgbmFtZSA9IG15SXRlbS5nZXRUZXh0KDApOwotCQkJaWYgKG5hbWUubWF0Y2hlcygiXFxkIikpIHsKLQkJCQlDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbiBbaV07Ci0JCQkJU3RyaW5nIGNvbnRyb2xDbGFzcyA9IGNvbnRyb2wuZ2V0Q2xhc3MgKCkudG9TdHJpbmcgKCk7Ci0JCQkJU3RyaW5nIGNvbnRyb2xUeXBlID0gY29udHJvbENsYXNzLnN1YnN0cmluZyAoY29udHJvbENsYXNzLmxhc3RJbmRleE9mICgnLicpICsgMSk7Ci0JCQkJbmFtZXMgW2ldID0gY29udHJvbFR5cGUudG9Mb3dlckNhc2UgKCkgKyBpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lcyBbaV0gPSBteUl0ZW0uZ2V0VGV4dCgwKTsKLQkJCX0JCi0JCX0KLQkKLQkJLyogQ3JlYXRlIFN0cmluZ0J1ZmZlciBjb250YWluaW5nIHRoZSBjb2RlICovCi0JCVN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlciAoKTsKLQkJY29kZS5hcHBlbmQgKCJpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qO1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7XG4iKTsKLQkJaWYgKG5lZWRzQ3VzdG9tICgpKSBjb2RlLmFwcGVuZCAoImltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7XG4iKTsKLQkJaWYgKG5lZWRzR3JhcGhpY3MgKCkpIGNvZGUuYXBwZW5kICgiaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qO1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiXG4iKTsKLQkJY29kZS5hcHBlbmQgKCJwdWJsaWMgY2xhc3MgTXlMYXlvdXQge1xuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHtcbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0XHREaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTtcbiIpOwotCQljb2RlLmFwcGVuZCAoIlx0XHRTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7XG4iKTsKLQkJCi0JCS8qIEdldCBsYXlvdXQgc3BlY2lmaWMgY29kZSAqLwotCQljb2RlLmFwcGVuZCAoZ2VuZXJhdGVMYXlvdXRDb2RlICgpKTsKLQkJCi0JCWNvZGUuYXBwZW5kICgiXG5cdFx0c2hlbGwucGFjayAoKTtcblx0XHRzaGVsbC5vcGVuICgpO1xuXG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0d2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7XG4iKTsKLQkJY29kZS5hcHBlbmQgKCJcdFx0XHRpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKVxuIik7Ci0JCWNvZGUuYXBwZW5kICgiXHRcdFx0XHRkaXNwbGF5LnNsZWVwICgpO1xuXHRcdH1cblx0XHRkaXNwbGF5LmRpc3Bvc2UgKCk7XG5cdH1cbn0iKTsKLQkJCi0JCXJldHVybiBjb2RlOwotCX0KLQkKLQlib29sZWFuIG5lZWRzR3JhcGhpY3MoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlib29sZWFuIG5lZWRzQ3VzdG9tKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIGxheW91dCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgZXhhbXBsZSBsYXlvdXQuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlTdHJpbmdCdWZmZXIgZ2VuZXJhdGVMYXlvdXRDb2RlICgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIgKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFN0cmluZ0J1ZmZlciBmb3IgdGhlIGNvZGUgd2hpY2ggd2lsbCAKLQkgKiBjcmVhdGUgYSBjaGlsZCBjb250cm9sLgotCSAqLwotCVN0cmluZ0J1ZmZlciBnZXRDaGlsZENvZGUgKENvbnRyb2wgY29udHJvbCwgaW50IGkpIHsKLQkJU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyICgpOwotCQkvKiBGaW5kIHRoZSB0eXBlIG9mIGNvbnRyb2wgKi8KLQkJU3RyaW5nIGNvbnRyb2xDbGFzcyA9IGNvbnRyb2wuZ2V0Q2xhc3MoKS50b1N0cmluZyAoKTsKLQkJU3RyaW5nIGNvbnRyb2xUeXBlID0gY29udHJvbENsYXNzLnN1YnN0cmluZyAoY29udHJvbENsYXNzLmxhc3RJbmRleE9mICgnLicpICsgMSk7Ci0JCS8qIEZpbmQgdGhlIHN0eWxlIG9mIHRoZSBjb250cm9sICovCi0JCVN0cmluZyBzdHlsZVN0cmluZzsKLQkJaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIkJ1dHRvbiIpKSB7Ci0JCQlzdHlsZVN0cmluZyA9ICJTV1QuUFVTSCI7Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiU3R5bGVkVGV4dCIpKSB7Ci0JCQlzdHlsZVN0cmluZyA9ICJTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIjsKLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJDYW52YXMiKSB8fCBjb250cm9sVHlwZS5lcXVhbHMgKCJDb21wb3NpdGUiKSB8fCAKLQkJCQkJY29udHJvbFR5cGUuZXF1YWxzICgiVGFibGUiKSB8fCBjb250cm9sVHlwZS5lcXVhbHMgKCJTdHlsZWRUZXh0IikgfHwKLQkJCQkJY29udHJvbFR5cGUuZXF1YWxzICgiVG9vbEJhciIpIHx8IGNvbnRyb2xUeXBlLmVxdWFscyAoIlRyZWUiKSB8fAotCQkJCQljb250cm9sVHlwZS5lcXVhbHMgKCJMaXN0IikgfHwgY29udHJvbFR5cGUuZXF1YWxzICgiVGV4dCIpKSB7Ci0JCQlzdHlsZVN0cmluZyA9ICJTV1QuQk9SREVSIjsKLQkJfSBlbHNlIHN0eWxlU3RyaW5nID0gIlNXVC5OT05FIjsKLQkJLyogV3JpdGUgb3V0IHRoZSBjb250cm9sIGJlaW5nIGRlY2xhcmVkICovCi0JCWNvZGUuYXBwZW5kICgiXG5cdFx0IiArIGNvbnRyb2xUeXBlICsgIiAiICsgbmFtZXMgW2ldICsgCi0JCQkJCSAiID0gbmV3ICIgKyBjb250cm9sVHlwZSArICIgKHNoZWxsLCAiICsgc3R5bGVTdHJpbmcgKyAiKTtcbiIpOwotCQkvKiBBZGQgaXRlbXMgdG8gdGhvc2UgY29udHJvbHMgdGhhdCBuZWVkIGl0ZW1zICovCi0JCWlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJDb21ibyIpIHx8IGNvbnRyb2xUeXBlLmVxdWFscyAoIkxpc3QiKSkgewotCQkJY29kZS5hcHBlbmQgKCJcdFx0IiArIG5hbWVzIFtpXSArICIuc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10ge1wiSXRlbSAxXCIsIFwiSXRlbSAyXCIsIFwiSXRlbSAyXCJ9KTtcbiIpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2xUeXBlLmVxdWFscyAoIlRhYmxlIikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7XG4iKTsKLQkJCWZvciAoaW50IGogPSAxOyBqIDwgMzsgaisrKSB7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0VGFibGVJdGVtIHRhYmxlSXRlbSIgKyBqICsgIiA9IG5ldyBUYWJsZUl0ZW0gKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuTk9ORSk7XG4iKTsKLQkJCQljb2RlLmFwcGVuZCAoIlx0XHR0YWJsZUl0ZW0iICsgaiArICIuc2V0VGV4dCAoXCJJdGVtIiArIGogKyAiXCIpO1xuIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiVHJlZSIpKSB7Ci0JCQlmb3IgKGludCBqID0gMTsgaiA8IDM7IGorKykgewotCQkJCWNvZGUuYXBwZW5kICgiXHRcdFRyZWVJdGVtIHRyZWVJdGVtIiArIGogKyAiID0gbmV3IFRyZWVJdGVtICgiICsgbmFtZXMgW2ldICsgIiwgU1dULk5PTkUpO1xuIik7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0dHJlZUl0ZW0iICsgaiArICIuc2V0VGV4dCAoXCJJdGVtIiArIGogKyAiXCIpO1xuIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiVG9vbEJhciIpKSB7Ci0JCQlmb3IgKGludCBqID0gMTsgaiA8IDM7IGorKykgewotCQkJCWNvZGUuYXBwZW5kICgiXHRcdFRvb2xJdGVtIHRvb2xJdGVtIiArIGogKyAiID0gbmV3IFRvb2xJdGVtICgiICsgbmFtZXMgW2ldICsgIiwgU1dULk5PTkUpO1xuIik7Ci0JCQkJY29kZS5hcHBlbmQgKCJcdFx0dG9vbEl0ZW0iICsgaiArICIuc2V0VGV4dCAoXCJJdGVtIiArIGogKyAiXCIpO1xuIik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiQ29vbEJhciIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRUb29sQmFyIGNvb2xUb29sQmFyID0gbmV3IFRvb2xCYXIgKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuQk9SREVSKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0VG9vbEl0ZW0gY29vbFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtIChjb29sVG9vbEJhciwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0uc2V0VGV4dCAoXCJJdGVtIDFcIik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbSA9IG5ldyBUb29sSXRlbSAoY29vbFRvb2xCYXIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtLnNldFRleHQgKFwiSXRlbSAyXCIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRDb29sSXRlbSBjb29sSXRlbTEgPSBuZXcgQ29vbEl0ZW0gKCIgKyBuYW1lcyBbaV0gKyAiLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xJdGVtMS5zZXRDb250cm9sIChjb29sVG9vbEJhcik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdFBvaW50IHNpemUgPSBjb29sVG9vbEJhci5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbEl0ZW0xLnNldFNpemUgKGNvb2xJdGVtMS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xCYXIgPSBuZXcgVG9vbEJhciAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5CT1JERVIpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGNvb2xUb29sQmFyLCBTV1QuTk9ORSk7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdGNvb2xUb29sSXRlbS5zZXRUZXh0IChcIkl0ZW0gM1wiKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtIChjb29sVG9vbEJhciwgU1dULk5PTkUpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sVG9vbEl0ZW0uc2V0VGV4dCAoXCJJdGVtIDRcIik7XG4iKTsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdENvb2xJdGVtIGNvb2xJdGVtMiA9IG5ldyBDb29sSXRlbSAoIiArIG5hbWVzIFtpXSArICIsIFNXVC5OT05FKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0Y29vbEl0ZW0yLnNldENvbnRyb2wgKGNvb2xUb29sQmFyKTtcbiIpOwotCQkJY29kZS5hcHBlbmQgKCJcdFx0c2l6ZSA9IGNvb2xUb29sQmFyLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHRjb29sSXRlbTIuc2V0U2l6ZSAoY29vbEl0ZW0yLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSkpO1xuIik7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRTaXplICgiICsgbmFtZXMgW2ldICsgIi5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7XG4iKTsKLQkJfSBlbHNlIGlmIChjb250cm9sVHlwZS5lcXVhbHMgKCJQcm9ncmVzc0JhciIpKSB7Ci0JCQljb2RlLmFwcGVuZCAoIlx0XHQiICsgbmFtZXMgW2ldICsgIi5zZXRTZWxlY3Rpb24gKDUwKTtcbiIpOwotCQl9IAotCQkvKiBTZXQgdGV4dCBmb3IgdGhvc2UgY29udHJvbHMgdGhhdCBzdXBwb3J0IGl0ICovCQkJIAotCQlpZiAoY29udHJvbFR5cGUuZXF1YWxzICgiQnV0dG9uIikgfHwKLQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIkNvbWJvIikgfHwKLQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIkdyb3VwIikgfHwKLQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIkxhYmVsIikgfHwKLQkJCWNvbnRyb2xUeXBlLmVxdWFscyAoIkxpbmsiKSB8fAotCQkJY29udHJvbFR5cGUuZXF1YWxzICgiU3R5bGVkVGV4dCIpIHx8Ci0JCQljb250cm9sVHlwZS5lcXVhbHMgKCJUZXh0IikpIHsKLQkJCWNvZGUuYXBwZW5kICgiXHRcdCIgKyBuYW1lcyBbaV0gKyAiLnNldFRleHQgKFwiIiArIG5hbWVzIFtpXSArICJcIik7XG4iKTsKLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdG8gaW5zZXJ0IHdoZW4gYSBuZXcgY2hpbGQgY29udHJvbCBpcyBhZGRlZCB0byB0aGUgdGFibGUuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlTdHJpbmdbXSBnZXRJbnNlcnRTdHJpbmcgKFN0cmluZyBuYW1lLCBTdHJpbmcgY29udHJvbFR5cGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEgZmllbGQgbmFtZXMuCi0JICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlTdHJpbmcgW10gZ2V0TGF5b3V0RGF0YUZpZWxkTmFtZXMgKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyBbXSB7fTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBmb3IgdGhlIHRhYiBmb2xkZXIgaXRlbS4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0ICgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQkKLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGNvbXBvc2l0ZSBhbmQgZHJhd3MgYWxsIGNvbnRyb2xzCi0JICogaW4gdGhlIGxheW91dCBleGFtcGxlLgotCSAqLwotCXZvaWQgcmVmcmVzaExheW91dENvbXBvc2l0ZSAoKSB7Ci0JCS8qIFJlbW92ZSBjaGlsZHJlbiB0aGF0IGFyZSBhbHJlYWR5IGxhaWQgb3V0ICovCi0JCWNoaWxkcmVuID0gbGF5b3V0Q29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGlsZHJlbiBbaV0uZGlzcG9zZSAoKTsKLQkJfQotCQkvKiBBZGQgYWxsIGNoaWxkcmVuIGxpc3RlZCBpbiB0aGUgdGFibGUgKi8KLQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCWNoaWxkcmVuID0gbmV3IENvbnRyb2wgW2l0ZW1zLmxlbmd0aF07Ci0JCVN0cmluZyBbXSBpdGVtVmFsdWVzID0gbmV3IFN0cmluZyBbXSB7Ci0JCQlMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsIG5ldyBTdHJpbmcgW10geyIxIn0pLAotCQkJTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLCBuZXcgU3RyaW5nIFtdIHsiMiJ9KSwKLQkJCUxheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIiwgbmV3IFN0cmluZyBbXSB7IjMifSl9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY29udHJvbCA9IGl0ZW1zIFtpXS5nZXRUZXh0ICgxKTsKLQkJCVN0cmluZyBjb250cm9sTmFtZSA9IGl0ZW1zIFtpXS5nZXRUZXh0ICgwKTsKLQkJCWlmIChjb250cm9sLmVxdWFscyAoIkJ1dHRvbiIpKSB7Ci0JCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGxheW91dENvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJCWJ1dHRvbi5zZXRUZXh0IChjb250cm9sTmFtZSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gYnV0dG9uOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkNhbnZhcyIpKSB7Ci0JCQkJQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJY2hpbGRyZW4gW2ldID0gY2FudmFzOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIkNvbWJvIikpIHsKLQkJCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJY29tYm8uc2V0SXRlbXMgKGl0ZW1WYWx1ZXMpOwotCQkJCWNvbWJvLnNldFRleHQgKGNvbnRyb2xOYW1lKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBjb21ibzsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJDb21wb3NpdGUiKSkgeyAKLQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQljaGlsZHJlbiBbaV0gPSBjb21wb3NpdGU7Ci0JCSAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiQ29vbEJhciIpKSB7IAotCQkgICAgCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJICAgIAlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoY29vbEJhciwgU1dULkJPUkRFUik7Ci0JCQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbS5zZXRUZXh0IChMYXlvdXRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nICgiSXRlbSIsbmV3IFN0cmluZyBbXSB7IjEifSkpOwotCQkJCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pKTsKLQkJICAgIAlDb29sSXRlbSBjb29sSXRlbTEgPSBuZXcgQ29vbEl0ZW0gKGNvb2xCYXIsIDApOwotCQkgICAgCWNvb2xJdGVtMS5zZXRDb250cm9sICh0b29sQmFyKTsKLQkJCQl0b29sQmFyID0gbmV3IFRvb2xCYXIgKGNvb2xCYXIsIFNXVC5CT1JERVIpOwotCQkJCWl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIzIn0pKTsKLQkJCQlpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCAwKTsKLQkJCQlpdGVtLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiNCJ9KSk7Ci0JCSAgICAJQ29vbEl0ZW0gY29vbEl0ZW0yID0gbmV3IENvb2xJdGVtIChjb29sQmFyLCAwKTsKLQkJICAgIAljb29sSXRlbTIuc2V0Q29udHJvbCAodG9vbEJhcik7Ci0JCSAgICAJUG9pbnQgc2l6ZSA9IHRvb2xCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgCQljb29sSXRlbTEuc2V0U2l6ZShjb29sSXRlbTEuY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7Ci0gICAgICAgIAkJY29vbEl0ZW0yLnNldFNpemUoY29vbEl0ZW0yLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSkpOwotICAgICAgIAkJCWNvb2xCYXIuc2V0U2l6ZShjb29sQmFyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGNvb2xCYXI7Ci0JCSAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiR3JvdXAiKSkgewotCQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQlncm91cC5zZXRUZXh0IChjb250cm9sTmFtZSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gZ3JvdXA7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiTGFiZWwiKSkgewotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChsYXlvdXRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQlsYWJlbC5zZXRUZXh0IChjb250cm9sTmFtZSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gbGFiZWw7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiTGluayIpKSB7Ci0JCQkJTGluayBsaW5rID0gbmV3IExpbmsgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWxpbmsuc2V0VGV4dCAoY29udHJvbE5hbWUpOwotCQkJCWNoaWxkcmVuIFtpXSA9IGxpbms7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiTGlzdCIpKSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IExpc3QgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJbGlzdC5zZXRJdGVtcyAoaXRlbVZhbHVlcyk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gbGlzdDsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJQcm9ncmVzc0JhciIpKSB7Ci0JCQkJUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3MgPSBuZXcgUHJvZ3Jlc3NCYXIgKGxheW91dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCXByb2dyZXNzLnNldFNlbGVjdGlvbiAoNTApOwotCQkJCWNoaWxkcmVuIFtpXSA9IHByb2dyZXNzOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlNjYWxlIikpIHsKLQkJCQlTY2FsZSBzY2FsZSA9IG5ldyBTY2FsZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gc2NhbGU7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiU2xpZGVyIikpIHsKLQkJCQlTbGlkZXIgc2xpZGVyID0gbmV3IFNsaWRlciAobGF5b3V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gc2xpZGVyOwotCQkJfSBlbHNlIGlmIChjb250cm9sLmVxdWFscyAoIlN0eWxlZFRleHQiKSkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0IChsYXlvdXRDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJCXN0eWxlZFRleHQuc2V0VGV4dCAoY29udHJvbE5hbWUpOwotCQkJCWNoaWxkcmVuIFtpXSA9IHN0eWxlZFRleHQ7CQkJCi0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiVGFibGUiKSkgewotCQkJCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChsYXlvdXRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JCQkJVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQkJCWl0ZW0xLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMSJ9KSk7Ci0JCQkJVGFibGVJdGVtIGl0ZW0yID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQkJCWl0ZW0yLnNldFRleHQgKExheW91dEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcgKCJJdGVtIixuZXcgU3RyaW5nIFtdIHsiMiJ9KSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gdGFibGU7Ci0JCQl9IGVsc2UgaWYgKGNvbnRyb2wuZXF1YWxzICgiVGV4dCIpKSB7Ci0JCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQgKGxheW91dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJdGV4dC5zZXRUZXh0IChjb250cm9sTmFtZSk7Ci0JCQkJY2hpbGRyZW4gW2ldID0gdGV4dDsKLQkJCX0gZWxzZSBpZiAoY29udHJvbC5lcXVhbHMgKCJUb29sQmFyIikpIHsKLQkJCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQlUb29sSXRlbSBpdGVtMSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbTEuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pKTsKLQkJCQlUb29sSXRlbSBpdGVtMiA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgMCk7Ci0JCQkJaXRlbTIuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSB0b29sQmFyOwotCQkJfSBlbHNlIHsKLQkJCQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAobGF5b3V0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCQkJaXRlbTEuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIxIn0pKTsKLQkJCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCQkJaXRlbTIuc2V0VGV4dCAoTGF5b3V0RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyAoIkl0ZW0iLG5ldyBTdHJpbmcgW10geyIyIn0pKTsKLQkJCQljaGlsZHJlbiBbaV0gPSB0cmVlOwotCQkJfSAKLQkJfQotCX0JCi0JCi0Jdm9pZCByZXNldEVkaXRvcnMgKCkgewotCQlyZXNldEVkaXRvcnMgKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGFrZXMgaW5mb3JtYXRpb24gZnJvbSBUYWJsZUVkaXRvcnMgYW5kIHN0b3JlcyBpdC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgcmVzZXRFZGl0b3JzIChib29sZWFuIHRhYikgewotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhlIGNoaWxkcmVuIG9mIHRoZSBsYXlvdXQuIAotCSAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBzZXRMYXlvdXREYXRhICgpIHsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGxheW91dC4KLQkgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgc2V0TGF5b3V0U3RhdGUgKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0FpcmJydXNoVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQWlyYnJ1c2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmM2ZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQWlyYnJ1c2hUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEFuIGFpcmJydXNoIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBBaXJicnVzaFRvb2wgZXh0ZW5kcyBDb250aW51b3VzUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQlwcml2YXRlIFJhbmRvbSByYW5kb207Ci0JcHJpdmF0ZSBpbnQgY2FjaGVkUmFkaXVzU3F1YXJlZDsKLQlwcml2YXRlIGludCBjYWNoZWROdW1Qb2ludHM7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIEFpcmJydXNoVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXJhbmRvbSA9IG5ldyBSYW5kb20oKTsKLQkJc2V0UmV0cmlnZ2VyVGltZXIoMTApOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJLy8gY29tcHV0ZSB0aGluZ3Mgd2UgbmVlZCB0byBrbm93IGZvciBkcmF3aW5nCi0JCXNldHRpbmdzID0gdG9vbFNldHRpbmdzOwotCQljYWNoZWRSYWRpdXNTcXVhcmVkID0gc2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMgKiBzZXR0aW5ncy5haXJicnVzaFJhZGl1czsKLQkJY2FjaGVkTnVtUG9pbnRzID0gMzE0ICogc2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkgKiBjYWNoZWRSYWRpdXNTcXVhcmVkIC8gMjUwMDAwOwotCQlpZiAoY2FjaGVkTnVtUG9pbnRzID09IDAgJiYgc2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkgIT0gMCkKLQkJCWNhY2hlZE51bVBvaW50cyA9IDE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuQWlyYnJ1c2gubGFiZWwiKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBsYXRlIG1ldGhvZCBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbmRlcihQb2ludCBwb2ludCkgewotCQkvLyBEcmF3cyBhIGJ1bmNoIChjYWNoZWROdW1Qb2ludHMpIG9mIHJhbmRvbSBwaXhlbHMgd2l0aGluIGEgc3BlY2lmaWVkIGNpcmNsZSAoY2FjaGVkUmFkaXVzU3F1YXJlZCkuCi0JCUNvbnRhaW5lckZpZ3VyZSBjZmlnID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkTnVtUG9pbnRzOyArK2kpIHsKLQkJCWludCByYW5kWCwgcmFuZFk7Ci0JCQlkbyB7Ci0JCQkJcmFuZFggPSAoaW50KSAoKHJhbmRvbS5uZXh0RG91YmxlKCkgLSAwLjUpICogc2V0dGluZ3MuYWlyYnJ1c2hSYWRpdXMgKiAyLjApOwotCQkJCXJhbmRZID0gKGludCkgKChyYW5kb20ubmV4dERvdWJsZSgpIC0gMC41KSAqIHNldHRpbmdzLmFpcmJydXNoUmFkaXVzICogMi4wKTsKLQkJCX0gd2hpbGUgKHJhbmRYICogcmFuZFggKyByYW5kWSAqIHJhbmRZID4gY2FjaGVkUmFkaXVzU3F1YXJlZCk7Ci0JCQljZmlnLmFkZChuZXcgUG9pbnRGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBwb2ludC54ICsgcmFuZFgsIHBvaW50LnkgKyByYW5kWSkpOwotCQl9Ci0JCWdldFBhaW50U3VyZmFjZSgpLmRyYXdGaWd1cmUoY2ZpZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQmFzaWNQYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0Jhc2ljUGFpbnRTZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmZkZjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQmFzaWNQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2ljUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRTZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgcGFpbnQgc3VyZmFjZQotCSAqLwotCXByaXZhdGUgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgZHJhd2luZyBzdXJmYWNlIHRvIHVzZQotCSAqLwotCXByb3RlY3RlZCBCYXNpY1BhaW50U2Vzc2lvbihQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXRoaXMucGFpbnRTdXJmYWNlID0gcGFpbnRTdXJmYWNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhaW50IHN1cmZhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFpbnQgc2Vzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIFBhaW50U3VyZmFjZQotCSAqLwotCXB1YmxpYyBQYWludFN1cmZhY2UgZ2V0UGFpbnRTdXJmYWNlKCkgewotCQlyZXR1cm4gcGFpbnRTdXJmYWNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRhaW5lckZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGFpbmVyRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzc1M2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGFpbmVyRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBDb250YWluZXIgZm9yIEZpZ3VyZSBvYmplY3RzIHdpdGggc3RhY2tpbmcgcHJldmlldyBtZWNoYW5pc20uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWluZXJGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0FSUkFZX1NJWkUgPSAxNjsKLQkKLQlGaWd1cmVbXSAgIG9iamVjdFN0YWNrID0gbnVsbDsKLQlpbnQgICAgICBuZXh0SW5kZXggPSAwOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBlbXB0eSBDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29udGFpbmVyRmlndXJlKCkgewotCX0KLQkvKioKLQkgKiBBZGRzIGFuIG9iamVjdCB0byB0aGUgY29udGFpbmVyIGZvciBsYXRlciBkcmF3aW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhZGQgdG8gdGhlIGRyYXdpbmcgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChGaWd1cmUgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3RTdGFjayA9PSBudWxsKSB7Ci0JCQlvYmplY3RTdGFjayA9IG5ldyBGaWd1cmVbSU5JVElBTF9BUlJBWV9TSVpFXTsKLQkJfSBlbHNlIGlmIChvYmplY3RTdGFjay5sZW5ndGggPD0gbmV4dEluZGV4KSB7Ci0JCQlGaWd1cmVbXSBuZXdPYmplY3RTdGFjayA9IG5ldyBGaWd1cmVbb2JqZWN0U3RhY2subGVuZ3RoICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9iamVjdFN0YWNrLCAwLCBuZXdPYmplY3RTdGFjaywgMCwgb2JqZWN0U3RhY2subGVuZ3RoKTsKLQkJCW9iamVjdFN0YWNrID0gbmV3T2JqZWN0U3RhY2s7Ci0JCX0KLQkJb2JqZWN0U3RhY2tbbmV4dEluZGV4XSA9IG9iamVjdDsKLQkJKytuZXh0SW5kZXg7Ci0JfQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBuZXh0SW5kZXggPT0gMDsKLQl9Ci0JLyoqCi0JICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIGNvbnRhaW5lciBhbmQgZHJhd3MgaXRzIHByZXZpZXcgdGhlbiB1cGRhdGVzIHRoZSBzdXBwbGllZCBwcmV2aWV3IHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhZGQgdG8gdGhlIGRyYXdpbmcgbGlzdAotCSAqIEBwYXJhbSBnYyB0aGUgR0MgdG8gZHJhdyBvbgotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byBhZGQgdG8gdmlydHVhbCBjb29yZGluYXRlcyB0byBnZXQgZGlzcGxheSBjb29yZGluYXRlcwotCSAqIEBwYXJhbSByZW1lbWJlcmVkU3RhdGUgdGhlIHN0YXRlIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgZHJhd1ByZXZpZXcoKSBvciBhZGRBbmRQcmV2aWV3KCkKLQkgKiAgICAgICAgdXNpbmcgdGhpcyBDb250YWluZXIsIG1heSBiZSBudWxsIGlmIHRoZXJlIHdhcyBubyBzdWNoIHByZXZpb3VzIGNhbGwKLQkgKiBAcmV0dXJuIG9iamVjdCBzdGF0ZSB0aGF0IG11c3QgYmUgcGFzc2VkIHRvIGVyYXNlUHJldmlldygpIGxhdGVyIHRvIGVyYXNlIHRoaXMgb2JqZWN0Ci0JICovCi0vLwlwdWJsaWMgT2JqZWN0IGFkZEFuZFByZXZpZXcoRmlndXJlIG9iamVjdCwgR0MgZ2MsIFBvaW50IG9mZnNldCwgT2JqZWN0IHJlbWVtYmVyZWRTdGF0ZSkgewotLy8JCU9iamVjdFtdIHN0YXRlU3RhY2sgPSAoT2JqZWN0W10pIHJlbWVtYmVyZWRTdGF0ZTsKLS8vCQlpZiAoc3RhdGVTdGFjayA9PSBudWxsKSB7Ci0vLwkJCXN0YXRlU3RhY2sgPSBuZXcgT2JqZWN0W0lOSVRJQUxfQVJSQVlfU0laRV07Ci0vLwkJfSBlbHNlIGlmIChzdGF0ZVN0YWNrLmxlbmd0aCA8PSBuZXh0SW5kZXgpIHsKLS8vCQkJT2JqZWN0W10gbmV3U3RhdGVTdGFjayA9IG5ldyBPYmplY3Rbc3RhdGVTdGFjay5sZW5ndGggKiAyXTsKLS8vCQkJU3lzdGVtLmFycmF5Y29weShzdGF0ZVN0YWNrLCAwLCBuZXdTdGF0ZVN0YWNrLCAwLCBzdGF0ZVN0YWNrLmxlbmd0aCk7Ci0vLwkJCXN0YXRlU3RhY2sgPSBuZXdTdGF0ZVN0YWNrOwotLy8JCX0KLS8vCQlhZGQob2JqZWN0KTsKLS8vCQlzdGF0ZVN0YWNrW25leHRJbmRleCAtIDFdID0gb2JqZWN0LmRyYXdQcmV2aWV3KGdjLCBvZmZzZXQpOwotLy8JCXJldHVybiBzdGF0ZVN0YWNrOwotLy8JfQotCS8qKgotCSAqIENsZWFycyB0aGUgY29udGFpbmVyLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBlcmFzZVByZXZpZXcoKSBjYW5ub3QgYmUgY2FsbGVkIGFmdGVyIHRoaXMgcG9pbnQgdG8gZXJhc2UgYW55IHByZXZpb3VzCi0JICogZHJhd1ByZXZpZXcoKSdzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJd2hpbGUgKC0tbmV4dEluZGV4ID4gMCkgb2JqZWN0U3RhY2tbbmV4dEluZGV4XSA9IG51bGw7Ci0JCW5leHRJbmRleCA9IDA7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dEluZGV4OyArK2kpIG9iamVjdFN0YWNrW2ldLmRyYXcoZmRjKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0SW5kZXg7ICsraSkgb2JqZWN0U3RhY2tbaV0uYWRkRGFtYWdlZFJlZ2lvbihmZGMsIHJlZ2lvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGludW91c1BhaW50U2Vzc2lvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvQ29udGludW91c1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE1MzUxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0NvbnRpbnVvdXNQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBUaGUgc3VwZXJjbGFzcyBmb3IgcGFpbnQgdG9vbHMgdGhhdCBkcmF3IGNvbnRpbnVvdXNseSBhbG9uZyB0aGUgcGF0aAotICogdHJhY2VkIGJ5IHRoZSBtb3VzZSdzIG1vdmVtZW50IHdoaWxlIHRoZSBidXR0b24gaXMgZGVwcmVzc2VkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250aW51b3VzUGFpbnRTZXNzaW9uIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gewotCS8qKgotCSAqIFRydWUgaWYgYSBjbGljay1kcmFnIGlzIGluIHByb2dyZXNzLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQotCS8qKgotCSAqIEEgY2FjaGVkIFBvaW50IGFycmF5IGZvciBkcmF3aW5nLgotCSAqLwotCXByaXZhdGUgUG9pbnRbXSBwb2ludHMgPSBuZXcgUG9pbnRbXSB7IG5ldyBQb2ludCgtMSwgLTEpLCBuZXcgUG9pbnQoLTEsIC0xKSB9OwotCi0JLyoqCi0JICogVGhlIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIHJldHJpZ2dlcnMgaW4gbWlsbGlzZWNvbmRzLgotCSAqLwotCXByaXZhdGUgaW50IHJldHJpZ2dlckludGVydmFsID0gMDsKLQkKLQkvKioKLQkgKiBUaGUgY3VycmVudGx5IHZhbGlkIFJldHJpZ2dlckhhbmRsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgUnVubmFibGUgcmV0cmlnZ2VySGFuZGxlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgQ29udGludW91c1BhaW50U2Vzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBkcmF3aW5nIHN1cmZhY2UgdG8gdXNlCi0JICovCi0JcHJvdGVjdGVkIENvbnRpbnVvdXNQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJldHJpZ2dlciB0aW1lci4KLQkgKiA8cD4KLQkgKiBBZnRlciB0aGUgdGltZXIgZWxhcHNlcywgaWYgdGhlIG1vdXNlIGlzIHN0aWxsIGhvdmVyaW5nIG92ZXIgdGhlIHNhbWUgcG9pbnQgd2l0aCB0aGUKLQkgKiBkcmFnIGJ1dHRvbiBwcmVzc2VkLCBhIG5ldyByZW5kZXIgb3JkZXIgaXMgaXNzdWVkIGFuZCB0aGUgdGltZXIgaXMgcmVzdGFydGVkLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gaW50ZXJ2YWwgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiByZXRyaWdnZXJzLCAwIHRvIGRpc2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXRyaWdnZXJUaW1lcihpbnQgaW50ZXJ2YWwpIHsKLQkJcmV0cmlnZ2VySW50ZXJ2YWwgPSBpbnRlcnZhbDsKLQl9Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIHRvb2wuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5TZXNzaW9uKCkgewotCQlnZXRQYWludFN1cmZhY2UoKS4KLQkJCXNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzZXNzaW9uLkNvbnRpbnVvdXNQYWludC5tZXNzYWdlIikpOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgdG9vbC4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKCkgewotCQlhYm9ydFJldHJpZ2dlcigpOwotCX0KLQkKLQkvKioKLQkgKiBBYm9ydHMgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0U2Vzc2lvbigpIHsKLQkJYWJvcnRSZXRyaWdnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3duIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCWlmIChkcmFnSW5Qcm9ncmVzcykgcmV0dXJuOyAvLyBzcHVyaW91cyBldmVudAotCQlkcmFnSW5Qcm9ncmVzcyA9IHRydWU7Ci0KLQkJcG9pbnRzWzBdLnggPSBldmVudC54OwotCQlwb2ludHNbMF0ueSA9IGV2ZW50Lnk7Ci0JCXJlbmRlcihwb2ludHNbMF0pOwotCQlwcmVwYXJlUmV0cmlnZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG91YmxlQ2xpY2sgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VVcCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHJldHVybjsKLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJYWJvcnRSZXRyaWdnZXIoKTsKLQkJbW91c2VTZWdtZW50RmluaXNoZWQoZXZlbnQpOwotCQlkcmFnSW5Qcm9ncmVzcyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VNb3ZlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgUGFpbnRTdXJmYWNlIHBzID0gZ2V0UGFpbnRTdXJmYWNlKCk7Ci0JCXBzLnNldFN0YXR1c0Nvb3JkKHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsKLQkJbW91c2VTZWdtZW50RmluaXNoZWQoZXZlbnQpOwotCQlwcmVwYXJlUmV0cmlnZ2VyKCk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSBhIHJlbmRlcmluZyBzZWdtZW50Ci0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgbW91c2VTZWdtZW50RmluaXNoZWQoTW91c2VFdmVudCBldmVudCkgewotCQlpZiAocG9pbnRzWzBdLnggPT0gLTEpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJaWYgKHBvaW50c1swXS54ICE9IGV2ZW50LnggfHwgcG9pbnRzWzBdLnkgIT0gZXZlbnQueSkgewotCQkJLy8gZHJhdyBuZXcgc2VnbWVudAotCQkJcG9pbnRzWzFdLnggPSBldmVudC54OwotCQkJcG9pbnRzWzFdLnkgPSBldmVudC55OwotCQkJcmVuZGVyQ29udGludW91c1NlZ21lbnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERyYXdzIGEgY29udGludW91cyBzZWdtZW50IGZyb20gcG9pbnRzWzBdIHRvIHBvaW50c1sxXS4KLQkgKiBBc3N1bWVzIHBvaW50c1swXSBoYXMgYmVlbiBkcmF3biBhbHJlYWR5LgotCSAqIAotCSAqIEBwb3N0IHBvaW50c1swXSB3aWxsIHJlZmVyIHRvIHRoZSBzYW1lIHBvaW50IGFzIHBvaW50c1sxXQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbmRlckNvbnRpbnVvdXNTZWdtZW50KCkgewotCQkvKiBBIGxhenkgYnV0IGVmZmVjdGl2ZSBsaW5lIGRyYXdpbmcgYWxnb3JpdGhtICovCi0JCWZpbmFsIGludCBkWCA9IHBvaW50c1sxXS54IC0gcG9pbnRzWzBdLng7Ci0JCWZpbmFsIGludCBkWSA9IHBvaW50c1sxXS55IC0gcG9pbnRzWzBdLnk7Ci0JCWludCBhYnNkWCA9IE1hdGguYWJzKGRYKTsKLQkJaW50IGFic2RZID0gTWF0aC5hYnMoZFkpOwotCi0JCWlmICgoZFggPT0gMCkgJiYgKGRZID09IDApKSByZXR1cm47Ci0JCQotCQlpZiAoYWJzZFkgPiBhYnNkWCkgewotCQkJZmluYWwgaW50IGluY2ZwWCA9IChkWCA8PCAxNikgLyBhYnNkWTsKLQkJCWZpbmFsIGludCBpbmNZID0gKGRZID4gMCkgPyAxIDogLTE7Ci0JCQlpbnQgZnBYID0gcG9pbnRzWzBdLnggPDwgMTY7IC8vIFggaW4gZml4ZWRwb2ludCBmb3JtYXQKLQotCQkJd2hpbGUgKC0tYWJzZFkgPj0gMCkgewotCQkJCXBvaW50c1swXS55ICs9IGluY1k7Ci0JCQkJcG9pbnRzWzBdLnggPSAoZnBYICs9IGluY2ZwWCkgPj4gMTY7Ci0JCQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JCQl9Ci0JCQlpZiAocG9pbnRzWzBdLnggPT0gcG9pbnRzWzFdLngpIHJldHVybjsKLQkJCXBvaW50c1swXS54ID0gcG9pbnRzWzFdLng7Ci0JCX0gZWxzZSB7Ci0JCQlmaW5hbCBpbnQgaW5jZnBZID0gKGRZIDw8IDE2KSAvIGFic2RYOwotCQkJZmluYWwgaW50IGluY1ggPSAoZFggPiAwKSA/IDEgOiAtMTsKLQkJCWludCBmcFkgPSBwb2ludHNbMF0ueSA8PCAxNjsgLy8gWSBpbiBmaXhlZHBvaW50IGZvcm1hdAotCi0JCQl3aGlsZSAoLS1hYnNkWCA+PSAwKSB7Ci0JCQkJcG9pbnRzWzBdLnggKz0gaW5jWDsKLQkJCQlwb2ludHNbMF0ueSA9IChmcFkgKz0gaW5jZnBZKSA+PiAxNjsKLQkJCQlyZW5kZXIocG9pbnRzWzBdKTsKLQkJCX0KLQkJCWlmIChwb2ludHNbMF0ueSA9PSBwb2ludHNbMV0ueSkgcmV0dXJuOwotCQkJcG9pbnRzWzBdLnkgPSBwb2ludHNbMV0ueTsKLQkJfQotCQlyZW5kZXIocG9pbnRzWzBdKTsKLQl9CQkKLQotCS8qKgotCSAqIFByZXBhcmUgdGhlIHJldHJpZ2dlciB0aW1lcgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBwcmVwYXJlUmV0cmlnZ2VyKCkgewotCQlpZiAocmV0cmlnZ2VySW50ZXJ2YWwgPiAwKSB7Ci0JCQkvKgotCQkJICogdGltZXJFeGVjKCkgcHJvdmlkZXMgYSBsaWdodHdlaWdodCBtZWNoYW5pc20gZm9yIHJ1bm5pbmcgY29kZSBhdCBpbnRlcnZhbHMgZnJvbSB3aXRoaW4KLQkJCSAqIHRoZSBldmVudCBsb29wIHdoZW4gdGltaW5nIGFjY3VyYWN5IGlzIG5vdCBpbXBvcnRhbnQuCi0JCQkgKgotCQkJICogU2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbmNlbCBhIHRpbWVyRXhlYygpLCB3ZSByZW1lbWJlciB0aGUgUnVubmFibGUgdGhhdCBpcwotCQkJICogYWN0aXZlIGluIG9yZGVyIHRvIGRpc3Rpbmd1aXNoIHRoZSB2YWxpZCBvbmUgZnJvbSB0aGUgc3RhbGUgb25lcy4gIEluIHByYWN0aWNlLAotCQkJICogaWYgdGhlIGludGVydmFsIGlzIDEvMTAwdGggb2YgYSBzZWNvbmQsIHRoZW4gY3JlYXRpbmcgYSBmZXcgaHVuZHJlZCBuZXcgUmV0cmlnZ2VySGFuZGxlcnMKLQkJCSAqIGVhY2ggc2Vjb25kIHdpbGwgbm90IGNhdXNlIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaGl0LgotCQkJICovCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRQYWludFN1cmZhY2UoKS5nZXREaXNwbGF5KCk7Ci0JCQlyZXRyaWdnZXJIYW5kbGVyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKHJldHJpZ2dlckhhbmRsZXIgPT0gdGhpcykgewotCQkJCQkJcmVuZGVyKHBvaW50c1swXSk7Ci0JCQkJCQlwcmVwYXJlUmV0cmlnZ2VyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwkJCQotCQkJZGlzcGxheS50aW1lckV4ZWMocmV0cmlnZ2VySW50ZXJ2YWwsIHJldHJpZ2dlckhhbmRsZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWJvcnRzIHRoZSByZXRyaWdnZXIgdGltZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYWJvcnRSZXRyaWdnZXIoKSB7Ci0JCXJldHJpZ2dlckhhbmRsZXIgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUZW1wbGF0ZSBtZXRob2Q6IFJlbmRlcnMgYSBwb2ludC4KLQkgKiBAcGFyYW0gcG9pbnQsIHRoZSBwb2ludCB0byByZW5kZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW5kZXIoUG9pbnQgcG9pbnQpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRHJhZ1BhaW50U2Vzc2lvbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRHJhZ1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDAxY2EyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0RyYWdQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogVGhlIHN1cGVyY2xhc3MgZm9yIHBhaW50IHRvb2xzIHRoYXQgdXNlIGNsaWNrLWRyYWctcmVsZWFzZSBtb3Rpb25zIHRvCi0gKiBkcmF3IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEcmFnUGFpbnRTZXNzaW9uIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gewotCS8qKgotCSAqIFRydWUgaWYgYSBjbGljay1kcmFnIGlzIGluIHByb2dyZXNzCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogVGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjbGljayBpbiBhIGNsaWNrLWRyYWcKLQkgKi8KLQlwcml2YXRlIFBvaW50IGFuY2hvclBvc2l0aW9uID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0KLQkvKioKLQkgKiBBIHRlbXBvcmFyeSBwb2ludAotCSAqLwotCXByaXZhdGUgUG9pbnQgdGVtcFBvc2l0aW9uID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBhaW50U2Vzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZ2V0UGFpbnRTdXJmYWNlKCkgdGhlIGRyYXdpbmcgc3VyZmFjZSB0byB1c2UKLQkgKi8KLQlwcm90ZWN0ZWQgRHJhZ1BhaW50U2Vzc2lvbihQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JfQotCi0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSB0b29sLgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuCi0JCQlzZXRTdGF0dXNNZXNzYWdlKFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic2Vzc2lvbi5EcmFnSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlIikpOwotCQlhbmNob3JQb3NpdGlvbi54ID0gLTE7Ci0JCWRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIERlYWN0aXZhdGVzIHRoZSB0b29sLgotICAgICAqLwotCXB1YmxpYyB2b2lkIGVuZFNlc3Npb24oKSB7Ci0JfQotCQotCS8qKgotCSAqIFJlc2V0cyB0aGUgdG9vbC4KLQkgKiBBYm9ydHMgYW55IG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlhbmNob3JQb3NpdGlvbi54ID0gLTE7Ci0JCWRyYWdJblByb2dyZXNzID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG93biBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotCQlpZiAoZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJZHJhZ0luUHJvZ3Jlc3MgPSB0cnVlOwotCQkKLQkJYW5jaG9yUG9zaXRpb24ueCA9IGV2ZW50Lng7Ci0JCWFuY2hvclBvc2l0aW9uLnkgPSBldmVudC55OwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvdWJsZUNsaWNrIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlVXAgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSB7Ci0JCQlyZXNldFNlc3Npb24oKTsgLy8gYWJvcnQgaWYgcmlnaHQgb3IgbWlkZGxlIG1vdXNlIGJ1dHRvbiBwcmVzc2VkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEgZHJhZ0luUHJvZ3Jlc3MpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJZHJhZ0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJaWYgKGFuY2hvclBvc2l0aW9uLnggPT0gLTEpIHJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJCi0JCWdldFBhaW50U3VyZmFjZSgpLmNvbW1pdFJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlTW92ZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIFBhaW50U3VyZmFjZSBwcyA9IGdldFBhaW50U3VyZmFjZSgpOwotCQlpZiAoISBkcmFnSW5Qcm9ncmVzcykgewotCQkJcHMuc2V0U3RhdHVzQ29vcmQocHMuZ2V0Q3VycmVudFBvc2l0aW9uKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXBzLnNldFN0YXR1c0Nvb3JkUmFuZ2UoYW5jaG9yUG9zaXRpb24sIHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJcHMuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCXRlbXBQb3NpdGlvbi54ID0gZXZlbnQueDsKLQkJdGVtcFBvc2l0aW9uLnkgPSBldmVudC55OwotCQlwcy5hZGRSdWJiZXJiYW5kU2VsZWN0aW9uKGNyZWF0ZUZpZ3VyZShhbmNob3JQb3NpdGlvbiwgdGVtcFBvc2l0aW9uKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlbXBsYXRlIE1ldGhvZDogQ3JlYXRlcyBhIEZpZ3VyZSBmb3IgZHJhd2luZyBydWJiZXJiYW5kIGVudGl0aWVzIGFuZCB0aGUgZmluYWwgcHJvZHVjdAotCSAqIAotCSAqIEBwYXJhbSBhbmNob3IgdGhlIGFuY2hvciBwb2ludAotCSAqIEBwYXJhbSBjdXJzb3IgdGhlIHBvaW50IG1hcmtpbmcgdGhlIGN1cnJlbnQgcG9pbnRlciBsb2NhdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGFuY2hvciwgUG9pbnQgY3Vyc29yKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwN2VmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBFbGxpcHNlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgRWxsaXBzZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCBsaW5lU3R5bGUsIHgxLCB5MSwgeDIsIHkyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gRWxsaXBzZQotCSAqIFRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgYnkgYW55IHR3byBkaWFtZXRyaWNhbGx5IG9wcG9zaW5nIGNvcm5lcnMgb2YgYSBib3gKLQkgKiBib3VuZGluZyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgRWxsaXBzZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0JCXRoaXMuZm9yZWdyb3VuZENvbG9yID0gZm9yZWdyb3VuZENvbG9yOwotCQl0aGlzLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLQkJdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0JCXRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKGxpbmVTdHlsZSk7Ci0JCWZkYy5nYy5kcmF3T3ZhbChyLngsIHIueSwgci53aWR0aCAtIDEsIHIuaGVpZ2h0IC0gMSk7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9FbGxpcHNlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjExYzc2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0VsbGlwc2VUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIGRyYXdpbmcgdG9vbC4KLSAqLwotcHVibGljIGNsYXNzIEVsbGlwc2VUb29sIGV4dGVuZHMgRHJhZ1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgRWxsaXBzZVRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIEVsbGlwc2VUb29sKFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MsIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQkJc2V0KHRvb2xTZXR0aW5ncyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5FbGxpcHNlLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2RzIGZvciBkcmF3aW5nCi0JICovCi0JcHJvdGVjdGVkIEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnQgYSwgUG9pbnQgYikgewotCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQlpZiAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUgIT0gVG9vbFNldHRpbmdzLmZ0Tm9uZSkKLQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkRWxsaXBzZUZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIGEueCwgYS55LCBiLngsIGIueSkpOwotCQlpZiAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUgIT0gVG9vbFNldHRpbmdzLmZ0U29saWQpCi0JCQljb250YWluZXIuYWRkKG5ldyBFbGxpcHNlRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQkJYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9GaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjZTdlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIFN1cGVyaW50ZXJmYWNlIGZvciBhbGwgZHJhd2luZyBvYmplY3RzLgotICogQWxsIGRyYXdpbmcgb2JqZWN0cyBrbm93IGhvdyB0byByZW5kZXIgdGhlbXNlbHZlZCB0byB0aGUgc2NyZWVuIGFuZCBjYW4gZHJhdyBhCi0gKiB0ZW1wb3JhcnkgdmVyc2lvbiBvZiB0aGVtc2VsdmVzIGZvciBwcmV2aWV3aW5nIHRoZSBnZW5lcmFsIGFwcGVhcmFuY2Ugb2YgdGhlCi0gKiBvYmplY3Qgb25zY3JlZW4gYmVmb3JlIGl0IGdldHMgY29tbWl0dGVkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlndXJlIHsKLQkvKioKLQkgKiBEcmF3cyB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmRjIGEgcGFyYW1ldGVyIGJsb2NrIHNwZWNpZnlpbmcgZHJhd2luZy1yZWxhdGVkIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpOwotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGRhbWFnZWQgc2NyZWVuIHJlZ2lvbiBjYXVzZWQgYnkgZHJhd2luZyB0aGlzIG9iamVjdCAoaW1wcmVjaXNlKSwgdGhlbgotCSAqIGFwcGVuZHMgaXQgdG8gdGhlIHN1cHBsaWVkIHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmRjIGEgcGFyYW1ldGVyIGJsb2NrIHNwZWNpZnlpbmcgZHJhd2luZy1yZWxhdGVkIGluZm9ybWF0aW9uCi0JICogQHBhcmFtIHJlZ2lvbiBhIHJlZ2lvbiB0byB3aGljaCBhZGRpdGlvbmFsIGRhbWFnZSBhcmVhcyB3aWxsIGJlIGFkZGVkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlRHJhd0NvbnRleHQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0ZpZ3VyZURyYXdDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YWIxOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvRmlndXJlRHJhd0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgRmlndXJlRHJhd0NvbnRleHQgewotCS8qCi0JICogPHA+Ci0JICogVGhlIEdDIG11c3QgYmUgc2V0IHVwIGFzIGZvbGxvd3MKLQkgKiAoaXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGlzIHN0YXRlIHVwb24gY29tcGxldGlvbiBvZiBkcmF3aW5nIG9wZXJhdGlvbnMpCi0JICogPHVsPgotCSAqICAgPGxpPnNldFhPUk1vZGUoZmFsc2UpCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEdDIGdjID0gbnVsbDsKLQlwdWJsaWMgaW50IHhPZmZzZXQgPSAwLCB5T2Zmc2V0ID0gMDsgLy8gc3Vic3RyYWN0IHRvIGdldCBHQyBjb29yZHMKLQlwdWJsaWMgaW50IHhTY2FsZSA9IDEsIHlTY2FsZSA9IDE7Ci0JCi0JcHVibGljIFJlY3RhbmdsZSB0b0NsaWVudFJlY3RhbmdsZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoCi0JCQlNYXRoLm1pbih4MSwgeDIpICogeFNjYWxlIC0geE9mZnNldCwKLQkJCU1hdGgubWluKHkxLCB5MikgKiB5U2NhbGUgLSB5T2Zmc2V0LAotCQkJKE1hdGguYWJzKHgyIC0geDEpICsgMSkgKiB4U2NhbGUsCi0JCQkoTWF0aC5hYnMoeTIgLSB5MSkgKyAxKSAqIHlTY2FsZSk7Ci0JfQotCXB1YmxpYyBQb2ludCB0b0NsaWVudFBvaW50KGludCB4LCBpbnQgeSkgewotCQlyZXR1cm4gbmV3IFBvaW50KHggKiB4U2NhbGUgLSB4T2Zmc2V0LCB5ICogeVNjYWxlIC0geU9mZnNldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvTGluZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvTGluZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNmZDE5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIExpbmUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgaW50IGxpbmVTdHlsZSwgeDEsIHkxLCB4MiwgeTI7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIExpbmUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IHRoZWlyIHR3byBlbmQtcG9pbnRzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGxpbmVTdHlsZSB0aGUgbGluZSBzdHlsZSBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geDEgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBlbmQtcG9pbnQKLQkgKiBAcGFyYW0geTEgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBlbmQtcG9pbnQKLQkgKiBAcGFyYW0geDIgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgZW5kLXBvaW50Ci0JICogQHBhcmFtIHkyIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGVuZC1wb2ludAotCSAqLwotCXB1YmxpYyBMaW5lRmlndXJlKENvbG9yIGZvcmVncm91bmRDb2xvciwgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBpbnQgbGluZVN0eWxlLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5mb3JlZ3JvdW5kQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCXRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQl0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLQkJdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlQb2ludCBwMSA9IGZkYy50b0NsaWVudFBvaW50KHgxLCB5MSk7Ci0JCVBvaW50IHAyID0gZmRjLnRvQ2xpZW50UG9pbnQoeDIsIHkyKTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCQlmZGMuZ2MuZHJhd0xpbmUocDEueCwgcDEueSwgcDIueCwgcDIueSk7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9MaW5lVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGE2NGEyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L0xpbmVUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBIGxpbmUgZHJhd2luZyB0b29sCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIExpbmVUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBMaW5lVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5MaW5lLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2RzIGZvciBkcmF3aW5nCi0JICovCi0JcHJvdGVjdGVkIEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnQgYSwgUG9pbnQgYikgewotCQlyZXR1cm4gbmV3IExpbmVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCWEueCwgYS55LCBiLngsIGIueSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhMTBhNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFBhaW50RXhhbXBsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPQotCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX3BhaW50Iik7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZTsKLQlwcml2YXRlIENhbnZhcyBhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXM7Ci0JcHJpdmF0ZSBDYW52YXMgYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzOwotCXByaXZhdGUgQ29sb3IgcGFpbnRDb2xvckJsYWNrLCBwYWludENvbG9yV2hpdGU7IC8vIGFsaWFzIGZvciBwYWludENvbG9yc1swXSBhbmQgWzFdCi0JcHJpdmF0ZSBDb2xvcltdIHBhaW50Q29sb3JzOwotCXByaXZhdGUgRm9udCBwYWludERlZmF1bHRGb250OyAvLyBkbyBub3QgZnJlZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1QYWxldHRlUm93cyA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG51bVBhbGV0dGVDb2xzID0gNTA7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzOyAvLyBjdXJyZW50IGFjdGl2ZSBzZXR0aW5ncwotCXByaXZhdGUgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZTsgLy8gcGFpbnQgc3VyZmFjZSBmb3IgZHJhd2luZwotCi0Jc3RhdGljIGZpbmFsIGludCBQZW5jaWxfdG9vbCA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBBaXJicnVzaF90b29sID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IExpbmVfdG9vbCA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBQb2x5TGluZV90b29sID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFJlY3RhbmdsZV90b29sID0gNDsKLQlzdGF0aWMgZmluYWwgaW50IFJvdW5kZWRSZWN0YW5nbGVfdG9vbCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBFbGxpcHNlX3Rvb2wgPSA2OwotCXN0YXRpYyBmaW5hbCBpbnQgVGV4dF90b29sID0gNzsKLQlzdGF0aWMgZmluYWwgaW50IE5vbmVfZmlsbCA9IDg7Ci0Jc3RhdGljIGZpbmFsIGludCBPdXRsaW5lX2ZpbGwgPSA5OwotCXN0YXRpYyBmaW5hbCBpbnQgU29saWRfZmlsbCA9IDEwOwotCXN0YXRpYyBmaW5hbCBpbnQgU29saWRfbGluZXN0eWxlID0gMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBEYXNoX2xpbmVzdHlsZSA9IDEyOwotCXN0YXRpYyBmaW5hbCBpbnQgRG90X2xpbmVzdHlsZSA9IDEzOwotCXN0YXRpYyBmaW5hbCBpbnQgRGFzaERvdF9saW5lc3R5bGUgPSAxNDsKLQlzdGF0aWMgZmluYWwgaW50IEZvbnRfb3B0aW9ucyA9IDE1OwotCQotCXN0YXRpYyBmaW5hbCBpbnQgRGVmYXVsdF90b29sID0gUGVuY2lsX3Rvb2w7Ci0Jc3RhdGljIGZpbmFsIGludCBEZWZhdWx0X2ZpbGwgPSBOb25lX2ZpbGw7Ci0Jc3RhdGljIGZpbmFsIGludCBEZWZhdWx0X2xpbmVzdHlsZSA9IFNvbGlkX2xpbmVzdHlsZTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRvb2xbXSB0b29scyA9IHsKLQkJbmV3IFRvb2woUGVuY2lsX3Rvb2wsICJQZW5jaWwiLCAidG9vbCIsIFNXVC5SQURJTyksCi0JCW5ldyBUb29sKEFpcmJydXNoX3Rvb2wsICJBaXJicnVzaCIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woTGluZV90b29sLCAiTGluZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woUG9seUxpbmVfdG9vbCwgIlBvbHlMaW5lIiwgInRvb2wiLCBTV1QuUkFESU8pLAotCQluZXcgVG9vbChSZWN0YW5nbGVfdG9vbCwgIlJlY3RhbmdsZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woUm91bmRlZFJlY3RhbmdsZV90b29sLCAiUm91bmRlZFJlY3RhbmdsZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woRWxsaXBzZV90b29sLCAiRWxsaXBzZSIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woVGV4dF90b29sLCAiVGV4dCIsICJ0b29sIiwgU1dULlJBRElPKSwKLQkJbmV3IFRvb2woTm9uZV9maWxsLCAiTm9uZSIsICJmaWxsIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihUb29sU2V0dGluZ3MuZnROb25lKSksCi0JCW5ldyBUb29sKE91dGxpbmVfZmlsbCwgIk91dGxpbmUiLCAiZmlsbCIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoVG9vbFNldHRpbmdzLmZ0T3V0bGluZSkpLAotCQluZXcgVG9vbChTb2xpZF9maWxsLCAiU29saWQiLCAiZmlsbCIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoVG9vbFNldHRpbmdzLmZ0U29saWQpKSwKLQkJbmV3IFRvb2woU29saWRfbGluZXN0eWxlLCAiU29saWQiLCAibGluZXN0eWxlIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihTV1QuTElORV9TT0xJRCkpLAotCQluZXcgVG9vbChEYXNoX2xpbmVzdHlsZSwgIkRhc2giLCAibGluZXN0eWxlIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihTV1QuTElORV9EQVNIKSksCi0JCW5ldyBUb29sKERvdF9saW5lc3R5bGUsICJEb3QiLCAibGluZXN0eWxlIiwgU1dULlJBRElPLCBuZXcgSW50ZWdlcihTV1QuTElORV9ET1QpKSwKLQkJbmV3IFRvb2woRGFzaERvdF9saW5lc3R5bGUsICJEYXNoRG90IiwgImxpbmVzdHlsZSIsIFNXVC5SQURJTywgbmV3IEludGVnZXIoU1dULkxJTkVfREFTSERPVCkpLAotCQluZXcgVG9vbChGb250X29wdGlvbnMsICJGb250IiwgIm9wdGlvbnMiLCBTV1QuUFVTSCkKLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIFBhaW50RXhhbXBsZSBlbWJlZGRlZCBpbnNpZGUKLQkgKiB0aGUgc3VwcGxpZWQgcGFyZW50IENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluZXIgb2YgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgUGFpbnRFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbWFpbkNvbXBvc2l0ZSA9IHBhcmVudDsKLQkJaW5pdFJlc291cmNlcygpOwotCQlpbml0QWN0aW9ucygpOwotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlcyBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJUGFpbnRFeGFtcGxlIGluc3RhbmNlID0gbmV3IFBhaW50RXhhbXBsZShzaGVsbCk7Ci0JCWluc3RhbmNlLmNyZWF0ZVRvb2xCYXIoc2hlbGwpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWluc3RhbmNlLmNyZWF0ZUdVSShjb21wb3NpdGUpOwotCQlpbnN0YW5jZS5zZXREZWZhdWx0cygpOwotCQlzZXRTaGVsbFNpemUoZGlzcGxheSwgc2hlbGwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9vbGJhci4KLQkgKiBOb3RlOiBPbmx5IGNhbGxlZCBieSBzdGFuZGFsb25lLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUb29sQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVG9vbEJhciB0b29sYmFyID0gbmV3IFRvb2xCYXIgKHBhcmVudCwgU1dULk5PTkUpOwotCQlTdHJpbmcgZ3JvdXAgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUb29sIHRvb2wgPSB0b29sc1tpXTsKLQkJCWlmIChncm91cCAhPSBudWxsICYmICF0b29sLmdyb3VwLmVxdWFscyhncm91cCkpIHsKLQkJCQluZXcgVG9vbEl0ZW0gKHRvb2xiYXIsIFNXVC5TRVBBUkFUT1IpOwotCQkJfQotCQkJZ3JvdXAgPSB0b29sLmdyb3VwOwotCQkJVG9vbEl0ZW0gaXRlbSA9IGFkZFRvb2xJdGVtKHRvb2xiYXIsIHRvb2wpOwotCQkJaWYgKGkgPT0gRGVmYXVsdF90b29sIHx8IGkgPT0gRGVmYXVsdF9maWxsIHx8IGkgPT0gRGVmYXVsdF9saW5lc3R5bGUpIGl0ZW0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRvb2wgaXRlbSB0byB0aGUgdG9vbGJhci4KLQkgKiBOb3RlOiBPbmx5IGNhbGxlZCBieSBzdGFuZGFsb25lLgotCSAqLwotCXByaXZhdGUgVG9vbEl0ZW0gYWRkVG9vbEl0ZW0oZmluYWwgVG9vbEJhciB0b29sYmFyLCBmaW5hbCBUb29sIHRvb2wpIHsKLQkJZmluYWwgU3RyaW5nIGlkID0gdG9vbC5ncm91cCArICcuJyArIHRvb2wubmFtZTsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbGJhciwgdG9vbC50eXBlKTsKLQkJaXRlbS5zZXRUZXh0IChnZXRSZXNvdXJjZVN0cmluZyhpZCArICIubGFiZWwiKSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLnRvb2x0aXAiKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UodG9vbC5pbWFnZSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdG9vbC5hY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBpbnQgY2hpbGRJRCA9IHRvb2xiYXIuaW5kZXhPZihpdGVtKTsKLQkJdG9vbGJhci5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IGNoaWxkSUQpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRSZXNvdXJjZVN0cmluZyhpZCArICIuZGVzY3JpcHRpb24iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IHRvb2wgaXRlbSBzdGF0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCXNldFBhaW50VG9vbChEZWZhdWx0X3Rvb2wpOwotCQlzZXRGaWxsVHlwZShEZWZhdWx0X2ZpbGwpOwotCQlzZXRMaW5lU3R5bGUoRGVmYXVsdF9saW5lc3R5bGUpOwotCQlzZXRGb3JlZ3JvdW5kQ29sb3IocGFpbnRDb2xvckJsYWNrKTsKLQkJc2V0QmFja2dyb3VuZENvbG9yKHBhaW50Q29sb3JXaGl0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR1VJLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUdVSShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dDsKLQkJR3JpZERhdGEgZ3JpZERhdGE7Ci0KLQkJLyoqKiBDcmVhdGUgcHJpbmNpcGFsIEdVSSBsYXlvdXQgZWxlbWVudHMgKioqLwkJCi0JCUNvbXBvc2l0ZSBkaXNwbGF5QXJlYSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlkaXNwbGF5QXJlYS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJLy8gQ3JlYXRpbmcgdGhlc2UgZWxlbWVudHMgaGVyZSBhdm9pZHMgdGhlIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlIEdVSSBlbGVtZW50cwotCQkvLyBpbiBzdHJpY3QgbGF5b3V0IG9yZGVyLiAgVGhlIG5hdHVyYWwgbGF5b3V0IG9yZGVyaW5nIGlzIGFuIGFydGlmYWN0IG9mIHVzaW5nCi0JCS8vIFNXVCBsYXlvdXRzLCBidXQgdW5mb3J0dW5hdGVseSBpdCBpcyBub3QgdGhlIHNhbWUgb3JkZXIgYXMgdGhhdCByZXF1aXJlZCB0bwotCQkvLyBpbnN0YW50aWF0ZSBhbGwgb2YgdGhlIG5vbi1HVUkgYXBwbGljYXRpb24gZWxlbWVudHMgdG8gc2F0aXNmeSByZWZlcmVudGlhbAotCQkvLyBkZXBlbmRlbmNpZXMuICBJdCBpcyBwb3NzaWJsZSB0byByZW9yZGVyIHRoZSBpbml0aWFsaXphdGlvbiB0byBzb21lIGV4dGVudCwgYnV0Ci0JCS8vIHRoaXMgY2FuIGJlIHZlcnkgdGVkaW91cy4KLQkJCi0JCS8vIHBhaW50IGNhbnZhcwotCQlmaW5hbCBDYW52YXMgcGFpbnRDYW52YXMgPSBuZXcgQ2FudmFzKGRpc3BsYXlBcmVhLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwKLQkJCVNXVC5OT19SRURSQVdfUkVTSVpFIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJcGFpbnRDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhaW50Q2FudmFzLnNldEJhY2tncm91bmQocGFpbnRDb2xvcldoaXRlKTsKLQkJCi0JCS8vIGNvbG9yIHNlbGVjdG9yIGZyYW1lCi0JCWZpbmFsIENvbXBvc2l0ZSBjb2xvckZyYW1lID0gbmV3IENvbXBvc2l0ZShkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJY29sb3JGcmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyB0b29sIHNldHRpbmdzIGZyYW1lCi0JCWZpbmFsIENvbXBvc2l0ZSB0b29sU2V0dGluZ3NGcmFtZSA9IG5ldyBDb21wb3NpdGUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCXRvb2xTZXR0aW5nc0ZyYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIHN0YXR1cyB0ZXh0Ci0JCWZpbmFsIFRleHQgc3RhdHVzVGV4dCA9IG5ldyBUZXh0KGRpc3BsYXlBcmVhLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJc3RhdHVzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvKioqIENyZWF0ZSB0aGUgcmVtYWluaW5nIGFwcGxpY2F0aW9uIGVsZW1lbnRzIGluc2lkZSB0aGUgcHJpbmNpcGFsIEdVSSBsYXlvdXQgZWxlbWVudHMgKioqLwkKLQkJLy8gcGFpbnRTdXJmYWNlCi0JCXBhaW50U3VyZmFjZSA9IG5ldyBQYWludFN1cmZhY2UocGFpbnRDYW52YXMsIHN0YXR1c1RleHQsIHBhaW50Q29sb3JXaGl0ZSk7Ci0KLQkJLy8gZmluaXNoIGluaXRpYWxpemluZyB0aGUgdG9vbCBkYXRhCi0JCXRvb2xzW1BlbmNpbF90b29sXS5kYXRhID0gbmV3IFBlbmNpbFRvb2wodG9vbFNldHRpbmdzLCBwYWludFN1cmZhY2UpOwotCQl0b29sc1tBaXJicnVzaF90b29sXS5kYXRhID0gbmV3IEFpcmJydXNoVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW0xpbmVfdG9vbF0uZGF0YSA9IG5ldyBMaW5lVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1BvbHlMaW5lX3Rvb2xdLmRhdGEgPSBuZXcgUG9seUxpbmVUb29sKHRvb2xTZXR0aW5ncywgcGFpbnRTdXJmYWNlKTsKLQkJdG9vbHNbUmVjdGFuZ2xlX3Rvb2xdLmRhdGEgPSBuZXcgUmVjdGFuZ2xlVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1JvdW5kZWRSZWN0YW5nbGVfdG9vbF0uZGF0YSA9IG5ldyBSb3VuZGVkUmVjdGFuZ2xlVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW0VsbGlwc2VfdG9vbF0uZGF0YSA9IG5ldyBFbGxpcHNlVG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0JCXRvb2xzW1RleHRfdG9vbF0uZGF0YSA9IG5ldyBUZXh0VG9vbCh0b29sU2V0dGluZ3MsIHBhaW50U3VyZmFjZSk7Ci0KLQkJLy8gY29sb3JGcmFtZQkJCi0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb2xvckZyYW1lLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQkvLyBhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMsIGFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcwotCQlhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMgPSBuZXcgQ2FudmFzKGNvbG9yRnJhbWUsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDI0OwotCQlhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzID0gbmV3IENhbnZhcyhjb2xvckZyYW1lLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyNDsKLQkJYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIHBhbGV0dGVDYW52YXMKLQkJZmluYWwgQ2FudmFzIHBhbGV0dGVDYW52YXMgPSBuZXcgQ2FudmFzKGNvbG9yRnJhbWUsIFNXVC5CT1JERVIgfCBTV1QuTk9fQkFDS0dST1VORCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNDsKLQkJcGFsZXR0ZUNhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcGFsZXR0ZUNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHBhbGV0dGVDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCUNvbG9yIGNvbG9yID0gZ2V0Q29sb3JBdChib3VuZHMsIGUueCwgZS55KTsJCQkJCi0JCQkJCQotCQkJCWlmIChlLmJ1dHRvbiA9PSAxKSBzZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCQkJCWVsc2Ugc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLQkJCX0KLQkJCXByaXZhdGUgQ29sb3IgZ2V0Q29sb3JBdChSZWN0YW5nbGUgYm91bmRzLCBpbnQgeCwgaW50IHkpIHsKLQkJCQlpZiAoYm91bmRzLmhlaWdodCA8PSAxICYmIGJvdW5kcy53aWR0aCA8PSAxKSByZXR1cm4gcGFpbnRDb2xvcldoaXRlOwotCQkJCWZpbmFsIGludCByb3cgPSAoeSAtIGJvdW5kcy55KSAqIG51bVBhbGV0dGVSb3dzIC8gYm91bmRzLmhlaWdodDsKLQkJCQlmaW5hbCBpbnQgY29sID0gKHggLSBib3VuZHMueCkgKiBudW1QYWxldHRlQ29scyAvIGJvdW5kcy53aWR0aDsKLQkJCQlyZXR1cm4gcGFpbnRDb2xvcnNbTWF0aC5taW4oTWF0aC5tYXgocm93ICogbnVtUGFsZXR0ZUNvbHMgKyBjb2wsIDApLCBwYWludENvbG9ycy5sZW5ndGggLSAxKV07Ci0JCQl9Ci0JCX0pOwotCQlMaXN0ZW5lciByZWZyZXNoTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2MgPT0gbnVsbCkgcmV0dXJuOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwYWxldHRlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJCQlmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1QYWxldHRlUm93czsgKytyb3cpIHsKLQkJCQkJZm9yIChpbnQgY29sID0gMDsgY29sIDwgbnVtUGFsZXR0ZUNvbHM7ICsrY29sKSB7Ci0JCQkJCQlmaW5hbCBpbnQgeCA9IGJvdW5kcy53aWR0aCAqIGNvbCAvIG51bVBhbGV0dGVDb2xzOwotCQkJCQkJZmluYWwgaW50IHkgPSBib3VuZHMuaGVpZ2h0ICogcm93IC8gbnVtUGFsZXR0ZVJvd3M7Ci0JCQkJCQlmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heChib3VuZHMud2lkdGggKiAoY29sICsgMSkgLyBudW1QYWxldHRlQ29scyAtIHgsIDEpOwotCQkJCQkJZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KGJvdW5kcy5oZWlnaHQgKiAocm93ICsgMSkgLyBudW1QYWxldHRlUm93cyAtIHksIDEpOwotCQkJCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKHBhaW50Q29sb3JzW3JvdyAqIG51bVBhbGV0dGVDb2xzICsgY29sXSk7Ci0JCQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoYm91bmRzLnggKyB4LCBib3VuZHMueSArIHksIHdpZHRoLCBoZWlnaHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlwYWxldHRlQ2FudmFzLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHJlZnJlc2hMaXN0ZW5lcik7Ci0JCXBhbGV0dGVDYW52YXMuYWRkTGlzdGVuZXIoU1dULlBhaW50LCByZWZyZXNoTGlzdGVuZXIpOwotCQkvL3BhbGV0dGVDYW52YXMucmVkcmF3KCk7Ci0JCQotCQkvLyB0b29sU2V0dGluZ3NGcmFtZQotCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdG9vbFNldHRpbmdzRnJhbWUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRvb2xTZXR0aW5nc0ZyYW1lLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInNldHRpbmdzLkFpcmJydXNoUmFkaXVzLnRleHQiKSk7Ci0KLQkJZmluYWwgU2NhbGUgYWlyYnJ1c2hSYWRpdXNTY2FsZSA9IG5ldyBTY2FsZSh0b29sU2V0dGluZ3NGcmFtZSwgU1dULkhPUklaT05UQUwpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLnNldE1pbmltdW0oNSk7Ci0JCWFpcmJydXNoUmFkaXVzU2NhbGUuc2V0TWF4aW11bSg1MCk7Ci0JCWFpcmJydXNoUmFkaXVzU2NhbGUuc2V0U2VsZWN0aW9uKHRvb2xTZXR0aW5ncy5haXJicnVzaFJhZGl1cyk7Ci0JCWFpcmJydXNoUmFkaXVzU2NhbGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQlhaXJicnVzaFJhZGl1c1NjYWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRvb2xTZXR0aW5ncy5haXJicnVzaFJhZGl1cyA9IGFpcmJydXNoUmFkaXVzU2NhbGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKHRvb2xTZXR0aW5nc0ZyYW1lLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoInNldHRpbmdzLkFpcmJydXNoSW50ZW5zaXR5LnRleHQiKSk7Ci0KLQkJZmluYWwgU2NhbGUgYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZSA9IG5ldyBTY2FsZSh0b29sU2V0dGluZ3NGcmFtZSwgU1dULkhPUklaT05UQUwpOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldE1pbmltdW0oMSk7Ci0JCWFpcmJydXNoSW50ZW5zaXR5U2NhbGUuc2V0TWF4aW11bSgxMDApOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldFNlbGVjdGlvbih0b29sU2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkpOwotCQlhaXJicnVzaEludGVuc2l0eVNjYWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJYWlyYnJ1c2hJbnRlbnNpdHlTY2FsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0b29sU2V0dGluZ3MuYWlyYnJ1c2hJbnRlbnNpdHkgPSBhaXJicnVzaEludGVuc2l0eVNjYWxlLmdldFNlbGVjdGlvbigpOwotCQkJCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhcgotCSAqIGluc3RhbmNlIG9mIHRoZSBQYWludEV4YW1wbGUuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwYWludFN1cmZhY2UgIT0gbnVsbCkgcGFpbnRTdXJmYWNlLmRpc3Bvc2UoKTsJCQotCQlpZiAocGFpbnRDb2xvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWludENvbG9ycy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIENvbG9yIGNvbG9yID0gcGFpbnRDb2xvcnNbaV07Ci0JCQkJaWYgKGNvbG9yICE9IG51bGwpIGNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlwYWludERlZmF1bHRGb250ID0gbnVsbDsKLQkJcGFpbnRDb2xvcnMgPSBudWxsOwotCQlwYWludFN1cmZhY2UgPSBudWxsOwotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogRnJlZXMgdGhlIHJlc291cmNlIGJ1bmRsZSByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZnJlZVJlc291cmNlcygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgewotCQkJVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQlmaW5hbCBJbWFnZSBpbWFnZSA9IHRvb2wuaW1hZ2U7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJdG9vbC5pbWFnZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGlzcGxheS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IHdlJ3JlIHVzaW5nCi0JICovCi0JcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIG1haW5Db21wb3NpdGUuZ2V0RGlzcGxheSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBhbmQgYmluZHMgaXQKLQkgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLAotCSAqIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbG9ycywgZm9udHMsIGFuZCB0b29sIHNldHRpbmdzLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBtYWluQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJCi0JCXBhaW50Q29sb3JXaGl0ZSA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQkJcGFpbnRDb2xvckJsYWNrID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDApOwotCQkKLQkJcGFpbnREZWZhdWx0Rm9udCA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpOwotCi0JCXBhaW50Q29sb3JzID0gbmV3IENvbG9yW251bVBhbGV0dGVDb2xzICogbnVtUGFsZXR0ZVJvd3NdOwotCQlwYWludENvbG9yc1swXSA9IHBhaW50Q29sb3JCbGFjazsKLQkJcGFpbnRDb2xvcnNbMV0gPSBwYWludENvbG9yV2hpdGU7Ci0JCWZvciAoaW50IGkgPSAyOyBpIDwgcGFpbnRDb2xvcnMubGVuZ3RoOyBpKyspIHsKLQkJCXBhaW50Q29sb3JzW2ldID0gbmV3IENvbG9yKGRpc3BsYXksCi0JCQkJKChpKjcpJTI1NSksKChpKjIzKSUyNTUpLCAoKGkqNTEpJTI1NSkpOwotCQl9Ci0KLQkJdG9vbFNldHRpbmdzID0gbmV3IFRvb2xTZXR0aW5ncygpOwotCQl0b29sU2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yID0gcGFpbnRDb2xvckJsYWNrOwotCQl0b29sU2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yID0gcGFpbnRDb2xvcldoaXRlOwotCQl0b29sU2V0dGluZ3MuY29tbW9uRm9udCA9IHBhaW50RGVmYXVsdEZvbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aW9uIGZpZWxkIG9mIHRoZSB0b29scwotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0QWN0aW9ucygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgVG9vbCB0b29sID0gdG9vbHNbaV07Ci0JCQlTdHJpbmcgZ3JvdXAgPSB0b29sLmdyb3VwOwotCQkJaWYgKGdyb3VwLmVxdWFscygidG9vbCIpKSB7Ci0JCQkJdG9vbC5hY3Rpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNldFBhaW50VG9vbCh0b29sLmlkKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9IGVsc2UgaWYgKGdyb3VwLmVxdWFscygiZmlsbCIpKSB7Ci0JCQkJdG9vbC5hY3Rpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNldEZpbGxUeXBlKHRvb2wuaWQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0gZWxzZSBpZiAoZ3JvdXAuZXF1YWxzKCJsaW5lc3R5bGUiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzZXRMaW5lU3R5bGUodG9vbC5pZCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSBlbHNlIGlmIChncm91cC5lcXVhbHMoIm9wdGlvbnMiKSkgewotCQkJCXRvb2wuYWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyhwYWludFN1cmZhY2UuZ2V0U2hlbGwoKSwgU1dULlBSSU1BUllfTU9EQUwpOwotCQkJCQkJRm9udERhdGFbXSBmb250RGF0dW0gPSB0b29sU2V0dGluZ3MuY29tbW9uRm9udC5nZXRGb250RGF0YSgpOwotCQkJCQkJaWYgKGZvbnREYXR1bSAhPSBudWxsICYmIGZvbnREYXR1bS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZm9udERpYWxvZy5zZXRGb250TGlzdChmb250RGF0dW0pOwotCQkJCQkJfQotCQkJCQkJZm9udERpYWxvZy5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJvcHRpb25zLkZvbnQuZGlhbG9nLnRpdGxlIikpOwotCi0JCQkJCQlwYWludFN1cmZhY2UuaGlkZVJ1YmJlcmJhbmQoKTsKLQkJCQkJCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuKCk7Ci0JCQkJCQlwYWludFN1cmZhY2Uuc2hvd1J1YmJlcmJhbmQoKTsKLQkJCQkJCWlmIChmb250RGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJRm9udCBmb250ID0gbmV3IEZvbnQobWFpbkNvbXBvc2l0ZS5nZXREaXNwbGF5KCksIGZvbnREYXRhKTsKLQkJCQkJCQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvbnQgPSBmb250OwotCQkJCQkJCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQkJCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIGltYWdlIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlmaW5hbCBDbGFzcyBjbGF6eiA9IFBhaW50RXhhbXBsZS5jbGFzczsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29scy5sZW5ndGg7ICsraSkgewotCQkJCQlUb29sIHRvb2wgPSB0b29sc1tpXTsKLQkJCQkJU3RyaW5nIGlkID0gdG9vbC5ncm91cCArICcuJyArIHRvb2wubmFtZTsKLQkJCQkJSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbShnZXRSZXNvdXJjZVN0cmluZyhpZCArICIuaW1hZ2UiKSk7Ci0JCQkJCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhKHNvdXJjZVN0cmVhbSk7Ci0JCQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCQkJdG9vbC5pbWFnZSA9IG5ldyBJbWFnZShudWxsLCBzb3VyY2UsIG1hc2spOwotCQkJCQl0cnkgewotCQkJCQkJc291cmNlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZXJyb3IgPSAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPwotCQkJZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpIDoKLQkJCSJVbmFibGUgdG8gbG9hZCByZXNvdXJjZXMiOwotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGVycm9yKTsKLQl9Ci0KLQkvKioKLQkgKiBHcmFicyBpbnB1dCBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJbWFpbkNvbXBvc2l0ZS5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIGZvcmVncm91bmQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBuZXcgY29sb3IgdG8gdXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWlmIChhY3RpdmVGb3JlZ3JvdW5kQ29sb3JDYW52YXMgIT0gbnVsbCkKLQkJCWFjdGl2ZUZvcmVncm91bmRDb2xvckNhbnZhcy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciA9IGNvbG9yOwotCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRvb2wgYmFja2dyb3VuZCBjb2xvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIG5ldyBjb2xvciB0byB1c2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsKLQkJaWYgKGFjdGl2ZUJhY2tncm91bmRDb2xvckNhbnZhcyAhPSBudWxsKQotCQkJYWN0aXZlQmFja2dyb3VuZENvbG9yQ2FudmFzLnNldEJhY2tncm91bmQoY29sb3IpOwotCQl0b29sU2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yID0gY29sb3I7Ci0JCXVwZGF0ZVRvb2xTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgYSB0b29sIGdpdmVuIGl0cyBJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWludFRvb2woaW50IGlkKSB7Ci0JCVBhaW50VG9vbCBwYWludFRvb2wgPSAoUGFpbnRUb29sKSB0b29sc1tpZF0uZGF0YTsKLQkJcGFpbnRTdXJmYWNlLnNldFBhaW50U2Vzc2lvbihwYWludFRvb2wpOwotCQl1cGRhdGVUb29sU2V0dGluZ3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VsZWN0cyBhIGZpbGx0eXBlIGdpdmVuIGl0cyBJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxsVHlwZShpbnQgaWQpIHsKLQkJSW50ZWdlciBmaWxsVHlwZSA9IChJbnRlZ2VyKSB0b29sc1tpZF0uZGF0YTsKLQkJdG9vbFNldHRpbmdzLmNvbW1vbkZpbGxUeXBlID0gZmlsbFR5cGUuaW50VmFsdWUoKTsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIGxpbmUgdHlwZSBnaXZlbiBpdHMgSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZVN0eWxlKGludCBpZCkgewotCQlJbnRlZ2VyIGxpbmVUeXBlID0gKEludGVnZXIpIHRvb2xzW2lkXS5kYXRhOwotCQl0b29sU2V0dGluZ3MuY29tbW9uTGluZVN0eWxlID0gbGluZVR5cGUuaW50VmFsdWUoKTsKLQkJdXBkYXRlVG9vbFNldHRpbmdzKCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBzaGVsbCB0byBpdCdzICJwYWNrZWQiIHNpemUsCi0JICogdW5sZXNzIHRoYXQgbWFrZXMgaXQgYmlnZ2VyIHRoYW4gdGhlIGRpc3BsYXksCi0JICogaW4gd2hpY2ggY2FzZSBzZXQgaXQgdG8gOS8xMCBvZiBkaXNwbGF5IHNpemUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTaGVsbFNpemUgKERpc3BsYXkgZGlzcGxheSwgU2hlbGwgc2hlbGwpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGRpc3BsYXkuZ2V0Qm91bmRzKCk7Ci0JCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaWYgKHNpemUueCA+IGJvdW5kcy53aWR0aCkgc2l6ZS54ID0gYm91bmRzLndpZHRoICogOSAvIDEwOwotCQlpZiAoc2l6ZS55ID4gYm91bmRzLmhlaWdodCkgc2l6ZS55ID0gYm91bmRzLmhlaWdodCAqIDkgLyAxMDsKLQkJc2hlbGwuc2V0U2l6ZSAoc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHRvb2wgdGhhdCBpdHMgc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVUb29sU2V0dGluZ3MoKSB7Ci0JCWZpbmFsIFBhaW50VG9vbCBhY3RpdmVQYWludFRvb2wgPSBwYWludFN1cmZhY2UuZ2V0UGFpbnRUb29sKCk7Ci0JCWlmIChhY3RpdmVQYWludFRvb2wgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJYWN0aXZlUGFpbnRUb29sLmVuZFNlc3Npb24oKTsKLQkJYWN0aXZlUGFpbnRUb29sLnNldCh0b29sU2V0dGluZ3MpOwotCQlhY3RpdmVQYWludFRvb2wuYmVnaW5TZXNzaW9uKCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFNlc3Npb24uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmE4NmY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi0vKioKLSAqIE1hbmFnZXMgYW4gaW50ZXJhY3RpdmUgcGFpbnQgc2Vzc2lvbi4KLSAqIE5vdGUgdGhhdCB0aGUgY29vcmRpbmF0ZXMgcmVjZWl2ZWQgdmlhIHRoZSBsaXN0ZW5lciBpbnRlcmZhY2VzIGFyZSB2aXJ0dWFsaXplZCB0byB6ZXJvLW9yaWdpbgotICogcmVsYXRpdmUgdG8gdGhlIHBhaW50aW5nIHN1cmZhY2UuCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIFBhaW50U2Vzc2lvbiBleHRlbmRzIE1vdXNlTGlzdGVuZXIsIE1vdXNlTW92ZUxpc3RlbmVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWludCBzdXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhaW50IHNlc3Npb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIFBhaW50U3VyZmFjZQotCSAqLwotCXB1YmxpYyBQYWludFN1cmZhY2UgZ2V0UGFpbnRTdXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZXMgdGhlIHNlc3Npb24uCi0JICogCi0JICogTm90ZTogV2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBjYWxsIHN1cGVyLmJlZ2luU2Vzc2lvbigpIGF0IG1ldGhvZCBzdGFydC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBiZWdpblNlc3Npb24oKTsKLQkKLQkvKioKLQkgKiBEZWFjdGl2YXRlcyB0aGUgc2Vzc2lvbi4KLSAgICAgKgotCSAqIE5vdGU6IFdoZW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCwgY2FsbCBzdXBlci5lbmRTZXNzaW9uKCkgYXQgbWV0aG9kIGV4aXQuCi0gICAgICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZW5kU2Vzc2lvbigpOwotCQotCS8qKgotCSAqIFJlc2V0cyB0aGUgc2Vzc2lvbi4KLQkgKiBBYm9ydHMgYW55IG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KLQkgKiAKLQkgKiBOb3RlOiBXaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIGNhbGwgc3VwZXIucmVzZXRTZXNzaW9uKCkgYXQgbWV0aG9kIGV4aXQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXRTZXNzaW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50U3VyZmFjZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRTdXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjY0MDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRTdXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIE1hbmFnZXMgYSBzaW1wbGUgZHJhd2luZyBzdXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgUGFpbnRTdXJmYWNlIHsKLQlwcml2YXRlIFBvaW50IGN1cnJlbnRQb3NpdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKLQlwcml2YXRlIENhbnZhcyBwYWludENhbnZhczsKLQotCXByaXZhdGUgUGFpbnRTZXNzaW9uIHBhaW50U2Vzc2lvbjsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCXByaXZhdGUgSW1hZ2UgcGFpbnRJbWFnZTsgLy8gYnVmZmVyIGZvciByZWZyZXNoIGJsaXRzCi0JcHJpdmF0ZSBpbnQgICBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodDsKLQlwcml2YXRlIGludCAgIHZpc2libGVXaWR0aCwgdmlzaWJsZUhlaWdodDsKLQotCXByaXZhdGUgRmlndXJlRHJhd0NvbnRleHQgZGlzcGxheUZEQyA9IG5ldyBGaWd1cmVEcmF3Q29udGV4dCgpOwotCXByaXZhdGUgRmlndXJlRHJhd0NvbnRleHQgaW1hZ2VGREMgPSBuZXcgRmlndXJlRHJhd0NvbnRleHQoKTsKLQlwcml2YXRlIEZpZ3VyZURyYXdDb250ZXh0IHBhaW50RkRDID0gbmV3IEZpZ3VyZURyYXdDb250ZXh0KCk7Ci0KLQkvKiBSdWJiZXJiYW5kICovCi0JcHJpdmF0ZSBDb250YWluZXJGaWd1cmUgcnViYmVyYmFuZCA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLQkJLy8gdGhlIGFjdGl2ZSBydWJiZXJiYW5kIHNlbGVjdGlvbgotCXByaXZhdGUgaW50IHJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPSAwOwotCQkvLyBhbHdheXMgPj0gMCwgaWYgPiAwIHJ1YmJlcmJhbmQgaGFzIGJlZW4gaGlkZGVuCi0KLQkvKiBTdGF0dXMgKi8KLQlwcml2YXRlIFRleHQgc3RhdHVzVGV4dDsKLQlwcml2YXRlIFN0cmluZyBzdGF0dXNBY3Rpb25JbmZvLCBzdGF0dXNNZXNzYWdlSW5mbywgc3RhdHVzQ29vcmRJbmZvOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBhaW50U3VyZmFjZS4KLQkgKiA8cD4KLQkgKiBwYWludENhbnZhcyBtdXN0IGhhdmUgU1dULk5PX1JFRFJBV19SRVNJWkUgYW5kIFNXVC5OT19CQUNLR1JPVU5EIHN0eWxlcywKLQkgKiAgICAgYW5kIG1heSBoYXZlIFNXVC5WX1NDUk9MTCBhbmQvb3IgU1dULkhfU0NST0xMLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gcGFpbnRDYW52YXMgdGhlIENhbnZhcyBvYmplY3QgaW4gd2hpY2ggdG8gcmVuZGVyCi0JICogQHBhcmFtIHBhaW50U3RhdHVzIHRoZSBQYWludFN0YXR1cyBvYmplY3QgdG8gdXNlIGZvciBwcm92aWRpbmcgdXNlciBmZWVkYmFjawotCSAqIEBwYXJhbSBmaWxsQ29sb3IgdGhlIGNvbG9yIHRvIGZpbGwgdGhlIGNhbnZhcyB3aXRoIGluaXRpYWxseQotCSAqLwotCXB1YmxpYyBQYWludFN1cmZhY2UoQ2FudmFzIHBhaW50Q2FudmFzLCBUZXh0IHN0YXR1c1RleHQsIENvbG9yIGZpbGxDb2xvcikgewotCQl0aGlzLnBhaW50Q2FudmFzID0gcGFpbnRDYW52YXM7Ci0JCXRoaXMuc3RhdHVzVGV4dCA9IHN0YXR1c1RleHQ7Ci0JCWNsZWFyU3RhdHVzKCk7Ci0KLQkJLyogU2V0IHVwIHRoZSBkcmF3aW5nIHN1cmZhY2UgKi8KLQkJUmVjdGFuZ2xlIGRpc3BsYXlSZWN0ID0gcGFpbnRDYW52YXMuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKTsKLQkJaW1hZ2VXaWR0aCA9IGRpc3BsYXlSZWN0LndpZHRoOwotCQlpbWFnZUhlaWdodCA9IGRpc3BsYXlSZWN0LmhlaWdodDsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UocGFpbnRDYW52YXMuZ2V0RGlzcGxheSgpLCBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodCk7Ci0KLQkJaW1hZ2VGREMuZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlpbWFnZUZEQy5nYy5zZXRCYWNrZ3JvdW5kKGZpbGxDb2xvcik7Ci0JCWltYWdlRkRDLmdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOwotCQlkaXNwbGF5RkRDLmdjID0gbmV3IEdDKHBhaW50Q2FudmFzKTsKLQotCQkvKiBJbml0aWFsaXplIHRoZSBzZXNzaW9uICovCi0JCXNldFBhaW50U2Vzc2lvbihudWxsKTsKLQotCQkvKiBBZGQgb3VyIGxpc3RlbmVycyAqLwotCQlwYWludENhbnZhcy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZGlzcGxheUZEQy5nYy5kaXNwb3NlKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlwYWludENhbnZhcy5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQkJCXByb2Nlc3NNb3VzZUV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpOwotCQkJCWlmIChwYWludFNlc3Npb24gIT0gbnVsbCkgcGFpbnRTZXNzaW9uLm1vdXNlRG93bihldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZVVwKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBldmVudCkgewotCQkJCXByb2Nlc3NNb3VzZUV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpOwotCQkJCWlmIChwYWludFNlc3Npb24gIT0gbnVsbCkgcGFpbnRTZXNzaW9uLm1vdXNlRG91YmxlQ2xpY2soZXZlbnQpOwotCQkJfQkJCQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKGV2ZW50KTsKLQkJCQlpZiAocGFpbnRTZXNzaW9uICE9IG51bGwpIHBhaW50U2Vzc2lvbi5tb3VzZU1vdmUoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJcGFpbnRDYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHJ1YmJlcmJhbmQuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIE5vdGhpbmcgdG8gbWVyZ2UsIHNvIHdlIGp1c3QgcmVmcmVzaAotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsCi0JCQkJCQlkaXNwbGF5RkRDLnhPZmZzZXQgKyBldmVudC54LCBkaXNwbGF5RkRDLnlPZmZzZXQgKyBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0LAotCQkJCQkJZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogQXZvaWQgZmxpY2tlciB3aGVuIG1lcmdpbmcgb3ZlcmxheWVkIG9iamVjdHMgYnkgY29uc3RydWN0aW5nIHRoZSBpbWFnZSBvbgotCQkJCQkgKiBhIGJhY2tidWZmZXIgZmlyc3QsIHRoZW4gYmxpdHRpbmcgaXQgdG8gdGhlIHNjcmVlbi4KLQkJCQkJICovCi0JCQkJCS8vIENoZWNrIHRoYXQgdGhlIGJhY2tidWZmZXIgaXMgbGFyZ2UgZW5vdWdoCi0JCQkJCWlmIChwYWludEltYWdlICE9IG51bGwpIHsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gcGFpbnRJbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQkJCWlmICgoZXZlbnQud2lkdGggKyBldmVudC54ID4gcmVjdC53aWR0aCkgfHwKLQkJCQkJCQkoZXZlbnQuaGVpZ2h0ICsgZXZlbnQueSA+IHJlY3QuaGVpZ2h0KSkgewotCQkJCQkJCXBhaW50RkRDLmdjLmRpc3Bvc2UoKTsKLQkJCQkJCQlwYWludEltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQlwYWludEltYWdlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocGFpbnRJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQkJcGFpbnRJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LAotCQkJCQkJCU1hdGgubWF4KHJlY3Qud2lkdGgsIGV2ZW50LndpZHRoICsgZXZlbnQueCksCi0JCQkJCQkJTWF0aC5tYXgocmVjdC5oZWlnaHQsIGV2ZW50LmhlaWdodCArIGV2ZW50LnkpKTsKLQkJCQkJCXBhaW50RkRDLmdjID0gbmV3IEdDKHBhaW50SW1hZ2UpOwotCQkJCQl9Ci0JCQkJCS8vIFNldHVwIGNsaXBwaW5nIGFuZCB0aGUgRkRDCi0JCQkJCVJlZ2lvbiBjbGlwUmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJCQlldmVudC5nYy5nZXRDbGlwcGluZyhjbGlwUmVnaW9uKTsJCQkJCQotCQkJCQlwYWludEZEQy5nYy5zZXRDbGlwcGluZyhjbGlwUmVnaW9uKTsKLQkJCQkJY2xpcFJlZ2lvbi5kaXNwb3NlKCk7Ci0KLQkJCQkJcGFpbnRGREMueE9mZnNldCA9IGRpc3BsYXlGREMueE9mZnNldDsKLQkJCQkJcGFpbnRGREMueU9mZnNldCA9IGRpc3BsYXlGREMueU9mZnNldDsKLQkJCQkJcGFpbnRGREMueFNjYWxlID0gZGlzcGxheUZEQy54U2NhbGU7Ci0JCQkJCXBhaW50RkRDLnlTY2FsZSA9IGRpc3BsYXlGREMueVNjYWxlOwotCQkJCQkKLQkJCQkJLy8gTWVyZ2UgdGhlIG92ZXJsYXllZCBvYmplY3RzIGludG8gdGhlIGltYWdlLCB0aGVuIGJsaXQKLQkJCQkJcGFpbnRGREMuZ2MuZHJhd0ltYWdlKGltYWdlLAotCQkJCQkJZGlzcGxheUZEQy54T2Zmc2V0ICsgZXZlbnQueCwgZGlzcGxheUZEQy55T2Zmc2V0ICsgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCwKLQkJCQkJCWV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQpOwotCQkJCQlydWJiZXJiYW5kLmRyYXcocGFpbnRGREMpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UocGFpbnRJbWFnZSwKLQkJCQkJCWV2ZW50LngsIGV2ZW50LnksIGV2ZW50LndpZHRoLCBldmVudC5oZWlnaHQsCi0JCQkJCQlldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCwgZXZlbnQuaGVpZ2h0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlwYWludENhbnZhcy5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVzaXplKCk7Ci0JCQl9CQkJCi0JCX0pOwotCi0JCS8qIFNldCB1cCB0aGUgcGFpbnQgY2FudmFzIHNjcm9sbCBiYXJzICovCi0JCVNjcm9sbEJhciBob3Jpem9udGFsID0gcGFpbnRDYW52YXMuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlob3Jpem9udGFsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWhvcml6b250YWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNjcm9sbEhvcml6b250YWxseSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCQlTY3JvbGxCYXIgdmVydGljYWwgPSBwYWludENhbnZhcy5nZXRWZXJ0aWNhbEJhcigpOwotCQl2ZXJ0aWNhbC5zZXRWaXNpYmxlKHRydWUpOwotCQl2ZXJ0aWNhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2Nyb2xsVmVydGljYWxseSgoU2Nyb2xsQmFyKWV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX0pOwotCQloYW5kbGVSZXNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIFBhaW50U3VyZmFjZSdzIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbWFnZUZEQy5nYy5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJaWYgKHBhaW50SW1hZ2UgIT0gbnVsbCkgewotCQkJcGFpbnRJbWFnZS5kaXNwb3NlKCk7Ci0JCQlwYWludEZEQy5nYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQljdXJyZW50UG9zaXRpb24gPSBudWxsOwotCQlwYWludENhbnZhcyA9IG51bGw7Ci0JCXBhaW50U2Vzc2lvbiA9IG51bGw7Ci0JCWltYWdlID0gbnVsbDsKLQkJcGFpbnRJbWFnZSA9IG51bGw7Ci0JCWRpc3BsYXlGREMgPSBudWxsOwotCQlpbWFnZUZEQyA9IG51bGw7Ci0JCXBhaW50RkRDID0gbnVsbDsKLQkJcnViYmVyYmFuZCA9IG51bGw7Ci0JCXN0YXR1c1RleHQgPSBudWxsOwotCQlzdGF0dXNBY3Rpb25JbmZvID0gbnVsbDsKLQkJc3RhdHVzTWVzc2FnZUluZm8gPSBudWxsOwotCQlzdGF0dXNDb29yZEluZm8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpICB7Ci0JCXBhaW50Q2FudmFzLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRGlzcGxheSBvbiB3aGljaCB0aGUgUGFpbnRTdXJmYWNlIHJlc2lkZXMuCi0JICogQHJldHVybiB0aGUgRGlzcGxheQotCSAqLwotCXB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBwYWludENhbnZhcy5nZXREaXNwbGF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU2hlbGwgaW4gd2hpY2ggdGhlIFBhaW50U3VyZmFjZSByZXNpZGVzLgotCSAqIEByZXR1cm4gdGhlIFNoZWxsCi0JICovCi0JcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gcGFpbnRDYW52YXMuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IHBhaW50IHNlc3Npb24uCi0JICogPHA+Ci0JICogSWYgb2xkUGFpbnRTZXNzaW9uICE9IHBhaW50U2Vzc2lvbiBjYWxscyBvbGRQYWludFNlc3Npb24uZW5kKCkKLQkgKiBhbmQgcGFpbnRTZXNzaW9uLmJlZ2luKCkKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhaW50U2Vzc2lvbiB0aGUgcGFpbnQgc2Vzc2lvbiB0byBhY3RpdmF0ZTsgbnVsbCB0byBkaXNhYmxlIGFsbCBzZXNzaW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhaW50U2Vzc2lvbihQYWludFNlc3Npb24gcGFpbnRTZXNzaW9uKSB7Ci0JCWlmICh0aGlzLnBhaW50U2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5wYWludFNlc3Npb24gPT0gcGFpbnRTZXNzaW9uKSByZXR1cm47Ci0JCQl0aGlzLnBhaW50U2Vzc2lvbi5lbmRTZXNzaW9uKCk7Ci0JCX0KLQkJdGhpcy5wYWludFNlc3Npb24gPSBwYWludFNlc3Npb247Ci0JCWNsZWFyU3RhdHVzKCk7Ci0JCWlmIChwYWludFNlc3Npb24gIT0gbnVsbCkgewotCQkJc2V0U3RhdHVzQWN0aW9uKHBhaW50U2Vzc2lvbi5nZXREaXNwbGF5TmFtZSgpKTsKLQkJCXBhaW50U2Vzc2lvbi5iZWdpblNlc3Npb24oKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXR1c0FjdGlvbihQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuTnVsbC5sYWJlbCIpKTsKLQkJCXNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJzZXNzaW9uLk51bGwubWVzc2FnZSIpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFpbnQgc2Vzc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBhaW50IHNlc3Npb24sIG51bGwgaWYgbm9uZSBpcyBhY3RpdmUKLQkgKi8KLQlwdWJsaWMgUGFpbnRTZXNzaW9uIGdldFBhaW50U2Vzc2lvbigpIHsKLQkJcmV0dXJuIHBhaW50U2Vzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhaW50IHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBwYWludCB0b29sLCBudWxsIGlmIG5vbmUgaXMgYWN0aXZlICh0aG91Z2ggc29tZSBvdGhlciBzZXNzaW9uCi0JICogICAgICAgICBtaWdodCBiZSkKLQkgKi8KLQlwdWJsaWMgUGFpbnRUb29sIGdldFBhaW50VG9vbCgpIHsKLQkJcmV0dXJuIChwYWludFNlc3Npb24gIT0gbnVsbCAmJiBwYWludFNlc3Npb24gaW5zdGFuY2VvZiBQYWludFRvb2wpID8KLQkJCShQYWludFRvb2wpcGFpbnRTZXNzaW9uIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIGFuIGludGVyYWN0aXZlIG9wZXJhdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGxhc3Qga25vd24gcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIERyYXdzIGEgRmlndXJlIG9iamVjdCB0byB0aGUgc2NyZWVuIGFuZCB0byB0aGUgYmFja2luZyBzdG9yZSBwZXJtYW5lbnRseS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gZHJhdyBvbnNjcmVlbgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYXdGaWd1cmUoRmlndXJlIG9iamVjdCkgewotCQlvYmplY3QuZHJhdyhpbWFnZUZEQyk7Ci0JCW9iamVjdC5kcmF3KGRpc3BsYXlGREMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBGaWd1cmUgb2JqZWN0IHRvIHRoZSBhY3RpdmUgcnViYmVyYmFuZCBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBvYmplY3Qgd2lsbCBiZSBkcmF3biB0byB0aGUgc2NyZWVuIGFzIGEgcHJldmlldyBhbmQgcmVmcmVzaGVkIGFwcHJvcHJpYXRlbHkKLQkgKiB1bnRpbCB0aGUgc2VsZWN0aW9uIGlzIGVpdGhlciBjbGVhcmVkIG9yIGNvbW1pdHRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkUnViYmVyYmFuZFNlbGVjdGlvbihGaWd1cmUgb2JqZWN0KSB7Ci0JCXJ1YmJlcmJhbmQuYWRkKG9iamVjdCk7Ci0JCWlmICghIGlzUnViYmVyYmFuZEhpZGRlbigpKSBvYmplY3QuZHJhdyhkaXNwbGF5RkRDKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGFjdGl2ZSBydWJiZXJiYW5kIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBFcmFzZXMgYW55IHJ1YmJlcmJhbmQgb2JqZWN0cyBvbiB0aGUgc2NyZWVuIHRoZW4gY2xlYXJzIHRoZSBzZWxlY3Rpb24uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpIHsKLQkJaWYgKCEgaXNSdWJiZXJiYW5kSGlkZGVuKCkpIHsKLQkJCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JCQlydWJiZXJiYW5kLmFkZERhbWFnZWRSZWdpb24oZGlzcGxheUZEQywgcmVnaW9uKTsKLQkJCVJlY3RhbmdsZSByID0gcmVnaW9uLmdldEJvdW5kcygpOwotCQkJcGFpbnRDYW52YXMucmVkcmF3KHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCwgdHJ1ZSk7Ci0JCQlyZWdpb24uZGlzcG9zZSgpOwotCQl9Ci0JCXJ1YmJlcmJhbmQuY2xlYXIoKTsKLQotCX0KLQotCS8qKgotCSAqIENvbW1pdHMgdGhlIGFjdGl2ZSBydWJiZXJiYW5kIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBSZWRyYXdzIGFueSBydWJiZXJiYW5kIG9iamVjdHMgb24gdGhlIHNjcmVlbiBhcyBwZXJtYW5lbnQgb2JqZWN0cyB0aGVuIGNsZWFycyB0aGUgc2VsZWN0aW9uLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21taXRSdWJiZXJiYW5kU2VsZWN0aW9uKCkgewotCQlydWJiZXJiYW5kLmRyYXcoaW1hZ2VGREMpOwotCQlpZiAoaXNSdWJiZXJiYW5kSGlkZGVuKCkpIHJ1YmJlcmJhbmQuZHJhdyhkaXNwbGF5RkRDKTsKLQkJcnViYmVyYmFuZC5jbGVhcigpOwotCX0KLQkKLQkvKioKLQkgKiBIaWRlcyB0aGUgcnViYmVyYmFuZCAoYnV0IGRvZXMgbm90IGVsaW1pbmF0ZSBpdCkuCi0JICogPHA+Ci0JICogSW5jcmVtZW50cyBieSBvbmUgdGhlIHJ1YmJlcmJhbmQgImhpZGUiIG5lc3RpbmcgY291bnQuICBUaGUgcnViYmVyYmFuZAotCSAqIGlzIGhpZGRlbiBmcm9tIHZpZXcgKGJ1dCByZW1haW5zIGFjdGl2ZSkgaWYgaXQgd2Fzbid0IGFscmVhZHkgaGlkZGVuLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBoaWRlUnViYmVyYmFuZCgpIHsKLQkJaWYgKHJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQrKyA8PSAwKSB7Ci0JCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJcnViYmVyYmFuZC5hZGREYW1hZ2VkUmVnaW9uKGRpc3BsYXlGREMsIHJlZ2lvbik7Ci0JCQlSZWN0YW5nbGUgciA9IHJlZ2lvbi5nZXRCb3VuZHMoKTsKLQkJCXBhaW50Q2FudmFzLnJlZHJhdyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQsIHRydWUpOwotCQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJfQotCX0JCQotCi0JLyoqCi0JICogU2hvd3MgKHVuLWhpZGVzKSB0aGUgcnViYmVyYmFuZC4KLQkgKiA8cD4KLQkgKiBEZWNyZW1lbnRzIGJ5IG9uZSB0aGUgcnViYmVyYmFuZCAiaGlkZSIgbmVzdGluZyBjb3VudC4gIFRoZSBydWJiZXJiYW5kCi0JICogaXMgb25seSBtYWRlIHZpc2libGUgd2hlbiBzaG93UnViYmVyYmFuZCgpIGhhcyBiZWVuIGNhbGxlZCBvbmNlIGZvciBlYWNoCi0JICogcHJldmlvdXMgaGlkZVJ1YmJlcmJhbmQoKS4gIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8gY2FsbCBzaG93UnViYmVyYmFuZCgpIGlmCi0JICogdGhlIHJ1YmJlciBiYW5kIGlzIG5vdCBwcmVzZW50bHkgaGlkZGVuLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UnViYmVyYmFuZCgpIHsKLQkJaWYgKHJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPD0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPiAwIik7Ci0JCWlmICgtLXJ1YmJlcmJhbmRIaWRkZW5OZXN0aW5nQ291bnQgPT0gMCkgewotCQkJcnViYmVyYmFuZC5kcmF3KGRpc3BsYXlGREMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIHJ1YmJlcmJhbmQgaXMgaGlkZGVuLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIHJ1YmJlciBpcyBoaWRkZW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1YmJlcmJhbmRIaWRkZW4oKSB7Ci0JCXJldHVybiBydWJiZXJiYW5kSGlkZGVuTmVzdGluZ0NvdW50ID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgaG9yaXpvbnRhbCBzY3JvbGwgZXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gc2Nyb2xsYmFyIHRoZSBob3Jpem9udGFsIHNjcm9sbCBiYXIgdGhhdCBwb3N0ZWQgdGhpcyBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNjcm9sbEhvcml6b250YWxseShTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChpbWFnZVdpZHRoID4gdmlzaWJsZVdpZHRoKSB7Ci0JCQlmaW5hbCBpbnQgb2xkT2Zmc2V0ID0gZGlzcGxheUZEQy54T2Zmc2V0OwotCQkJZmluYWwgaW50IG5ld09mZnNldCA9IE1hdGgubWluKHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSwgaW1hZ2VXaWR0aCAtIHZpc2libGVXaWR0aCk7Ci0JCQlpZiAob2xkT2Zmc2V0ICE9IG5ld09mZnNldCkgewotCQkJCXBhaW50Q2FudmFzLnVwZGF0ZSgpOwotCQkJCWRpc3BsYXlGREMueE9mZnNldCA9IG5ld09mZnNldDsKLQkJCQlwYWludENhbnZhcy5zY3JvbGwoTWF0aC5tYXgob2xkT2Zmc2V0IC0gbmV3T2Zmc2V0LCAwKSwgMCwgTWF0aC5tYXgobmV3T2Zmc2V0IC0gb2xkT2Zmc2V0LCAwKSwgMCwKLQkJCQkJdmlzaWJsZVdpZHRoLCB2aXNpYmxlSGVpZ2h0LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgdmVydGljYWwgc2Nyb2xsIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIHNjcm9sbGJhciB0aGUgdmVydGljYWwgc2Nyb2xsIGJhciB0aGF0IHBvc3RlZCB0aGlzIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2Nyb2xsVmVydGljYWxseShTY3JvbGxCYXIgc2Nyb2xsQmFyKSB7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChpbWFnZUhlaWdodCA+IHZpc2libGVIZWlnaHQpIHsKLQkJCWZpbmFsIGludCBvbGRPZmZzZXQgPSBkaXNwbGF5RkRDLnlPZmZzZXQ7Ci0JCQlmaW5hbCBpbnQgbmV3T2Zmc2V0ID0gTWF0aC5taW4oc2Nyb2xsQmFyLmdldFNlbGVjdGlvbigpLCBpbWFnZUhlaWdodCAtIHZpc2libGVIZWlnaHQpOwotCQkJaWYgKG9sZE9mZnNldCAhPSBuZXdPZmZzZXQpIHsKLQkJCQlwYWludENhbnZhcy51cGRhdGUoKTsKLQkJCQlkaXNwbGF5RkRDLnlPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCQkJcGFpbnRDYW52YXMuc2Nyb2xsKDAsIE1hdGgubWF4KG9sZE9mZnNldCAtIG5ld09mZnNldCwgMCksIDAsIE1hdGgubWF4KG5ld09mZnNldCAtIG9sZE9mZnNldCwgMCksCi0JCQkJCXZpc2libGVXaWR0aCwgdmlzaWJsZUhlaWdodCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgcmVzaXplIGV2ZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVSZXNpemUoKSB7Ci0JCXBhaW50Q2FudmFzLnVwZGF0ZSgpOwotCi0JCVJlY3RhbmdsZSB2aXNpYmxlUmVjdCA9IHBhaW50Q2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJdmlzaWJsZVdpZHRoID0gdmlzaWJsZVJlY3Qud2lkdGg7Ci0JCXZpc2libGVIZWlnaHQgPSB2aXNpYmxlUmVjdC5oZWlnaHQ7Ci0KLQkJU2Nyb2xsQmFyIGhvcml6b250YWwgPSBwYWludENhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JCWlmIChob3Jpem9udGFsICE9IG51bGwpIHsKLQkJCWRpc3BsYXlGREMueE9mZnNldCA9IE1hdGgubWluKGhvcml6b250YWwuZ2V0U2VsZWN0aW9uKCksIGltYWdlV2lkdGggLSB2aXNpYmxlV2lkdGgpOwotCQkJaWYgKGltYWdlV2lkdGggPD0gdmlzaWJsZVdpZHRoKSB7Ci0JCQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlob3Jpem9udGFsLnNldFNlbGVjdGlvbigwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaG9yaXpvbnRhbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWhvcml6b250YWwuc2V0VmFsdWVzKGRpc3BsYXlGREMueE9mZnNldCwgMCwgaW1hZ2VXaWR0aCwgdmlzaWJsZVdpZHRoLAotCQkJCQk4LCB2aXNpYmxlV2lkdGgpOwotCQkJfQotCQl9Ci0KLQkJU2Nyb2xsQmFyIHZlcnRpY2FsID0gcGFpbnRDYW52YXMuZ2V0VmVydGljYWxCYXIoKTsKLQkJaWYgKHZlcnRpY2FsICE9IG51bGwpIHsKLQkJCWRpc3BsYXlGREMueU9mZnNldCA9IE1hdGgubWluKHZlcnRpY2FsLmdldFNlbGVjdGlvbigpLCBpbWFnZUhlaWdodCAtIHZpc2libGVIZWlnaHQpOwotCQkJaWYgKGltYWdlSGVpZ2h0IDw9IHZpc2libGVIZWlnaHQpIHsKLQkJCQl2ZXJ0aWNhbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl2ZXJ0aWNhbC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnRpY2FsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJdmVydGljYWwuc2V0VmFsdWVzKGRpc3BsYXlGREMueU9mZnNldCwgMCwgaW1hZ2VIZWlnaHQsIHZpc2libGVIZWlnaHQsCi0JCQkJCTgsIHZpc2libGVIZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVmlydHVhbGl6ZXMgTW91c2VFdmVudCBjb29yZGluYXRlcyBhbmQgc3RvcmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzTW91c2VFdmVudENvb3JkaW5hdGVzKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJY3VycmVudFBvc2l0aW9uLnggPSBldmVudC54ID0KLQkJCU1hdGgubWluKE1hdGgubWF4KGV2ZW50LngsIDApLCB2aXNpYmxlV2lkdGggLSAxKSArIGRpc3BsYXlGREMueE9mZnNldDsKLQkJY3VycmVudFBvc2l0aW9uLnkgPSBldmVudC55ID0KLQkJCU1hdGgubWluKE1hdGgubWF4KGV2ZW50LnksIDApLCB2aXNpYmxlSGVpZ2h0IC0gMSkgKyBkaXNwbGF5RkRDLnlPZmZzZXQ7Ci0JfQotCQotCS8qKgotCSAqIENsZWFycyB0aGUgc3RhdHVzIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclN0YXR1cygpIHsKLQkJc3RhdHVzQWN0aW9uSW5mbyA9ICIiOwotCQlzdGF0dXNNZXNzYWdlSW5mbyA9ICIiOwotCQlzdGF0dXNDb29yZEluZm8gPSAiIjsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIGJhciBhY3Rpb24gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBpbiBwcm9ncmVzcywgbnVsbCB0byBjbGVhcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1c0FjdGlvbihTdHJpbmcgYWN0aW9uKSB7Ci0JCXN0YXR1c0FjdGlvbkluZm8gPSAoYWN0aW9uICE9IG51bGwpID8gYWN0aW9uIDogIiI7Ci0JCXVwZGF0ZVN0YXR1cygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgYmFyIG1lc3NhZ2UgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBkaXNwbGF5LCBudWxsIHRvIGNsZWFyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlzdGF0dXNNZXNzYWdlSW5mbyA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICIiOwotCQl1cGRhdGVTdGF0dXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb29yZGluYXRlcyBpbiB0aGUgc3RhdHVzIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gY29vcmQgdGhlIGNvb3JkaW5hdGVzIHRvIGRpc3BsYXksIG51bGwgdG8gY2xlYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNDb29yZChQb2ludCBjb29yZCkgewotCQlzdGF0dXNDb29yZEluZm8gPSAoY29vcmQgIT0gbnVsbCkgPyBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInN0YXR1cy5Db29yZC5mb3JtYXQiLCBuZXcgT2JqZWN0W10KLQkJCXsgbmV3IEludGVnZXIoY29vcmQueCksIG5ldyBJbnRlZ2VyKGNvb3JkLnkpfSkgOiAiIjsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29vcmRpbmF0ZSByYW5nZSBpbiB0aGUgc3RhdHVzIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYSB0aGUgImZyb20iIGNvb3JkaW5hdGUsIG11c3Qgbm90IGJlIG51bGwKLQkgKiBAcGFyYW0gYiB0aGUgInRvIiBjb29yZGluYXRlLCBtdXN0IG5vdCBiZSBudWxsCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzQ29vcmRSYW5nZShQb2ludCBhLCBQb2ludCBiKSB7Ci0JCXN0YXR1c0Nvb3JkSW5mbyA9IFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygic3RhdHVzLkNvb3JkUmFuZ2UuZm9ybWF0IiwgbmV3IE9iamVjdFtdCi0JCQl7IG5ldyBJbnRlZ2VyKGEueCksIG5ldyBJbnRlZ2VyKGEueSksIG5ldyBJbnRlZ2VyKGIueCksIG5ldyBJbnRlZ2VyKGIueSl9KTsKLQkJdXBkYXRlU3RhdHVzKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZGlzcGxheS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKCkgewotCQlzdGF0dXNUZXh0LnNldFRleHQoCi0JCQlQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInN0YXR1cy5CYXIuZm9ybWF0IiwgbmV3IE9iamVjdFtdCi0JCQl7IHN0YXR1c0FjdGlvbkluZm8sIHN0YXR1c01lc3NhZ2VJbmZvLCBzdGF0dXNDb29yZEluZm8gfSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50VG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTYxNGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhaW50VG9vbCBleHRlbmRzIFBhaW50U2Vzc2lvbiB7Ci0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGVuY2lsVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGVuY2lsVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjdlNTAzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BlbmNpbFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgcGVuY2lsIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZW5jaWxUb29sIGV4dGVuZHMgQ29udGludW91c1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIHBlbmNpbCB0b29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIGdldFBhaW50U3VyZmFjZSgpIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFBlbmNpbFRvb2woVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncywgUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCQlzZXQodG9vbFNldHRpbmdzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCdzIHNldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MpIHsKLQkJc2V0dGluZ3MgPSB0b29sU2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b29sLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoaXMgdG9vbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuUGVuY2lsLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2QgZm9yIGRyYXdpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW5kZXIoZmluYWwgUG9pbnQgcG9pbnQpIHsKLQkJZmluYWwgUGFpbnRTdXJmYWNlIHBzID0gZ2V0UGFpbnRTdXJmYWNlKCk7Ci0JCXBzLmRyYXdGaWd1cmUobmV3IFBvaW50RmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgcG9pbnQueCwgcG9pbnQueSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BvaW50RmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2ludEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI4MzE3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BvaW50RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBQb2ludCBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFBvaW50RmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgaW50IHgsIHk7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBvaW50Ci0JICogCi0JICogQHBhcmFtIGNvbG9yIHRoZSBjb2xvciBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geCB0aGUgdmlydHVhbCBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGVuZC1wb2ludAotCSAqIEBwYXJhbSB5IHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgZW5kLXBvaW50Ci0JICovCi0JcHVibGljIFBvaW50RmlndXJlKENvbG9yIGNvbG9yLCBpbnQgeCwgaW50IHkpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLnggPSB4OyB0aGlzLnkgPSB5OwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlQb2ludCBwID0gZmRjLnRvQ2xpZW50UG9pbnQoeCwgeSk7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmZpbGxSZWN0YW5nbGUocC54LCBwLnksIDEsIDEpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4LCB5LCB4LCB5KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUG9seUxpbmVUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2x5TGluZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5ODE1NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Qb2x5TGluZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEEgcG9seWxpbmUgZHJhd2luZyB0b29sLgotICovCi1wdWJsaWMgY2xhc3MgUG9seUxpbmVUb29sIGV4dGVuZHMgU2VnbWVudGVkUGFpbnRTZXNzaW9uIGltcGxlbWVudHMgUGFpbnRUb29sIHsKLQlwcml2YXRlIFRvb2xTZXR0aW5ncyBzZXR0aW5nczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQb2x5TGluZVRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFBvbHlMaW5lVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5Qb2x5TGluZS5sYWJlbCIpOwotCX0KLQotCS8qCi0JICogVGVtcGxhdGUgbWV0aG9kcyBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50W10gcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBib29sZWFuIGNsb3NlZCkgewotCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQlpZiAoY2xvc2VkICYmIHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdE5vbmUgJiYgbnVtUG9pbnRzID49IDMpIHsKLQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkUG9seWdvbkZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHBvaW50cywgbnVtUG9pbnRzKSk7Ci0JCX0KLQkJaWYgKCEgY2xvc2VkIHx8IHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdFNvbGlkIHx8IG51bVBvaW50cyA8IDMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzIC0gMTsgKytpKSB7Ci0JCQkJZmluYWwgUG9pbnQgYSA9IHBvaW50c1tpXTsKLQkJCQlmaW5hbCBQb2ludCBiID0gcG9pbnRzW2kgKyAxXTsKLQkJCQljb250YWluZXIuYWRkKG5ldyBMaW5lRmlndXJlKHNldHRpbmdzLmNvbW1vbkZvcmVncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsCi0JCQkJCWEueCwgYS55LCBiLngsIGIueSkpOwotCQkJfQotCQkJaWYgKGNsb3NlZCkgewotCQkJCWZpbmFsIFBvaW50IGEgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdOwotCQkJCWZpbmFsIFBvaW50IGIgPSBwb2ludHNbMF07Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgTGluZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCQlhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JlY3RhbmdsZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODBlNjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWN0YW5nbGVGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCXByaXZhdGUgQ29sb3IgZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3I7Ci0JcHJpdmF0ZSBpbnQgbGluZVN0eWxlLCB4MSwgeTEsIHgyLCB5MjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUmVjdGFuZ2xlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gY29sb3IgdGhlIGNvbG9yIGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBsaW5lU3R5bGUgdGhlIGxpbmUgc3R5bGUgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlKENvbG9yIGZvcmVncm91bmRDb2xvciwgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBpbnQgbGluZVN0eWxlLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5mb3JlZ3JvdW5kQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCXRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQl0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLQkJdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlSZWN0YW5nbGUgciA9IGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5Mik7Ci0JCWZkYy5nYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCWZkYy5nYy5zZXRMaW5lU3R5bGUobGluZVN0eWxlKTsKLQkJZmRjLmdjLmRyYXdSZWN0YW5nbGUoci54LCByLnksIHIud2lkdGggLSAxLCByLmhlaWdodCAtIDEpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9SZWN0YW5nbGVUb29sLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9SZWN0YW5nbGVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzNiYmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUmVjdGFuZ2xlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWN0YW5nbGVUb29sIGV4dGVuZHMgRHJhZ1BhaW50U2Vzc2lvbiBpbXBsZW1lbnRzIFBhaW50VG9vbCB7Ci0JcHJpdmF0ZSBUb29sU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUmVjdGFuZ2xlVG9vbC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqIEBwYXJhbSBwYWludFN1cmZhY2UgdGhlIFBhaW50U3VyZmFjZSB3ZSB3aWxsIHJlbmRlciBvbi4KLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5SZWN0YW5nbGUubGFiZWwiKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBsYXRlIG1ldGhvZCBmb3IgZHJhd2luZwotCSAqLwotCXByb3RlY3RlZCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50IGEsIFBvaW50IGIpIHsKLQkJc3dpdGNoIChzZXR0aW5ncy5jb21tb25GaWxsVHlwZSkgewotCQkJZGVmYXVsdDoKLQkJCWNhc2UgVG9vbFNldHRpbmdzLmZ0Tm9uZToKLQkJCQlyZXR1cm4gbmV3IFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgc2V0dGluZ3MuY29tbW9uTGluZVN0eWxlLAotCQkJCQlhLngsIGEueSwgYi54LCBiLnkpOwotCQkJY2FzZSBUb29sU2V0dGluZ3MuZnRTb2xpZDoKLQkJCQlyZXR1cm4gbmV3IFNvbGlkUmVjdGFuZ2xlRmlndXJlKHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwgYS54LCBhLnksIGIueCwgYi55KTsKLQkJCWNhc2UgVG9vbFNldHRpbmdzLmZ0T3V0bGluZTogewotCQkJCUNvbnRhaW5lckZpZ3VyZSBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0JCQkJY29udGFpbmVyLmFkZChuZXcgU29saWRSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uQmFja2dyb3VuZENvbG9yLCBhLngsIGEueSwgYi54LCBiLnkpKTsKLQkJCQljb250YWluZXIuYWRkKG5ldyBSZWN0YW5nbGVGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkxpbmVTdHlsZSwKLQkJCQkJYS54LCBhLnksIGIueCwgYi55KSk7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1JvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MWQ2Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSb3VuZGVkUmVjdGFuZ2xlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgaW50IGxpbmVTdHlsZSwgeDEsIHkxLCB4MiwgeTIsIGRpYW1ldGVyOwotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBSZWN0YW5nbGUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGxpbmVTdHlsZSB0aGUgbGluZSBzdHlsZSBmb3IgdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0geDEgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geTEgdGhlIHZpcnR1YWwgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb3JuZXIKLQkgKiBAcGFyYW0geDIgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29ybmVyCi0JICogQHBhcmFtIHkyIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSBkaWFtZXRlciB0aGUgZGlhbWV0ZXIgb2YgY3VydmF0dXJlIG9mIGFsbCBmb3VyIGNvcm5lcnMKLQkgKi8KLQlwdWJsaWMgUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIENvbG9yIGJhY2tncm91bmRDb2xvciwgaW50IGxpbmVTdHlsZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgZGlhbWV0ZXIpIHsKLQkJdGhpcy5mb3JlZ3JvdW5kQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci0JCXRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yOwotCQl0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLQkJdGhpcy54MSA9IHgxOyB0aGlzLnkxID0geTE7IHRoaXMueDIgPSB4MjsgdGhpcy55MiA9IHkyOwotCQl0aGlzLmRpYW1ldGVyID0gZGlhbWV0ZXI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJZmRjLmdjLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCQlmZGMuZ2MuZHJhd1JvdW5kUmVjdGFuZ2xlKHIueCwgci55LCByLndpZHRoIC0gMSwgci5oZWlnaHQgLSAxLCBkaWFtZXRlciwgZGlhbWV0ZXIpOwotCQlmZGMuZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUm91bmRlZFJlY3RhbmdsZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1YzA2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Sb3VuZGVkUmVjdGFuZ2xlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQSBkcmF3aW5nIHRvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBSb3VuZGVkUmVjdGFuZ2xlVG9vbCBleHRlbmRzIERyYWdQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFJvdW5kZWRSZWN0YW5nbGVUb29sLgotCSAqIAotCSAqIEBwYXJhbSB0b29sU2V0dGluZ3MgdGhlIG5ldyB0b29sIHNldHRpbmdzCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgUGFpbnRTdXJmYWNlIHdlIHdpbGwgcmVuZGVyIG9uLgotCSAqLwotCXB1YmxpYyBSb3VuZGVkUmVjdGFuZ2xlVG9vbChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzLCBQYWludFN1cmZhY2UgcGFpbnRTdXJmYWNlKSB7Ci0JCXN1cGVyKHBhaW50U3VyZmFjZSk7Ci0JCXNldCh0b29sU2V0dGluZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sJ3Mgc2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoVG9vbFNldHRpbmdzIHRvb2xTZXR0aW5ncykgewotCQlzZXR0aW5ncyA9IHRvb2xTZXR0aW5nczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRvb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyB0b29sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZygidG9vbC5Sb3VuZGVkUmVjdGFuZ2xlLmxhYmVsIik7Ci0JfQotCi0JLyoKLQkgKiBUZW1wbGF0ZSBtZXRob2RzIGZvciBkcmF3aW5nCi0JICovCi0JcHJvdGVjdGVkIEZpZ3VyZSBjcmVhdGVGaWd1cmUoUG9pbnQgYSwgUG9pbnQgYikgewotCQlDb250YWluZXJGaWd1cmUgY29udGFpbmVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotCQlpZiAoc2V0dGluZ3MuY29tbW9uRmlsbFR5cGUgIT0gVG9vbFNldHRpbmdzLmZ0Tm9uZSkKLQkJCWNvbnRhaW5lci5hZGQobmV3IFNvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25CYWNrZ3JvdW5kQ29sb3IsCi0JCQkJYS54LCBhLnksIGIueCwgYi55LCBzZXR0aW5ncy5yb3VuZGVkUmVjdGFuZ2xlQ29ybmVyRGlhbWV0ZXIpKTsKLQkJaWYgKHNldHRpbmdzLmNvbW1vbkZpbGxUeXBlICE9IFRvb2xTZXR0aW5ncy5mdFNvbGlkKQotCQkJY29udGFpbmVyLmFkZChuZXcgUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShzZXR0aW5ncy5jb21tb25Gb3JlZ3JvdW5kQ29sb3IsIHNldHRpbmdzLmNvbW1vbkJhY2tncm91bmRDb2xvciwKLQkJCQlzZXR0aW5ncy5jb21tb25MaW5lU3R5bGUsIGEueCwgYS55LCBiLngsIGIueSwgc2V0dGluZ3Mucm91bmRlZFJlY3RhbmdsZUNvcm5lckRpYW1ldGVyKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU2VnbWVudGVkUGFpbnRTZXNzaW9uLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9TZWdtZW50ZWRQYWludFNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmYTk5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9TZWdtZW50ZWRQYWludFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgc3VwZXJjbGFzcyBmb3IgcGFpbnQgdG9vbHMgdGhhdCBjb250cnVjdCBvYmplY3RzIGZyb20gaW5kaXZpZHVhbGx5Ci0gKiBwaWNrZWQgc2VnbWVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWdtZW50ZWRQYWludFNlc3Npb24gZXh0ZW5kcyBCYXNpY1BhaW50U2Vzc2lvbiB7Ci0JLyoqCi0JICogVGhlIHNldCBvZiBjb250cm9sIHBvaW50cyBtYWtpbmcgdXAgdGhlIHNlZ21lbnRlZCBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIFZlY3RvciAvKiBvZiBQb2ludCAqLyBjb250cm9sUG9pbnRzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogVGhlIHByZXZpb3VzIGZpZ3VyZSAoc28gdGhhdCB3ZSBjYW4gYWJvcnQgd2l0aCByaWdodC1idXR0b24pCi0JICovCi0JcHJpdmF0ZSBGaWd1cmUgcHJldmlvdXNGaWd1cmUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgZmlndXJlIChzbyB0aGF0IHdlIGNhbiBhYm9ydCB3aXRoIHJpZ2h0LWJ1dHRvbikKLQkgKi8KLQlwcml2YXRlIEZpZ3VyZSBjdXJyZW50RmlndXJlID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFNlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHBhaW50U3VyZmFjZSB0aGUgZHJhd2luZyBzdXJmYWNlIHRvIHVzZQotCSAqLwotCXByb3RlY3RlZCBTZWdtZW50ZWRQYWludFNlc3Npb24oUGFpbnRTdXJmYWNlIHBhaW50U3VyZmFjZSkgewotCQlzdXBlcihwYWludFN1cmZhY2UpOwotCX0KLQotCS8qKgotCSAqIEFjdGl2YXRlcyB0aGUgdG9vbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmFuY2hvck1vZGUiKSk7Ci0JCXByZXZpb3VzRmlndXJlID0gbnVsbDsKLQkJY3VycmVudEZpZ3VyZSA9IG51bGw7Ci0JCWNvbnRyb2xQb2ludHMuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVhY3RpdmF0ZXMgdGhlIHRvb2wuCi0gICAgICovCi0JcHVibGljIHZvaWQgZW5kU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCWlmIChwcmV2aW91c0ZpZ3VyZSAhPSBudWxsKSBnZXRQYWludFN1cmZhY2UoKS5kcmF3RmlndXJlKHByZXZpb3VzRmlndXJlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVzZXRzIHRoZSB0b29sLgotCSAqIEFib3J0cyBhbnkgb3BlcmF0aW9uIGluIHByb2dyZXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0U2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCWlmIChwcmV2aW91c0ZpZ3VyZSAhPSBudWxsKSBnZXRQYWludFN1cmZhY2UoKS5kcmF3RmlndXJlKHByZXZpb3VzRmlndXJlKTsKLQkJCi0JCWdldFBhaW50U3VyZmFjZSgpLnNldFN0YXR1c01lc3NhZ2UoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKAotCQkJInNlc3Npb24uU2VnbWVudGVkSW50ZXJhY3RpdmVQYWludC5tZXNzYWdlLmFuY2hvck1vZGUiKSk7Ci0JCXByZXZpb3VzRmlndXJlID0gbnVsbDsKLQkJY3VycmVudEZpZ3VyZSA9IG51bGw7Ci0JCWNvbnRyb2xQb2ludHMuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgbW91c2VEb3duIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0KLQkJZ2V0UGFpbnRTdXJmYWNlKCkuc2V0U3RhdHVzTWVzc2FnZShQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoCi0JCQkic2Vzc2lvbi5TZWdtZW50ZWRJbnRlcmFjdGl2ZVBhaW50Lm1lc3NhZ2UuaW50ZXJhY3RpdmVNb2RlIikpOwotCQlwcmV2aW91c0ZpZ3VyZSA9IGN1cnJlbnRGaWd1cmU7Ci0KLQkJaWYgKGNvbnRyb2xQb2ludHMuc2l6ZSgpID4gMCkgewotCQkJZmluYWwgUG9pbnQgbGFzdFBvaW50ID0gKFBvaW50KSBjb250cm9sUG9pbnRzLmVsZW1lbnRBdChjb250cm9sUG9pbnRzLnNpemUoKSAtIDEpOwotCQkJaWYgKGxhc3RQb2ludC54ID09IGV2ZW50LnggfHwgbGFzdFBvaW50LnkgPT0gZXZlbnQueSkgcmV0dXJuOyAvLyBzcHVyaW91cyBldmVudAotCQl9Ci0JCWNvbnRyb2xQb2ludHMuYWRkKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlRG91YmxlQ2xpY2sgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0JCWlmIChjb250cm9sUG9pbnRzLnNpemUoKSA+PSAyKSB7Ci0JCQlnZXRQYWludFN1cmZhY2UoKS5jbGVhclJ1YmJlcmJhbmRTZWxlY3Rpb24oKTsKLQkJCXByZXZpb3VzRmlndXJlID0gY3JlYXRlRmlndXJlKAotCQkJCShQb2ludFtdKSBjb250cm9sUG9pbnRzLnRvQXJyYXkobmV3IFBvaW50W2NvbnRyb2xQb2ludHMuc2l6ZSgpXSksCi0JCQkJY29udHJvbFBvaW50cy5zaXplKCksIHRydWUpOwotCQl9Ci0JCXJlc2V0U2Vzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZVVwIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5idXR0b24gIT0gMSkgewotCQkJcmVzZXRTZXNzaW9uKCk7IC8vIGFib3J0IGlmIHJpZ2h0IG9yIG1pZGRsZSBtb3VzZSBidXR0b24gcHJlc3NlZAotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZU1vdmUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQlmaW5hbCBQYWludFN1cmZhY2UgcHMgPSBnZXRQYWludFN1cmZhY2UoKTsKLQkJaWYgKGNvbnRyb2xQb2ludHMuc2l6ZSgpID09IDApIHsKLQkJCXBzLnNldFN0YXR1c0Nvb3JkKHBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJCXJldHVybjsgLy8gc3B1cmlvdXMgZXZlbnQKLQkJfQotCQlwcy5zZXRTdGF0dXNDb29yZFJhbmdlKChQb2ludCkgY29udHJvbFBvaW50cy5lbGVtZW50QXQoY29udHJvbFBvaW50cy5zaXplKCkgLSAxKSwKLQkJCXBzLmdldEN1cnJlbnRQb3NpdGlvbigpKTsKLQkJcHMuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JCVBvaW50W10gcG9pbnRzID0gKFBvaW50W10pIGNvbnRyb2xQb2ludHMudG9BcnJheShuZXcgUG9pbnRbY29udHJvbFBvaW50cy5zaXplKCkgKyAxXSk7Ci0JCXBvaW50c1tjb250cm9sUG9pbnRzLnNpemUoKV0gPSBwcy5nZXRDdXJyZW50UG9zaXRpb24oKTsKLQkJY3VycmVudEZpZ3VyZSA9IGNyZWF0ZUZpZ3VyZShwb2ludHMsIHBvaW50cy5sZW5ndGgsIGZhbHNlKTsKLQkJcHMuYWRkUnViYmVyYmFuZFNlbGVjdGlvbihjdXJyZW50RmlndXJlKTsKLQl9CQotCi0JLyoqCi0JICogVGVtcGxhdGUgTWV0aG9kOiBDcmVhdGVzIGEgRmlndXJlIGZvciBkcmF3aW5nIHJ1YmJlcmJhbmQgZW50aXRpZXMgYW5kIHRoZSBmaW5hbCBwcm9kdWN0Ci0JICogCi0JICogQHBhcmFtIHBvaW50cyB0aGUgYXJyYXkgb2YgY29udHJvbCBwb2ludHMKLQkgKiBAcGFyYW0gbnVtUG9pbnRzIHRoZSBudW1iZXIgb2YgdmFsaWQgcG9pbnRzIGluIHRoZSBhcnJheSAobiA+PSAyKQotCSAqIEBwYXJhbSBjbG9zZWQgdHJ1ZSBpZiB0aGUgdXNlciBkb3VibGUtY2xpY2tlZCBvbiB0aGUgZmluYWwgY29udHJvbCBwb2ludAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBGaWd1cmUgY3JlYXRlRmlndXJlKFBvaW50W10gcG9pbnRzLCBpbnQgbnVtUG9pbnRzLCBib29sZWFuIGNsb3NlZCk7Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZEVsbGlwc2VGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkRWxsaXBzZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2U5YWRhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkRWxsaXBzZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgU29saWQgRWxsaXBzZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFNvbGlkRWxsaXBzZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludCB4MSwgeTEsIHgyLCB5MjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU29saWRFbGxpcHNlCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhbnkgdHdvIGRpYW1ldHJpY2FsbHkgb3Bwb3NpbmcgY29ybmVycyBvZiBhIGJveAotCSAqIGJvdW5kaW5nIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgU29saWRFbGxpcHNlRmlndXJlKENvbG9yIGNvbG9yLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLngxID0geDE7IHRoaXMueTEgPSB5MTsgdGhpcy54MiA9IHgyOyB0aGlzLnkyID0geTI7Ci0JfQotCXB1YmxpYyB2b2lkIGRyYXcoRmlndXJlRHJhd0NvbnRleHQgZmRjKSB7Ci0JCVJlY3RhbmdsZSByID0gZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKTsKLQkJZmRjLmdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmZGMuZ2MuZmlsbE92YWwoci54LCByLnksIHIud2lkdGgsIHIuaGVpZ2h0KTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkRGFtYWdlZFJlZ2lvbihGaWd1cmVEcmF3Q29udGV4dCBmZGMsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmVnaW9uLmFkZChmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFBvbHlnb25GaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUG9seWdvbkZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUxNDAwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1NvbGlkUG9seWdvbkZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgTGluZSBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFNvbGlkUG9seWdvbkZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludFtdIHBvaW50czsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU29saWRQb2x5Z29uCi0JICogVGhlc2Ugb2JqZWN0cyBhcmUgZGVmaW5lZCBieSBhIHNlcXVlbmNlIG9mIHZlcnRpY2VzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHZlcnRpY2VzIHRoZSBhcnJheSBvZiB2ZXJ0aWNlcyBtYWtpbmcgdXAgdGhlIHBvbHlnb24KLQkgKiBAcGFyYW0gbnVtUG9pbnQgdGhlIG51bWJlciBvZiB2YWxpZCBwb2ludHMgaW4gdGhlIGFycmF5IChuID49IDMpCi0JICovCi0JcHVibGljIFNvbGlkUG9seWdvbkZpZ3VyZShDb2xvciBjb2xvciwgUG9pbnRbXSB2ZXJ0aWNlcywgaW50IG51bVBvaW50cykgewotCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCXRoaXMucG9pbnRzID0gbmV3IGludFtudW1Qb2ludHMgKiAyXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Qb2ludHM7ICsraSkgewotCQkJcG9pbnRzW2kgKiAyXSA9IHZlcnRpY2VzW2ldLng7Ci0JCQlwb2ludHNbaSAqIDIgKyAxXSA9IHZlcnRpY2VzW2ldLnk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJaW50W10gZHJhd1BvaW50cyA9IG5ldyBpbnRbcG9pbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArPSAyKSB7Ci0JCQlkcmF3UG9pbnRzW2ldID0gcG9pbnRzW2ldICogZmRjLnhTY2FsZSAtIGZkYy54T2Zmc2V0OwotCQkJZHJhd1BvaW50c1tpICsgMV0gPSBwb2ludHNbaSArIDFdICogZmRjLnlTY2FsZSAtIGZkYy55T2Zmc2V0OwotCQl9Ci0JCWZkYy5nYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmRjLmdjLmZpbGxQb2x5Z29uKGRyYXdQb2ludHMpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlpbnQgeG1pbiA9IEludGVnZXIuTUFYX1ZBTFVFLCB5bWluID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCWludCB4bWF4ID0gSW50ZWdlci5NSU5fVkFMVUUsIHltYXggPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMikgewotCQkJaWYgKHBvaW50c1tpXSA8IHhtaW4pIHhtaW4gPSBwb2ludHNbaV07Ci0JCQlpZiAocG9pbnRzW2ldID4geG1heCkgeG1heCA9IHBvaW50c1tpXTsKLQkJCWlmIChwb2ludHNbaSsxXSA8IHltaW4pIHltaW4gPSBwb2ludHNbaSsxXTsKLQkJCWlmIChwb2ludHNbaSsxXSA+IHltYXgpIHltYXggPSBwb2ludHNbaSsxXTsKLQkJfQkJCi0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHhtaW4sIHltaW4sIHhtYXgsIHltYXgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJlY3RhbmdsZUZpZ3VyZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSZWN0YW5nbGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMmZiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJlY3RhbmdsZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogMkQgU29saWRSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb2xpZFJlY3RhbmdsZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQlwcml2YXRlIGludCB4MSwgeTEsIHgyLCB5MjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU29saWRSZWN0YW5nbGUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKi8KLQlwdWJsaWMgU29saWRSZWN0YW5nbGVGaWd1cmUoQ29sb3IgY29sb3IsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewotCQl0aGlzLmNvbG9yID0gY29sb3I7IHRoaXMueDEgPSB4MTsgdGhpcy55MSA9IHkxOyB0aGlzLngyID0geDI7IHRoaXMueTIgPSB5MjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5maWxsUmVjdGFuZ2xlKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJlZ2lvbi5hZGQoZmRjLnRvQ2xpZW50UmVjdGFuZ2xlKHgxLCB5MSwgeDIsIHkyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvU29saWRSb3VuZGVkUmVjdGFuZ2xlRmlndXJlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwZDJlYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Tb2xpZFJvdW5kZWRSZWN0YW5nbGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIDJEIFNvbGlkUmVjdGFuZ2xlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgU29saWRSb3VuZGVkUmVjdGFuZ2xlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgaW50IHgxLCB5MSwgeDIsIHkyLCBkaWFtZXRlcjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU29saWRSZWN0YW5nbGUKLQkgKiBUaGVzZSBvYmplY3RzIGFyZSBkZWZpbmVkIGJ5IGFueSB0d28gZGlhbWV0cmljYWxseSBvcHBvc2luZyBjb3JuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIHgxIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHkxIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29ybmVyCi0JICogQHBhcmFtIHgyIHRoZSB2aXJ0dWFsIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvcm5lcgotCSAqIEBwYXJhbSB5MiB0aGUgdmlydHVhbCBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb3JuZXIKLQkgKiBAcGFyYW0gZGlhbWV0ZXIgdGhlIGRpYW1ldGVyIG9mIGN1cnZhdHVyZSBvZiBhbGwgZm91ciBjb3JuZXJzCi0JICovCi0JcHVibGljIFNvbGlkUm91bmRlZFJlY3RhbmdsZUZpZ3VyZShDb2xvciBjb2xvciwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgZGlhbWV0ZXIpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLngxID0geDE7IHRoaXMueTEgPSB5MTsgdGhpcy54MiA9IHgyOyB0aGlzLnkyID0geTI7Ci0JCXRoaXMuZGlhbWV0ZXIgPSBkaWFtZXRlcjsKLQl9Ci0JcHVibGljIHZvaWQgZHJhdyhGaWd1cmVEcmF3Q29udGV4dCBmZGMpIHsKLQkJUmVjdGFuZ2xlIHIgPSBmZGMudG9DbGllbnRSZWN0YW5nbGUoeDEsIHkxLCB4MiwgeTIpOwotCQlmZGMuZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5maWxsUm91bmRSZWN0YW5nbGUoci54LCByLnksIHIud2lkdGgsIHIuaGVpZ2h0LCBkaWFtZXRlciwgZGlhbWV0ZXIpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGREYW1hZ2VkUmVnaW9uKEZpZ3VyZURyYXdDb250ZXh0IGZkYywgUmVnaW9uIHJlZ2lvbikgewotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4MSwgeTEsIHgyLCB5MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRGaWd1cmUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiZDBjMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9UZXh0RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiAyRCBSZWN0YW5nbGUgb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQlwcml2YXRlIENvbG9yICBjb2xvcjsKLQlwcml2YXRlIEZvbnQgICBmb250OwotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBpbnQgeCwgeTsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgVGV4dEZpZ3VyZQotCSAqIAotCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgZm9yIHRoaXMgb2JqZWN0Ci0JICogQHBhcmFtIGZvbnQgIHRoZSBmb250IGZvciB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSB0ZXh0ICB0aGUgdGV4dCB0byBkcmF3LCB0YWIgYW5kIG5ldy1saW5lIGV4cGFuc2lvbiBpcyBwZXJmb3JtZWQKLQkgKiBAcGFyYW0geCAgICAgdGhlIHZpcnR1YWwgWCBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHRleHQgYm91bmRpbmcgYm94Ci0JICogQHBhcmFtIHkgICAgIHRoZSB2aXJ0dWFsIFkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSB0ZXh0IGJvdW5kaW5nIGJveAotCSAqLwotCXB1YmxpYyBUZXh0RmlndXJlKENvbG9yIGNvbG9yLCBGb250IGZvbnQsIFN0cmluZyB0ZXh0LCBpbnQgeCwgaW50IHkpIHsKLQkJdGhpcy5jb2xvciA9IGNvbG9yOyB0aGlzLmZvbnQgPSBmb250OyB0aGlzLnRleHQgPSB0ZXh0OyB0aGlzLnggPSB4OyB0aGlzLnkgPSB5OwotCX0KLQlwdWJsaWMgdm9pZCBkcmF3KEZpZ3VyZURyYXdDb250ZXh0IGZkYykgewotCQlQb2ludCBwID0gZmRjLnRvQ2xpZW50UG9pbnQoeCwgeSk7Ci0JCWZkYy5nYy5zZXRGb250KGZvbnQpOwotCQlmZGMuZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCWZkYy5nYy5kcmF3VGV4dCh0ZXh0LCBwLngsIHAueSwgdHJ1ZSk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZERhbWFnZWRSZWdpb24oRmlndXJlRHJhd0NvbnRleHQgZmRjLCBSZWdpb24gcmVnaW9uKSB7Ci0JCUZvbnQgb2xkRm9udCA9IGZkYy5nYy5nZXRGb250KCk7Ci0JCWZkYy5nYy5zZXRGb250KGZvbnQpOwotCQlQb2ludCB0ZXh0RXh0ZW50ID0gZmRjLmdjLnRleHRFeHRlbnQodGV4dCk7Ci0JCWZkYy5nYy5zZXRGb250KG9sZEZvbnQpOwotCQlyZWdpb24uYWRkKGZkYy50b0NsaWVudFJlY3RhbmdsZSh4LCB5LCB4ICsgdGV4dEV4dGVudC54LCB5ICsgdGV4dEV4dGVudC55KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVGV4dFRvb2wuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1RleHRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Njc4N2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVGV4dFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLS8qKgotICogQSB0ZXh0IGRyYXdpbmcgdG9vbC4KLSAqLwotcHVibGljIGNsYXNzIFRleHRUb29sIGV4dGVuZHMgQmFzaWNQYWludFNlc3Npb24gaW1wbGVtZW50cyBQYWludFRvb2wgewotCXByaXZhdGUgVG9vbFNldHRpbmdzIHNldHRpbmdzOwotCXByaXZhdGUgU3RyaW5nIGRyYXdUZXh0ID0gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlRleHQuc2V0dGluZ3MuZGVmYXVsdHRleHQiKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBQYWludFRvb2wuCi0JICogCi0JICogQHBhcmFtIHRvb2xTZXR0aW5ncyB0aGUgbmV3IHRvb2wgc2V0dGluZ3MKLQkgKiBAcGFyYW0gcGFpbnRTdXJmYWNlIHRoZSBQYWludFN1cmZhY2Ugd2Ugd2lsbCByZW5kZXIgb24uCi0JICovCi0JcHVibGljIFRleHRUb29sKFRvb2xTZXR0aW5ncyB0b29sU2V0dGluZ3MsIFBhaW50U3VyZmFjZSBwYWludFN1cmZhY2UpIHsKLQkJc3VwZXIocGFpbnRTdXJmYWNlKTsKLQkJc2V0KHRvb2xTZXR0aW5ncyk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wncyBzZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFNldHRpbmdzIHRoZSBuZXcgdG9vbCBzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldChUb29sU2V0dGluZ3MgdG9vbFNldHRpbmdzKSB7Ci0JCXNldHRpbmdzID0gdG9vbFNldHRpbmdzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9vbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIHRvb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlRleHQubGFiZWwiKTsKLQl9Ci0JCi0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSB0b29sLgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuc2V0U3RhdHVzTWVzc2FnZShQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoCi0JCQkic2Vzc2lvbi5UZXh0Lm1lc3NhZ2UiKSk7Ci0JfQotCQotCS8qKgotCSAqIERlYWN0aXZhdGVzIHRoZSB0b29sLgotICAgICAqLwotCXB1YmxpYyB2b2lkIGVuZFNlc3Npb24oKSB7Ci0JCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBBYm9ydHMgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0U2Vzc2lvbigpIHsKLQkJZ2V0UGFpbnRTdXJmYWNlKCkuY2xlYXJSdWJiZXJiYW5kU2VsZWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvd24gZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuYnV0dG9uID09IDEpIHsKLQkJCS8vIGRyYXcgd2l0aCBsZWZ0IG1vdXNlIGJ1dHRvbgotCQkJZ2V0UGFpbnRTdXJmYWNlKCkuY29tbWl0UnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQl9IGVsc2UgewotCQkJLy8gc2V0IHRleHQgd2l0aCByaWdodCBtb3VzZSBidXR0b24KLQkJCWdldFBhaW50U3VyZmFjZSgpLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQkJU2hlbGwgc2hlbGwgPSBnZXRQYWludFN1cmZhY2UoKS5nZXRTaGVsbCgpOwotCQkJZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJZGlhbG9nLnNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJ0b29sLlRleHQuZGlhbG9nLnRpdGxlIikpOwotCQkJZGlhbG9nLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoInRvb2wuVGV4dC5kaWFsb2cubWVzc2FnZSIpKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCWZpbmFsIFRleHQgZmllbGQgPSBuZXcgVGV4dChkaWFsb2csIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWZpZWxkLnNldFRleHQoZHJhd1RleHQpOwotCQkJZmllbGQuc2VsZWN0QWxsKCk7Ci0JCQlmaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShkaWFsb2csIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJYnV0dG9ucy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQoUGFpbnRFeGFtcGxlLmdldFJlc291cmNlU3RyaW5nKCJPSyIpKTsKLQkJCW9rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJZHJhd1RleHQgPSBmaWVsZC5nZXRUZXh0KCk7Ci0JCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCQljYW5jZWwuc2V0VGV4dChQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoIkNhbmNlbCIpKTsKLQkJCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRpYWxvZy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlkaWFsb2cuc2V0RGVmYXVsdEJ1dHRvbihvayk7Ci0JCQlkaWFsb2cucGFjaygpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCURpc3BsYXkgZGlzcGxheSA9IGRpYWxvZy5nZXREaXNwbGF5KCk7Ci0JCQl3aGlsZSAoISBzaGVsbC5pc0Rpc3Bvc2VkKCkgJiYgISBkaWFsb2cuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9CQotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBtb3VzZURvdWJsZUNsaWNrIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCB0aGUgbW91c2UgZXZlbnQgZGV0YWlsIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlVXAgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IHRoZSBtb3VzZSBldmVudCBkZXRhaWwgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyBhIG1vdXNlTW92ZSBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIGV2ZW50IGRldGFpbCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIFBhaW50U3VyZmFjZSBwcyA9IGdldFBhaW50U3VyZmFjZSgpOwotCQlwcy5zZXRTdGF0dXNDb29yZChwcy5nZXRDdXJyZW50UG9zaXRpb24oKSk7Ci0JCXBzLmNsZWFyUnViYmVyYmFuZFNlbGVjdGlvbigpOwotCQlwcy5hZGRSdWJiZXJiYW5kU2VsZWN0aW9uKAotCQkJbmV3IFRleHRGaWd1cmUoc2V0dGluZ3MuY29tbW9uRm9yZWdyb3VuZENvbG9yLCBzZXR0aW5ncy5jb21tb25Gb250LAotCQkJCWRyYXdUZXh0LCBldmVudC54LCBldmVudC55KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUxY2UyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFRvb2wgewotCXB1YmxpYyBpbnQgaWQ7Ci0JcHVibGljIFN0cmluZyBuYW1lOwotCXB1YmxpYyBTdHJpbmcgZ3JvdXA7Ci0JcHVibGljIGludCB0eXBlOwotCXB1YmxpYyBSdW5uYWJsZSBhY3Rpb247Ci0JcHVibGljIEltYWdlIGltYWdlID0gbnVsbDsKLQlwdWJsaWMgT2JqZWN0IGRhdGE7Ci0JCi0JcHVibGljIFRvb2woaW50IGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGdyb3VwLCBpbnQgdHlwZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZ3JvdXAgPSBncm91cDsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgVG9vbChpbnQgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZ3JvdXAsIGludCB0eXBlLCBPYmplY3QgZGF0YSkgewotCQl0aGlzKGlkLCBuYW1lLCBncm91cCwgdHlwZSk7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvVG9vbFNldHRpbmdzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Ub29sU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5YmVkYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9Ub29sU2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBUb29sIFNldHRpbmdzIG9iamVjdHMgZ3JvdXAgdG9vbC1yZWxhdGVkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sU2V0dGluZ3MgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZ0Tm9uZSA9IDAsIGZ0T3V0bGluZSA9IDEsIGZ0U29saWQgPSAyOwotCi0JLyoqCi0JICogY29tbW9uRm9yZWdyb3VuZENvbG9yOiBjdXJyZW50IHRvb2wgZm9yZWdyb3VuZCBjb2xvdXIKLQkgKi8KLQlwdWJsaWMgQ29sb3IgY29tbW9uRm9yZWdyb3VuZENvbG9yOwotCi0JLyoqCi0JICogY29tbW9uQmFja2dyb3VuZENvbG9yOiBjdXJyZW50IHRvb2wgYmFja2dyb3VuZCBjb2xvdXIKLQkgKi8KLQlwdWJsaWMgQ29sb3IgY29tbW9uQmFja2dyb3VuZENvbG9yOwotCi0JLyoqCi0JICogY29tbW9uRm9udDogY3VycmVudCBmb250Ci0JICovCi0JcHVibGljIEZvbnQgY29tbW9uRm9udDsKLQotCS8qKgotCSAqIGNvbW1vbkZpbGxUeXBlOiBjdXJyZW50IGZpbGwgdHlwZQotCSAqIDxwPk9uZSBvZiBmdE5vbmUsIGZ0T3V0bGluZSwgZnRTb2xpZC48L3A+Ci0JICovCi0JcHVibGljIGludCBjb21tb25GaWxsVHlwZSA9IGZ0Tm9uZTsKLQotCS8qKgotCSAqIGNvbW1vbkxpbmVTdHlsZTogY3VycmVudCBsaW5lIHR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGNvbW1vbkxpbmVTdHlsZSA9IFNXVC5MSU5FX1NPTElEOwotCQotCS8qKgotCSAqIGFpcmJydXNoUmFkaXVzOiBjb3ZlcmFnZSByYWRpdXMgaW4gcGl4ZWxzCi0JICovCi0JcHVibGljIGludCBhaXJicnVzaFJhZGl1cyA9IDEwOwotCQotCS8qKgotCSAqIGFpcmJydXNoSW50ZW5zaXR5OiBhdmVyYWdlIHN1cmZhY2UgYXJlYSBjb3ZlcmFnZSBpbiByZWdpb24gZGVmaW5lZCBieSByYWRpdXMgcGVyICJqb3QiCi0JICovCi0JcHVibGljIGludCBhaXJicnVzaEludGVuc2l0eSA9IDMwOwotCQotCS8qKgotCSAqIHJvdW5kZWRSZWN0YW5nbGVDb3JuZXJEaWFtZXRlcjogdGhlIGRpYW1ldGVyIG9mIGN1cnZhdHVyZSBvZiBjb3JuZXJzIGluIGEgcm91bmRlZCByZWN0YW5nbGUKLQkgKi8KLQlwdWJsaWMgaW50IHJvdW5kZWRSZWN0YW5nbGVDb3JuZXJEaWFtZXRlciA9IDE2OwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9ub25lLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfbm9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmRkNTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvZmlsbF9ub25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfb3V0bGluZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX291dGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmNjZmVlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfb3V0bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9maWxsX3NvbGlkLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfc29saWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjM0ZTY0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2ZpbGxfc29saWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2Rhc2guZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX2Rhc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjU3YmIzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoZG90LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kYXNoZG90LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyOTY4Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZGFzaGRvdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9saW5lc3R5bGVfZG90LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kb3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTM3Y2NiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9kb3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX3NvbGlkLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L2xpbmVzdHlsZV9zb2xpZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTU3Y2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvbGluZXN0eWxlX3NvbGlkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L29wdGlvbnNfZm9udC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9vcHRpb25zX2ZvbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjVmZTA4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L29wdGlvbnNfZm9udC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2FpcmJydXNoLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfYWlyYnJ1c2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzEwZWRkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfYWlyYnJ1c2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9lbGxpcHNlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfZWxsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjE0MmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9lbGxpcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfbGluZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX2xpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmY4MTlmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BlbmNpbC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BlbmNpbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmEyMzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wZW5jaWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9wb2x5bGluZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BvbHlsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzODRlOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3BvbHlsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcmVjdGFuZ2xlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfcmVjdGFuZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2ZGQ1OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JlY3RhbmdsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JvdW5kZWRyZWN0YW5nbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF9yb3VuZGVkcmVjdGFuZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NDVkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC90b29sX3JvdW5kZWRyZWN0YW5nbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF90ZXh0LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L3Rvb2xfdGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzQ1N2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvdG9vbF90ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvSW1hZ2VzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL0ltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzc1NTM2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnRleHRlZGl0b3I7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VzIHsKLQotCS8vIEJpdG1hcCBJbWFnZXMKLQlwdWJsaWMgSW1hZ2UgQm9sZDsKLQlwdWJsaWMgSW1hZ2UgSXRhbGljOwotCXB1YmxpYyBJbWFnZSBVbmRlcmxpbmU7Ci0JcHVibGljIEltYWdlIFN0cmlrZW91dDsKLQlwdWJsaWMgSW1hZ2UgUmVkOwotCXB1YmxpYyBJbWFnZSBHcmVlbjsKLQlwdWJsaWMgSW1hZ2UgQmx1ZTsKLQlwdWJsaWMgSW1hZ2UgRXJhc2U7Ci0JCi0JSW1hZ2UgIFtdIEFsbEJpdG1hcHM7Ci0KLUltYWdlcyAoKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIGZyZWVBbGwgKCkgewotCWZvciAoaW50IGk9MDsgaTxBbGxCaXRtYXBzLmxlbmd0aDsgaSsrKSBBbGxCaXRtYXBzIFtpXS5kaXNwb3NlICgpOwotCUFsbEJpdG1hcHMgPSBudWxsOwotfQotCi1JbWFnZSBjcmVhdGVCaXRtYXBJbWFnZShEaXNwbGF5IGRpc3BsYXksIFN0cmluZyBmaWxlTmFtZSkgewotCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSA9IEltYWdlcy5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChmaWxlTmFtZSArICIuYm1wIik7Ci0JSW5wdXRTdHJlYW0gbWFza1N0cmVhbSA9IEltYWdlcy5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtIChmaWxlTmFtZSArICJfbWFzay5ibXAiKTsKLQlJbWFnZURhdGEgc291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlU3RyZWFtKTsKLQlJbWFnZURhdGEgbWFzayA9IG5ldyBJbWFnZURhdGEgKG1hc2tTdHJlYW0pOwotCUltYWdlIHJlc3VsdCA9IG5ldyBJbWFnZSAoZGlzcGxheSwgc291cmNlLCBtYXNrKTsKLQl0cnkgewotCQlzb3VyY2VTdHJlYW0uY2xvc2UgKCk7Ci0JCW1hc2tTdHJlYW0uY2xvc2UgKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSAoKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotcHVibGljIHZvaWQgbG9hZEFsbCAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JLy8gQml0bWFwIEltYWdlcwotCUJvbGQgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgImJvbGQiKTsKLQlJdGFsaWMgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgIml0YWxpYyIpOwotCVVuZGVybGluZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAidW5kZXJsaW5lIik7Ci0JU3RyaWtlb3V0ID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJzdHJpa2VvdXQiKTsKLQlSZWQgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgInJlZCIpOwotCUdyZWVuID0gY3JlYXRlQml0bWFwSW1hZ2UgKGRpc3BsYXksICJncmVlbiIpOwotCUJsdWUgPSBjcmVhdGVCaXRtYXBJbWFnZSAoZGlzcGxheSwgImJsdWUiKTsKLQlFcmFzZSA9IGNyZWF0ZUJpdG1hcEltYWdlIChkaXNwbGF5LCAiZXJhc2UiKTsKLQkKLQlBbGxCaXRtYXBzID0gbmV3IEltYWdlIFtdIHsKLQkJQm9sZCwKLQkJSXRhbGljLAotCQlVbmRlcmxpbmUsCi0JCVN0cmlrZW91dCwKLQkJUmVkLAotCQlHcmVlbiwKLQkJQmx1ZSwKLQkJRXJhc2UsCi0JfTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvVGV4dEVkaXRvci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9UZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4OWFjYzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9UZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy50ZXh0ZWRpdG9yOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFRleHRFZGl0b3IgeyAgCi0JU2hlbGwgc2hlbGw7Ci0JVG9vbEJhciB0b29sQmFyOwotCVN0eWxlZFRleHQgdGV4dDsKLQotCUltYWdlcyBpbWFnZXMgPSBuZXcgSW1hZ2VzKCk7Ci0JVmVjdG9yIGNhY2hlZFN0eWxlcyA9IG5ldyBWZWN0b3IoKTsKLQlDb2xvciBSRUQgPSBudWxsOyAKLQlDb2xvciBCTFVFID0gbnVsbDsgCi0JQ29sb3IgR1JFRU4gPSBudWxsOyAKLQlGb250IGZvbnQgPSBudWxsOwotCVRvb2xJdGVtIGJvbGRCdXR0b24sIGl0YWxpY0J1dHRvbiwgdW5kZXJsaW5lQnV0dG9uLCBzdHJpa2VvdXRCdXR0b247Ci0JCi0Jc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlcyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZXhhbXBsZXNfdGV4dGVkaXRvciIpOwotCi1NZW51IGNyZWF0ZUVkaXRNZW51KCkgewotCU1lbnUgYmFyID0gc2hlbGwuZ2V0TWVudUJhciAoKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoYmFyKTsKLQkKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJDdXRfbWVudWl0ZW0iKSk7Ci0JaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuTU9EMSArICdYJyk7Ci0JaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZUN1dENvcHkoKTsKLQkJCXRleHQuY3V0KCk7Ci0JCX0KLQl9KTsKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJDb3B5X21lbnVpdGVtIikpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQycpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQloYW5kbGVDdXRDb3B5KCk7Ci0JCQl0ZXh0LmNvcHkoKTsKLQkJfQotCX0pOwotCWl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKHJlc291cmNlcy5nZXRTdHJpbmcoIlBhc3RlX21lbnVpdGVtIikpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnVicpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl0ZXh0LnBhc3RlKCk7Ci0JCX0KLQl9KTsKLQluZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwkKLQlpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJGb250X21lbnVpdGVtIikpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlzZXRGb250KCk7Ci0JCX0KLQl9KTsKLQlyZXR1cm4gbWVudTsKLX0KLQotTWVudSBjcmVhdGVGaWxlTWVudSgpIHsKLQlNZW51IGJhciA9IHNoZWxsLmdldE1lbnVCYXIgKCk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKGJhcik7Ci0JCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRXhpdF9tZW51aXRlbSIpKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJc2hlbGwuY2xvc2UgKCk7Ci0JCX0KLQl9KTsKLQotCXJldHVybiBtZW51OwotfQotCi0vKgotICogU2V0IGEgc3R5bGUKLSAqLwotdm9pZCBzZXRTdHlsZShXaWRnZXQgd2lkZ2V0KSB7Ci0JUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCWlmICgoc2VsID09IG51bGwpIHx8IChzZWwueSA9PSAwKSkgcmV0dXJuOwotCVN0eWxlUmFuZ2Ugc3R5bGU7Ci0JZm9yIChpbnQgaSA9IHNlbC54OyBpPHNlbC54K3NlbC55OyBpKyspIHsKLQkJU3R5bGVSYW5nZSByYW5nZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQlpZiAocmFuZ2UgIT0gbnVsbCkgewotCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSlyYW5nZS5jbG9uZSgpOwotCQkJc3R5bGUuc3RhcnQgPSBpOwotCQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJfSBlbHNlIHsKLQkJCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoaSwgMSwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JCX0KLQkJaWYgKHdpZGdldCA9PSBib2xkQnV0dG9uKSB7Ci0JCQlzdHlsZS5mb250U3R5bGUgXj0gU1dULkJPTEQ7Ci0JCX0gZWxzZSBpZiAod2lkZ2V0ID09IGl0YWxpY0J1dHRvbikgewotCQkJc3R5bGUuZm9udFN0eWxlIF49IFNXVC5JVEFMSUM7CQkJCQkJCi0JCX0gZWxzZSBpZiAod2lkZ2V0ID09IHVuZGVybGluZUJ1dHRvbikgewotCQkJc3R5bGUudW5kZXJsaW5lID0gIXN0eWxlLnVuZGVybGluZTsKLQkJfSBlbHNlIGlmICh3aWRnZXQgPT0gc3RyaWtlb3V0QnV0dG9uKSB7Ci0JCQlzdHlsZS5zdHJpa2VvdXQgPSAhc3R5bGUuc3RyaWtlb3V0OwotCQl9Ci0JCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JfQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsLnggKyBzZWwueSwgMCk7CQkJCi19Ci0KLS8qCi0gKiBDbGVhciBhbGwgc3R5bGUgZGF0YSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0gKi8KLXZvaWQgY2xlYXIoKSB7Ci0JUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpOwotCWlmIChzZWwueSAhPSAwKSB7Ci0JCVN0eWxlUmFuZ2Ugc3R5bGU7Ci0JCXN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uoc2VsLngsIHNlbC55LCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsKLX0KLS8qCi0gKiBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotICovCi12b2lkIGZnQ29sb3IoQ29sb3IgZmcpIHsKLQlQb2ludCBzZWwgPSB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JaWYgKChzZWwgPT0gbnVsbCkgfHwgKHNlbC55ID09IDApKSByZXR1cm47Ci0JU3R5bGVSYW5nZSBzdHlsZSwgcmFuZ2U7Ci0JZm9yIChpbnQgaSA9IHNlbC54OyBpPHNlbC54K3NlbC55OyBpKyspIHsKLQkJcmFuZ2UgPSB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldChpKTsKLQkJaWYgKHJhbmdlICE9IG51bGwpIHsKLQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpcmFuZ2UuY2xvbmUoKTsKLQkJCXN0eWxlLnN0YXJ0ID0gaTsKLQkJCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCQlzdHlsZS5mb3JlZ3JvdW5kID0gZmc7Ci0JCX0gZWxzZSB7Ci0JCQlzdHlsZSA9IG5ldyBTdHlsZVJhbmdlIChpLCAxLCBmZywgbnVsbCwgU1dULk5PUk1BTCk7Ci0JCX0KLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWwueCArIHNlbC55LCAwKTsKLX0KLXZvaWQgY3JlYXRlTWVudUJhciAoKSB7Ci0JTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIgKGJhcik7Ci0KLQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZmlsZUl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRmlsZV9tZW51aXRlbSIpKTsKLQlmaWxlSXRlbS5zZXRNZW51IChjcmVhdGVGaWxlTWVudSAoKSk7Ci0KLQlNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZWRpdEl0ZW0uc2V0VGV4dCAocmVzb3VyY2VzLmdldFN0cmluZygiRWRpdF9tZW51aXRlbSIpKTsKLQllZGl0SXRlbS5zZXRNZW51IChjcmVhdGVFZGl0TWVudSAoKSk7Ci19Ci0KLXZvaWQgY3JlYXRlU2hlbGwgKERpc3BsYXkgZGlzcGxheSkgewotCXNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0IChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJXaW5kb3dfdGl0bGUiKSk7CQotCWltYWdlcy5sb2FkQWxsIChkaXNwbGF5KTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCXNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lciAobmV3IERpc3Bvc2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkIChEaXNwb3NlRXZlbnQgZSkgewotCQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCQlpbWFnZXMuZnJlZUFsbCAoKTsKLQkJCVJFRC5kaXNwb3NlKCk7Ci0JCQlHUkVFTi5kaXNwb3NlKCk7Ci0JCQlCTFVFLmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotfQotdm9pZCBjcmVhdGVTdHlsZWRUZXh0KCkgewotCWluaXRpYWxpemVDb2xvcnMoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0Jc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCXRleHQuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQl0ZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBlKSB7Ci0JCQloYW5kbGVFeHRlbmRlZE1vZGlmeShlKTsKLQkJfQotCX0pOwotfQotCi12b2lkIGNyZWF0ZVRvb2xCYXIoKSB7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JU2VsZWN0aW9uQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJc2V0U3R5bGUgKGV2ZW50LndpZGdldCk7Ci0JCX0KLQl9OwotCWJvbGRCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQlib2xkQnV0dG9uLnNldEltYWdlKGltYWdlcy5Cb2xkKTsKLQlib2xkQnV0dG9uLnNldFRvb2xUaXBUZXh0KHJlc291cmNlcy5nZXRTdHJpbmcoIkJvbGQiKSk7Ci0JYm9sZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JaXRhbGljQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5DSEVDSyk7Ci0JaXRhbGljQnV0dG9uLnNldEltYWdlKGltYWdlcy5JdGFsaWMpOwotCWl0YWxpY0J1dHRvbi5zZXRUb29sVGlwVGV4dChyZXNvdXJjZXMuZ2V0U3RyaW5nKCJJdGFsaWMiKSk7Ci0JaXRhbGljQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl1bmRlcmxpbmVCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULkNIRUNLKTsKLQl1bmRlcmxpbmVCdXR0b24uc2V0SW1hZ2UoaW1hZ2VzLlVuZGVybGluZSk7Ci0JdW5kZXJsaW5lQnV0dG9uLnNldFRvb2xUaXBUZXh0KHJlc291cmNlcy5nZXRTdHJpbmcoIlVuZGVybGluZSIpKTsKLQl1bmRlcmxpbmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXN0cmlrZW91dEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuQ0hFQ0spOwotCXN0cmlrZW91dEJ1dHRvbi5zZXRJbWFnZShpbWFnZXMuU3RyaWtlb3V0KTsKLQlzdHJpa2VvdXRCdXR0b24uc2V0VG9vbFRpcFRleHQocmVzb3VyY2VzLmdldFN0cmluZygiU3RyaWtlb3V0IikpOwotCXN0cmlrZW91dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuUmVkKTsKLQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJZmdDb2xvcihSRUQpOwotCQl9Ci0JfSk7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuR3JlZW4pOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlmZ0NvbG9yKEdSRUVOKTsKLQkJfQotCX0pOwotCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCWl0ZW0uc2V0SW1hZ2UoaW1hZ2VzLkJsdWUpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlmZ0NvbG9yKEJMVUUpOwotCQl9Ci0JfSk7CQotCWl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlNFUEFSQVRPUik7Ci0JaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXMuRXJhc2UpOwotCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQljbGVhcigpOwotCQl9Ci0JfSk7Ci19Ci0vKgotICogQ2FjaGUgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZvciB0ZXh0IHRoYXQgaGFzIGJlZW4gY3V0IG9yIGNvcGllZC4KLSAqLwotdm9pZCBoYW5kbGVDdXRDb3B5KCkgewotCS8vIFNhdmUgdGhlIGN1dC9jb3BpZWQgc3R5bGUgaW5mbyBzbyB0aGF0IGR1cmluZyBwYXN0ZSB3ZSB3aWxsIG1haW50YWluCi0JLy8gdGhlIHN0eWxlIGluZm9ybWF0aW9uLiAgQ3V0L2NvcGllZCB0ZXh0IGlzIHB1dCBpbiB0aGUgY2xpcGJvYXJkIGluCi0JLy8gUlRGIGZvcm1hdCwgYnV0IGlzIG5vdCBwYXN0ZWQgaW4gUlRGIGZvcm1hdC4gIFRoZSBvdGhlciB3YXkgdG8gCi0JLy8gaGFuZGxlIHRoZSBwYXN0aW5nIG9mIHN0eWxlcyB3b3VsZCBiZSB0byBhY2Nlc3MgdGhlIENsaXBib2FyZCBkaXJlY3RseSBhbmQgCi0JLy8gcGFyc2UgdGhlIFJURiB0ZXh0LgotCWNhY2hlZFN0eWxlcyA9IG5ldyBWZWN0b3IoKTsKLQlQb2ludCBzZWwgPSB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JaW50IHN0YXJ0WCA9IHNlbC54OwotCWZvciAoaW50IGk9c2VsLng7IGk8PXNlbC54K3NlbC55LTE7IGkrKykgewotCQlTdHlsZVJhbmdlIHN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlzdHlsZS5zdGFydCA9IHN0eWxlLnN0YXJ0IC0gc3RhcnRYOwotCQkJaWYgKCFjYWNoZWRTdHlsZXMuaXNFbXB0eSgpKSB7Ci0JCQkJU3R5bGVSYW5nZSBsYXN0U3R5bGUgPSAoU3R5bGVSYW5nZSljYWNoZWRTdHlsZXMubGFzdEVsZW1lbnQoKTsKLQkJCQlpZiAobGFzdFN0eWxlLnNpbWlsYXJUbyhzdHlsZSkgJiYgbGFzdFN0eWxlLnN0YXJ0ICsgbGFzdFN0eWxlLmxlbmd0aCA9PSBzdHlsZS5zdGFydCkgewotCQkJCQlsYXN0U3R5bGUubGVuZ3RoKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2FjaGVkU3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY2FjaGVkU3R5bGVzLmFkZEVsZW1lbnQoc3R5bGUpOwotCQkJfQotCQl9Ci0JfQotfQotdm9pZCBoYW5kbGVFeHRlbmRlZE1vZGlmeShFeHRlbmRlZE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JaWYgKGV2ZW50Lmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JU3R5bGVSYW5nZSBzdHlsZTsKLQlpZiAoZXZlbnQubGVuZ3RoID09IDEgfHwgdGV4dC5nZXRUZXh0UmFuZ2UoZXZlbnQuc3RhcnQsIGV2ZW50Lmxlbmd0aCkuZXF1YWxzKHRleHQuZ2V0TGluZURlbGltaXRlcigpKSkgewotCQkvLyBIYXZlIHRoZSBuZXcgdGV4dCB0YWtlIG9uIHRoZSBzdHlsZSBvZiB0aGUgdGV4dCB0byBpdHMgcmlnaHQgKGR1cmluZwotCQkvLyB0eXBpbmcpIGlmIG5vIHN0eWxlIGluZm9ybWF0aW9uIGlzIGFjdGl2ZS4KLQkJaW50IGNhcmV0T2Zmc2V0ID0gdGV4dC5nZXRDYXJldE9mZnNldCgpOwotCQlzdHlsZSA9IG51bGw7Ci0JCWlmIChjYXJldE9mZnNldCA8IHRleHQuZ2V0Q2hhckNvdW50KCkpIHN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoY2FyZXRPZmZzZXQpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJc3R5bGUgPSAoU3R5bGVSYW5nZSkgc3R5bGUuY2xvbmUgKCk7Ci0JCQlzdHlsZS5zdGFydCA9IGV2ZW50LnN0YXJ0OwotCQkJc3R5bGUubGVuZ3RoID0gZXZlbnQubGVuZ3RoOwotCQl9IGVsc2UgewotCQkJc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShldmVudC5zdGFydCwgZXZlbnQubGVuZ3RoLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKTsKLQkJfQkJCi0JCWlmIChib2xkQnV0dG9uLmdldFNlbGVjdGlvbigpKSBzdHlsZS5mb250U3R5bGUgfD0gU1dULkJPTEQ7Ci0JCWlmIChpdGFsaWNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHN0eWxlLmZvbnRTdHlsZSB8PSBTV1QuSVRBTElDOwotCQlzdHlsZS51bmRlcmxpbmUgPSB1bmRlcmxpbmVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCXN0eWxlLnN0cmlrZW91dCA9IHN0cmlrZW91dEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzdHlsZS5pc1Vuc3R5bGVkKCkpIHRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JfSBlbHNlIHsKLQkJLy8gcGFzdGUgb2NjdXJyaW5nLCBoYXZlIHRleHQgdGFrZSBvbiB0aGUgc3R5bGVzIGl0IGhhZCB3aGVuIGl0IHdhcwotCQkvLyBjdXQvY29waWVkCi0JCWZvciAoaW50IGk9MDsgaTxjYWNoZWRTdHlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXN0eWxlID0gKFN0eWxlUmFuZ2UpY2FjaGVkU3R5bGVzLmVsZW1lbnRBdChpKTsKLQkJCVN0eWxlUmFuZ2UgbmV3U3R5bGUgPSAoU3R5bGVSYW5nZSlzdHlsZS5jbG9uZSgpOwotCQkJbmV3U3R5bGUuc3RhcnQgPSBzdHlsZS5zdGFydCArIGV2ZW50LnN0YXJ0OwotCQkJdGV4dC5zZXRTdHlsZVJhbmdlKG5ld1N0eWxlKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JVGV4dEVkaXRvciBleGFtcGxlID0gbmV3IFRleHRFZGl0b3IgKCk7Ci0JU2hlbGwgc2hlbGwgPSBleGFtcGxlLm9wZW4gKGRpc3BsYXkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQljcmVhdGVTaGVsbCAoZGlzcGxheSk7Ci0JY3JlYXRlTWVudUJhciAoKTsKLQljcmVhdGVUb29sQmFyICgpOwotCWNyZWF0ZVN0eWxlZFRleHQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlyZXR1cm4gc2hlbGw7Ci19Ci0KLXZvaWQgc2V0Rm9udCgpIHsKLQlGb250RGlhbG9nIGZvbnREaWFsb2cgPSBuZXcgRm9udERpYWxvZyhzaGVsbCk7Ci0JZm9udERpYWxvZy5zZXRGb250TGlzdCgodGV4dC5nZXRGb250KCkpLmdldEZvbnREYXRhKCkpOwotCUZvbnREYXRhIGZvbnREYXRhID0gZm9udERpYWxvZy5vcGVuKCk7Ci0JaWYgKGZvbnREYXRhICE9IG51bGwpIHsKLQkJRm9udCBuZXdGb250ID0gbmV3IEZvbnQoc2hlbGwuZ2V0RGlzcGxheSgpLCBmb250RGF0YSk7IAotCQl0ZXh0LnNldEZvbnQobmV3Rm9udCk7Ci0JCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQlmb250ID0gbmV3Rm9udDsKLQl9Ci19Ci0KLXZvaWQgaW5pdGlhbGl6ZUNvbG9ycygpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQlSRUQgPSBuZXcgQ29sb3IgKGRpc3BsYXksIG5ldyBSR0IoMjU1LDAsMCkpOwotCUJMVUUgPSBuZXcgQ29sb3IgKGRpc3BsYXksIG5ldyBSR0IoMCwwLDI1NSkpOwotCUdSRUVOID0gbmV3IENvbG9yIChkaXNwbGF5LCBuZXcgUkdCKDAsMjU1LDApKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYmx1ZS5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NGM3YWM5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYmx1ZS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWVfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JsdWVfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZjZTkyNjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ibHVlX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ib2xkLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzMTg0YmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ib2xkLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvYm9sZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzgyNzUxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2JvbGRfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2VyYXNlLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2UuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDJhY2U3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2UuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9lcmFzZV9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZXJhc2VfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2YWIyMWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9lcmFzZV9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvZ3JlZW4uYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjYTAyM2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2dyZWVuX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9ncmVlbl9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNlOTI2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL2dyZWVuX21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWMuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWMuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM2NzIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvaXRhbGljX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWNfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNDc2MmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9pdGFsaWNfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4YzYzYmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci9yZWRfbWFzay5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZF9tYXNrLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNlOTI2NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3JlZF9tYXNrLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkMjk4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy90ZXh0ZWRpdG9yL3N0cmlrZW91dF9tYXNrLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0X21hc2suYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzlhYjMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3Ivc3RyaWtlb3V0X21hc2suYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmUuYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmUuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNhY2ZkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3RleHRlZGl0b3IvdW5kZXJsaW5lX21hc2suYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmVfbWFzay5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWRlOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvdGV4dGVkaXRvci91bmRlcmxpbmVfbWFzay5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjMxNmI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY5OGQxOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGdsZXhhbXBsZXMuamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIHNyYy8KLSAgICAgICAgICAgICAgIAotc291cmNlLmdsZXhhbXBsZXMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzY2U2NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uT3BlbkdMRXhhbXBsZVNldC5uYW1lID0gU1dUIE9wZW5HTCBFeGFtcGxlcyBQbHVnaW4KLQotbGF1bmNoaXRlbS5PcGVuR0xFeGFtcGxlLm5hbWUgPSBPcGVuR0wgRXhhbXBsZQotbGF1bmNoaXRlbS5PcGVuR0xFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoZSBPcGVuR0wgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIG1hbnkgT3BlbkdMIGZlYXR1cmVzIGluIFwKLQlhbiBTV1QgYXBwbGljYXRpb24uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExODcyNWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzIgotICAgbmFtZT0iJXBsdWdpbi5PcGVuR0xFeGFtcGxlU2V0Lm5hbWUiCi0gICB2ZXJzaW9uPSIwLjUuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0iIj4KLQotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLm9wZW5nbCIgdmVyc2lvbj0iMC41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotPC9yZXF1aXJlcz4KLQotPCEtLSBSdW50aW1lIC0tPgotPHJ1bnRpbWU+Ci0gICA8bGlicmFyeSBuYW1lPSJnbGV4YW1wbGVzLmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgIDwvbGlicmFyeT4KLTwvcnVudGltZT4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uT3BlbkdMRXhhbXBsZS5uYW1lIgotICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLk9wZW5HTEV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFN0YW5kYWxvbmVDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLk9wZW5HTEV4YW1wbGUuc3RhbmRhbG9uZWxhdW5jaGVyIj4KLSAgICAgIDxwcm9ncmFtCi0gICAgICAgICAgICBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcyIKLSAgICAgICAgICAgIG1haW5DbGFzcz0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy5PcGVuR0xFeGFtcGxlIj4KLSAgICAgIDwvcHJvZ3JhbT4KLSAgIDwvaXRlbT4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9leGFtcGxlc19vcGVuZ2wucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX29wZW5nbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTI3MTMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL2V4YW1wbGVzX29wZW5nbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi13aW5kb3cudGl0bGUgPSBTV1QgT3BlbkdMIEV4YW1wbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQW50aWFsaWFzaW5nVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FudGlhbGlhc2luZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZhY2I5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQW50aWFsaWFzaW5nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBBbnRpYWxpYXNpbmdUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgQnV0dG9uIGFudGlBbGlhc0J1dHRvbjsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC02LjBmOwotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDExOwotCQkJfQotCQl9KTsKLQotCQlhbnRpQWxpYXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJYW50aUFsaWFzQnV0dG9uLnNldFRleHQoIkFudGktQWxpYXNpbmciKTsKLQkJYW50aUFsaWFzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYW50aUFsaWFzQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoYW50aUFsaWFzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUdMLmdsRW5hYmxlKEdMLkdMX0xJTkVfU01PT1RIKTsKLQkJCQl9IGVsc2UgewotCQkJCQlHTC5nbERpc2FibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGNvbG9yR3JvdXAgPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbG9yR3JvdXAuc2V0VGV4dCgiRm9yZWdyb3VuZCBjb2xvciIpOwotCQljb2xvckdyb3VwLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCUdMLmdsQ29sb3IzdWIoKGJ5dGUpIHJnYi5yZWQsIChieXRlKSByZ2IuZ3JlZW4sIChieXRlKSByZ2IuYmx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTC5nbERlbGV0ZUxpc3RzKDEsIDEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkFudGktYWxpYXNpbmciOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCWZpbmFsIGZsb2F0W10gQkVaSUVSX1BPSU5UUyA9IHsKLQkJCS0xLjVmLCAtMS41ZiwgNC4wZiwgLTAuNWYsIC0xLjVmLCAyLjBmLCAwLjVmLCAtMS41ZiwKLQkJCS0xLjBmLCAxLjVmLCAtMS41ZiwgMi4wZiwgLTEuNWYsIC0wLjVmLCAxLjBmLCAtMC41ZiwKLQkJCS0wLjVmLCAzLjBmLCAwLjVmLCAtMC41ZiwgMC4wZiwgMS41ZiwgLTAuNWYsIC0xLjBmLAotCQkJLTEuNWYsIDAuNWYsIDQuMGYsIC0wLjVmLCAwLjVmLCAwLjBmLCAwLjVmLCAwLjVmLAotCQkJMy4wZiwgMS41ZiwgMC41ZiwgNC4wZiwgLTEuNWYsIDEuNWYsIC0yLjBmLCAtMC41ZiwKLQkJCTEuNWYsIC0yLjBmLCAwLjVmLCAxLjVmLCAwLjBmLCAxLjVmLCAxLjVmLCAtMS4wZiwKLQkJfTsKLQkJR0wuZ2xIaW50KEdMLkdMX0xJTkVfU01PT1RIX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCUdMLmdsTWFwMmYoR0wuR0xfTUFQMl9WRVJURVhfMywgMCwgMSwgMywgNCwgMCwgMSwgMTIsIDQsIEJFWklFUl9QT0lOVFMpOwotCQlHTC5nbE1hcEdyaWQyZigzMCwgMC4wZiwgMS4wZiwgMzAsIDAuMGYsIDEuMGYpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0FVVE9fTk9STUFMKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NUSVBQTEUpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9CTEVORCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX01BUDJfVkVSVEVYXzMpOwotCi0JCS8vIGNyZWF0ZSBkaXNwbGF5IGxpc3RzCi0JCUdMLmdsTmV3TGlzdCgxLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xFdmFsTWVzaDIoR0wuR0xfTElORSwgMCwgMzAsIDAsIDMwKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xDYWxsTGlzdCgxKTsJLy8gZHJhdyB0aGUgYmVpemVyIHN1cmZhY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FyZWFUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQXJlYVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVlZTcyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQXJlYVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgQXJlYVRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JYWJzdHJhY3QgY2xhc3MgU2hhcGUgewotCQlhYnN0cmFjdCB2b2lkIGRyYXcoKTsKLQl9Ci0JY2xhc3MgU3RhdGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGludCBpbmRleDsKLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHN0YXRlCi0JCSAqIEBwYXJhbSBpbmRleCB0aGUgZGlzcGxheSBsaXN0IGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzdGF0ZQotCQkgKi8KLQkJU3RhdGUgKFN0cmluZyBuYW1lLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXZvaWQgZGlzcGxheSgpIHsKLQkJCUdMLmdsQ2FsbExpc3QoaW5kZXgpOwotCQl9Ci0JCXZvaWQgZGlzcG9zZSgpIHsKLQkJCUdMLmdsRGVsZXRlTGlzdHMoaW5kZXgsIDEpOwotCQl9Ci0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0YXRlW10gc3RhdGVzOwotCXByaXZhdGUgU3RhdGUgY3VycmVudFN0YXRlOwotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAuMGYsIHlQb3MgPSAwLjBmLCB6UG9zID0gLTMwLjBmOwotCXByaXZhdGUgZmxvYXQgeFJvdCA9IDkwLjBmLCB5Um90ID0gMC4wZiwgelJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljLCBkaXNrOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDIyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDIyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDIyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA0MDsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgcm90YXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcm90YXRpb25Hcm91cC5zZXRUZXh0KCJSb3RhdGlvbiIpOwotCQlyb3RhdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl4Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJeFJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJeFJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXhSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJeFJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl4Um90YXRpb24uc2V0U2VsZWN0aW9uKDkwKTsKLQkJeFJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4Um90ID0geFJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeVJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXlSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXlSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl5Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXlSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeVJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJeVJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5Um90ID0geVJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJelJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXpSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXpSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl6Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXpSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJelJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJelJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6Um90ID0gelJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgb3B0aW9uc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQluZXcgTGFiZWwob3B0aW9uc0dyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2hhcGU6Iik7Ci0KLQkJZmluYWwgQ29tYm8gc3RhdGVzQ29tYm8gPSBuZXcgQ29tYm8ob3B0aW9uc0dyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXN0YXRlc0NvbWJvLmFkZChzdGF0ZXNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCQlzdGF0ZXNDb21iby5zZWxlY3QoMCk7Ci0JCXN0YXRlc0NvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdXJyZW50U3RhdGUgPSBzdGF0ZXNbc3RhdGVzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIEJ1dHRvbiBsaWdodHNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJbGlnaHRzQnV0dG9uLnNldFRleHQoIkxpZ2h0cyIpOwotCQlsaWdodHNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlsaWdodHNCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChsaWdodHNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUdMLmdsRGlzYWJsZShHTC5HTF9MSUdIVElORyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMocXVhZHJhdGljKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMoZGlzayk7Ci0JCWlmIChzdGF0ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzdGF0ZXMgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBsb2dpY2FsIEFORCBvZiB0d28gc2hhcGVzLgotCSAqCi0JICogQHBhcmFtIGEgc2hhcGUgQQotCSAqIEBwYXJhbSBiIHNoYXBlIEIKLQkgKi8KLQl2b2lkIGRyYXdBYW5kQihTaGFwZSBhLCBTaGFwZSBiKSB7Ci0JCS8vIGRyYXcgcGFydHMgb2YgQiB0aGF0IGFyZSBpbnNpZGUgQQotCQlkcmF3QWluc2lkZUIoYSwgYiwgR0wuR0xfQkFDSywgR0wuR0xfTk9URVFVQUwpOwotCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUgZm9sbG93aW5nIHRvIHNob3cgdXAKLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkvLyB0dXJuIG9uIGRlcHRoIHRlc3RpbmcKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0FMV0FZUyk7Ci0JCS8vIHJlbmRlciB0aGUgZnJvbnQgZmFjZSBvZiBCCi0JCWIuZHJhdygpOwotCQkvLyByZXNldCB0aGUgZGVwdGggZnVuY3Rpb24KLQkJR0wuZ2xEZXB0aEZ1bmMoR0wuR0xfTEVTUyk7Ci0JCS8vIGRyYXcgcGFydHMgb2YgQSB0aGF0IGFyZSBpbnNpZGUgQgotCQlkcmF3QWluc2lkZUIoYiwgYSwgR0wuR0xfQkFDSywgR0wuR0xfTk9URVFVQUwpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBjb250ZW50cyBvZiBvbmUgc2hhcGUgdGhhdCBhcHBlYXIgd2l0aGluIGFub3RoZXIuCi0JICoKLQkgKiBAcGFyYW0gYSB0aGUgc2hhcGUgdG8gZHJhdwotCSAqIEBwYXJhbSBiIHRoZSBjb25zdHJhaW5pbmcgc2hhcGUKLQkgKiBAcGFyYW0gZmFjZQotCSAqIEBwYXJhbSB0ZXN0Ci0JICovCi0Jdm9pZCBkcmF3QWluc2lkZUIoU2hhcGUgYSwgU2hhcGUgYiwgaW50IGZhY2UsIGludCB0ZXN0KSB7Ci0JCS8vIHR1cm4gb2ZmIHRoZSBjb2xvciBidWZmZXIKLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkvLyBjbGVhciB0aGUgc3RlbmNpbCBidWZmZXIKLQkJR0wuZ2xDbGVhclN0ZW5jaWwoMCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBzZXQgdG8gcHJvcGVyIEN1bGxpbmcKLQkJR0wuZ2xDdWxsRmFjZShmYWNlKTsKLQkJLy8gcmVuZGVyIHNoYXBlIEEKLQkJYS5kcmF3KCk7Ci0JCS8vIHNldCBkZXB0aCBtYXNrCi0JCUdMLmdsRGVwdGhNYXNrKGZhbHNlKTsKLQkJLy8gZW5hYmxlIHN0ZW5jaWwgdGVzdAotCQlHTC5nbEVuYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0FMV0FZUywgMCwgMCk7Ci0JCS8vIHNldCB0aGUgc3RlbmNpbCBidWZmZXIgdG8gaW5jcmVtZW50IGlmIHRoZSBkZXB0aCB0ZXN0IHBhc3NlcwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9JTkNSKTsKLQkJLy8gdHVybiBvbiBiYWNrIGZhY2UgY3VsbGluZwotCQlHTC5nbEN1bGxGYWNlKEdMLkdMX0JBQ0spOwotCQkvLyByZW5kZXIgQgotCQliLmRyYXcoKTsKLQkJLy8gc2V0IHRoZSBzdGVuY2lsIGJ1ZmZlciB0byBkZWNyZW1lbnQgaWYgdGhlIGRlcHRoIHRlc3QgcGFzc2VzCi0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0RFQ1IpOwotCQkvLyBjdWxsIHRoZSBmcm9udCBmYWNlCi0JCUdMLmdsQ3VsbEZhY2UoR0wuR0xfRlJPTlQpOwotCQkvLyByZW5kZXIgQiBhZ2FpbgotCQliLmRyYXcoKTsKLQkJLy8gc2V0IGRlcHRoIG1hc2sKLQkJR0wuZ2xEZXB0aE1hc2sodHJ1ZSk7Ci0JCUdMLmdsQ29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotCQkvLyBzZXQgdGhlIHN0ZW5jaWwgYnVmZmVyCi0JCUdMLmdsU3RlbmNpbEZ1bmModGVzdCwgMCwgMSk7Ci0JCS8vIHR1cm4gb2ZmIGRlcHRoIHRlc3RpbmcKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBzZXQgdG8gcHJvcGVyIGN1bGxpbmcKLQkJR0wuZ2xDdWxsRmFjZShmYWNlKTsKLQkJLy8gcmVuZGVyIEEKLQkJYS5kcmF3KCk7Ci0JCS8vIGRpc2FibGUgc3RlbmNpbCB0ZXN0Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBsb2dpY2FsIE9SIG9mIHR3byBzaGFwZXMuCi0JICoKLQkgKiBAcGFyYW0gYSBzaGFwZSBBCi0JICogQHBhcmFtIGIgc2hhcGUgQgotCSAqLwotCXZvaWQgZHJhd0FvckIoU2hhcGUgYSwgU2hhcGUgYikgewotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJYS5kcmF3KCk7Ci0JCWIuZHJhdygpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3Mgb25lIHNoYXBlIHN1YnRyYWN0ZWQgZnJvbSBhbm90aGVyLgotCSAqCi0JICogQHBhcmFtIGEgdGhlIGJhc2Ugc2hhcGUKLQkgKiBAcGFyYW0gYiB0aGUgc2hhcGUgdG8gc3VidHJhY3QKLQkgKi8KLQl2b2lkIGRyYXdBc3ViQihTaGFwZSBhLCBTaGFwZSBiKSB7Ci0JCS8vIGRyYXcgYmFjayBwYXJ0cyBvZiBCIGluc2lkZSBBCi0JCWRyYXdBaW5zaWRlQihiLCBhLCBHTC5HTF9GUk9OVCwgR0wuR0xfTk9URVFVQUwpOwotCQkvLyB3ZSBkbyBub3Qgd2FudCB0aGUgZm9sbG93aW5nIHRvIHNob3cgdXAKLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJLy8gY2hhbmdlIHRoZSBkZXB0aCB0ZXN0IHRvIEdMX0FMV0FZUwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9BTFdBWVMpOwotCQkvLyByZW5kZXIgdGhlIGZyb250IGZhY2Ugb2YgQgotCQlhLmRyYXcoKTsKLQkJLy8gcmVzZXQgdGhlIGRlcHRoIGZ1bmN0aW9uCi0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0xFU1MpOwotCQkvLyBkcmF3IGZyb250IHBhcnRzIG9mIEEgb3V0c2lkZSBCCi0JCWRyYXdBaW5zaWRlQihhLCBiLCBHTC5HTF9CQUNLLCBHTC5HTF9FUVVBTCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIHNwZWNpZmVkIHNoYXBlLgotCSAqIAotCSAqIEBwYXJhbSBzaGFwZSB0aGUgc2hhcGUgdG8gZHJhdwotCSAqLwotCXZvaWQgZHJhd1NoYXBlKFNoYXBlIHNoYXBlKSB7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlzaGFwZS5kcmF3KCk7Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJBcmVhIjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlpZiAoIWhhc1N0ZW5jaWxTdXBwb3J0KCkpIHJldHVybjsKLQkJCi0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJZmxvYXRbXSBsaWdodFBvcyA9IHsgMC4wZiwgNS4wZiwgLTEwLjBmLCAxLjBmIH07Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX1BPU0lUSU9OLCBsaWdodFBvcyk7Ci0JCXF1YWRyYXRpYyA9IEdMVS5nbHVOZXdRdWFkcmljKCk7Ci0JCWRpc2sgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQotCQlHTC5nbEVuYWJsZShHTC5HTF9DVUxMX0ZBQ0UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSVNUX01PREUpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVElORyk7Ci0JCUdMLmdsTGlnaHRNb2RlbGkoR0wuR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsIEdMLkdMX1RSVUUpOwotCi0JCWZpbmFsIGZsb2F0W10gc3BoZXJlTWF0ZXJpYWwgPSB7IDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYgfTsKLQkJZmluYWwgZmxvYXRbXSBjeWxpbmRlck1hdGVyaWFsID0geyAxLjBmLCAwLjBmLCAwLjBmLCAxLjBmIH07Ci0KLQkJU2hhcGUgc3BoZXJlID0gbmV3IFNoYXBlKCkgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbE1hdGVyaWFsZnYoCi0JCQkJCUdMLkdMX0ZST05UX0FORF9CQUNLLAotCQkJCQlHTC5HTF9BTUJJRU5UX0FORF9ESUZGVVNFLAotCQkJCQlzcGhlcmVNYXRlcmlhbCk7Ci0JCQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQkJCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAzLCAzMiwgMzIpOwotCQkJfQotCQl9OwotCQlTaGFwZSBjeWxpbmRlciA9IG5ldyBTaGFwZSgpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xNYXRlcmlhbGZ2KAotCQkJCQlHTC5HTF9GUk9OVF9BTkRfQkFDSywKLQkJCQkJR0wuR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwKLQkJCQkJY3lsaW5kZXJNYXRlcmlhbCk7Ci0JCQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkJCUdMVS5nbHVRdWFkcmljT3JpZW50YXRpb24oZGlzaywgR0xVLkdMVV9JTlNJREUpOwotCQkJCUdMLmdsUHVzaE1hdHJpeCgpOwotCQkJCUdMLmdsVHJhbnNsYXRlZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJCQlHTFUuZ2x1RGlzayhkaXNrLCAwLCAzLCAzMiwgMzIpOwotCQkJCUdMVS5nbHVDeWxpbmRlcihxdWFkcmF0aWMsIDMsIDMsIDYsIDMyLCAzMik7Ci0JCQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIDYuMGYpOwotCQkJCUdMVS5nbHVRdWFkcmljT3JpZW50YXRpb24oZGlzaywgR0xVLkdMVV9PVVRTSURFKTsKLQkJCQlHTFUuZ2x1RGlzayhkaXNrLCAwLCAzLCAzMiwgMzIpOwotCQkJCUdMLmdsUG9wTWF0cml4KCk7Ci0JCQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBjcmVhdGUgdGhlIGRpc3BsYXkgbGlzdHMgYW5kIHN0YXRlcwotCQlzdGF0ZXMgPSBuZXcgU3RhdGVbNl07Ci0JCWludCBpbmRleCA9IDE7Ci0JCQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3U2hhcGUoY3lsaW5kZXIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzBdID0gbmV3IFN0YXRlKCJDeWxpbmRlciIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1NoYXBlKHNwaGVyZSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzdGF0ZXNbMV0gPSBuZXcgU3RhdGUoIlNwaGVyZSIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FvckIoY3lsaW5kZXIsIHNwaGVyZSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzdGF0ZXNbMl0gPSBuZXcgU3RhdGUoIkN5bGluZGVyIE9SIFNwaGVyZSIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FhbmRCKGN5bGluZGVyLCBzcGhlcmUpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzNdID0gbmV3IFN0YXRlKCJDeWxpbmRlciBBTkQgU3BoZXJlIixpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3QXN1YkIoY3lsaW5kZXIsIHNwaGVyZSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzdGF0ZXNbNF0gPSBuZXcgU3RhdGUoIkN5bGluZGVyIFNVQiBTcGhlcmUiLGluZGV4KyspOwotCQkKLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FzdWJCKHNwaGVyZSwgY3lsaW5kZXIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzVdID0gbmV3IFN0YXRlKCJTcGhlcmUgU1VCIEN5bGluZGVyIixpbmRleCsrKTsKLQotCQljdXJyZW50U3RhdGUgPSBzdGF0ZXNbMF07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2lzU3RlbmNpbFN1cHBvcnROZWVkZWQKLQkgKi8KLQlib29sZWFuIGlzU3RlbmNpbFN1cHBvcnROZWVkZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKAotCQkJR0wuR0xfQ09MT1JfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfU1RFTkNJTF9CVUZGRVJfQklUKTsKLQotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih4Um90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHlSb3QsIDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoelJvdCwgMC4wZiwgMC4wZiwgMS4wZik7Ci0KLQkJY3VycmVudFN0YXRlLmRpc3BsYXkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0NvbG9yU2VsZWN0aW9uR3JvdXAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQ29sb3JTZWxlY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWRiYjUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvQ29sb3JTZWxlY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBDb2xvclNlbGVjdGlvbkdyb3VwIGltcGxlbWVudHMgTGlzdGVuZXIgewotCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbjsKLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlIHN0eWxlIGJpdHMgdG8gYmUgYXBwbGllZCB0byB0aGUgY29sb3IgZ3JvdXAKLQkgKi8KLQlDb2xvclNlbGVjdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcigpOwotCQlpbml0Q29sb3IocGFyZW50LmdldERpc3BsYXkoKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbG9yR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgc3R5bGUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbG9yR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0vLwkJY29sb3JHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oY29sb3JHcm91cCwgU1dULk5PTkUpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoYnV0dG9uLmdldERpc3BsYXkoKSwgMTIsIDEyKTsKLQkJZHJhd0J1dHRvbkltYWdlKCk7Ci0JCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJYnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpZiAoY29sb3IgIT0gbnVsbCkgY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiQ29sb3IiKTsKLS8vCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0vLwkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLS8vCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGFyZ3VtZW50IHRvIHRoaXMgZ3JvdXAncyBjb2xsZWN0aW9uIG9mCi0JICogY29sb3Igc2VsZWN0aW9uIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIoSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZEVsZW1lbnQobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBEcmF3cyB0aGUgY29sb3JlZCBzcXVhcmUgb24gdGhlIHNlbGVjdGlvbiBidXR0b24uCi0JICovCi0Jdm9pZCBkcmF3QnV0dG9uSW1hZ2UoKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQlnYy5kcmF3UmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCAtIDEsIGJvdW5kcy5oZWlnaHQgLSAxKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQlTaGVsbCBzaGVsbCA9IGJ1dHRvbi5nZXRTaGVsbCgpOwotCQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCk7Ci0JCWNvbG9yRGlhbG9nLnNldFJHQigKLQkJCW5ldyBSR0IoY29sb3IuZ2V0UmVkKCksIGNvbG9yLmdldEdyZWVuKCksIGNvbG9yLmdldEJsdWUoKSkpOwotCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQlpZiAocmdiID09IG51bGwpIHJldHVybjsKLQkJc2V0UkdCKHJnYik7Ci0JCW5vdGlmeUxpc3RlbmVycyhyZ2IpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb2xvciBieSBxdWVyeWluZyBmb3IgdGhlIGN1cnJlbnQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkKLQkgKi8KLQl2b2lkIGluaXRDb2xvcihEaXNwbGF5IGRpc3BsYXkpIHsKLQkJZG91YmxlW10gY3VycmVudENvbG9yID0gbmV3IGRvdWJsZVs0XTsKLQkJR0wuZ2xHZXREb3VibGV2KEdMLkdMX0NVUlJFTlRfQ09MT1IsIGN1cnJlbnRDb2xvcik7Ci0JCVJHQiByZ2IgPQotCQkJbmV3IFJHQigKLQkJCQkoaW50KSBjdXJyZW50Q29sb3JbMF0gKiAyNTUsCi0JCQkJKGludCkgY3VycmVudENvbG9yWzFdICogMjU1LAotCQkJCShpbnQpIGN1cnJlbnRDb2xvclsyXSAqIDI1NSk7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIGFsbCByZWdpc3RlcmVkIGNvbG9yIHNlbGVjdGlvbiBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0Jdm9pZCBub3RpZnlMaXN0ZW5lcnMoUkdCIHJnYikgewotCQlJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcltdIGxpc3RlbmVyc0FyciA9Ci0JCQluZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXJbbGlzdGVuZXJzLnNpemUoKV07Ci0JCWxpc3RlbmVycy5jb3B5SW50byhsaXN0ZW5lcnNBcnIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVyc0Fyci5sZW5ndGg7IGkrKykgewotCQkJbGlzdGVuZXJzQXJyIFtpXS5oYW5kbGVDb2xvclNlbGVjdGlvbihyZ2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgYXJndW1lbnQgZnJvbSB0aGlzIGdyb3VwJ3MgY29sbGVjdGlvbiBvZiBjb2xvciBzZWxlY3Rpb24KLQkgKiBsaXN0ZW5lcnMuICBJZiB0aGUgYXJndW1lbnQgaXMgbm90IGEgcmVnaXN0ZXJlZCBsaXN0ZW5lciB0aGVuIGRvZXMKLQkgKiBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlRWxlbWVudChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwJ3MgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHRleHQgdGhlIG5ldyBsYWJlbCB0ZXh0Ci0JICovCi0Jdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBjb2xvci4KLQkgKiAKLQkgKiBAcGFyYW0gcmdiIHRoZSByZ2Igb2YgdGhlIG5ldyBjb2xvcgotCSAqLwotCXZvaWQgc2V0UkdCKFJHQiByZ2IpIHsKLQkJQ29sb3Igb2xkQ29sb3IgPSBjb2xvcjsKLQkJY29sb3IgPSBuZXcgQ29sb3IoYnV0dG9uLmdldERpc3BsYXkoKSwgcmdiKTsKLQkJZHJhd0J1dHRvbkltYWdlKCk7Ci0JCWJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSBvbGRDb2xvci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9Gb2dUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvRm9nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjBkNTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9Gb2dUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEZvZ1RhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0KLQlwcml2YXRlIGZsb2F0IHJvdFkgPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgeVBvcyA9IDAuMGYsIHhQb3MgPSAwLjBmLCB6UG9zID0gLTE1LjBmOwotCXByaXZhdGUgaW50IGN1YmVMaXN0SW5kZXhCYXNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludFtdIEZPR19UWVBFUyA9IHsgR0wuR0xfTElORUFSLCBHTC5HTF9FWFAsIEdMLkdMX0VYUDIgfTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBGT0dfTkFNRVMgPSB7ICJMSU5FQVIiLCAiR0xfRVhQIiwgIkdMX0VYUDIiIH07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDA7Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeU1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSB5TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgyNCk7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDQpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl6TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHpNb3ZlLmdldFNlbGVjdGlvbigpIC0gMjU7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSBmb2dUeXBlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZm9nVHlwZXNHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZm9nVHlwZXNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQluZXcgTGFiZWwoZm9nVHlwZXNHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIkZvZyBUeXBlczoiKTsKLQkJZmluYWwgQ29tYm8gZm9nVHlwZUNvbWJvID0gbmV3IENvbWJvKGZvZ1R5cGVzR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWZvZ1R5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmb2dUeXBlQ29tYm8uc2V0SXRlbXMoRk9HX05BTUVTKTsKLQkJZm9nVHlwZUNvbWJvLnNlbGVjdCgwKTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiRm9nIERlbnNpdHk6Iik7Ci0JCWZpbmFsIFNsaWRlciBmb2dEZW5zaXR5U2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0TWF4aW11bSgzMik7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRUaHVtYigyKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDUpOwotCQlmb2dEZW5zaXR5U2xpZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZm9nRGVuc2l0eVNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmxvYXQgZm9nRGVuc2l0eSA9ICgoZmxvYXQpZm9nRGVuc2l0eVNsaWRlci5nZXRTZWxlY3Rpb24oKSkgLyAxMDA7Ci0JCQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19ERU5TSVRZLCBmb2dEZW5zaXR5KTsKLQkJCX0KLQkJfSk7Ci0JCWZvZ1R5cGVDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaW50IGN1cnJlbnRTZWxlY3Rpb24gPSBmb2dUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQkvLyBmb2cgdHlwZSBHTC5HTF9MSU5FQVIgZG9lcyBub3QgdXRpbGl6ZSBmb2dEZW5zaXR5LCBidXQgdGhlIG90aGVyIGZvZyB0eXBlcyBkbwotCQkJCWZvZ0RlbnNpdHlTbGlkZXIuc2V0RW5hYmxlZChjdXJyZW50U2VsZWN0aW9uICE9IDApOwotCQkJCUdMLmdsRm9nZihHTC5HTF9GT0dfTU9ERSwgRk9HX1RZUEVTW2N1cnJlbnRTZWxlY3Rpb25dKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGN1YmUgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKi8KLSAJdm9pZCBjcmVhdGVDdWJlKCkgewotCQlHTC5nbE5ld0xpc3QoY3ViZUxpc3RJbmRleEJhc2UsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gZnJvbnQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAtMC41ZiwgMC41Zik7CS8vIGJvdHRvbSBsZWZ0IAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIDAuNWYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIDAuNWYpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIGxlZnQKLQkJLy8gYmFjawotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSBsZWZ0IAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIC0wLjVmKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAtMC41Zik7CS8vIHRvcCByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIDAuNWYsIC0wLjVmKTsJLy8gdG9wIGxlZnQKLQkJLy8gbGVmdAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSBsZWZ0Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgLTAuNWYsIDAuNWYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgLTAuNWYpOwkvLyB0b3AgbGVmdAkKLQkJLy8gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAwLjVmKTsJLy8gYm90dG9tIGxlZnQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgMC41ZiwgLTAuNWYpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIDAuNWYpOwkvLyB0b3AgbGVmdAotCQkvLyB0b3AKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIC0wLjVmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAtMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAwLjVmKTsKLQkJLy8gYm90dG9tCi0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgLTAuNWYsIDAuNWYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAtMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgLTAuNWYpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhjdWJlTGlzdEluZGV4QmFzZSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsJCi0JfQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkZvZyI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCS8vIGZvZyBjb2xvciBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGNsZWFyIGNvbG9yCi0JCS8vIHRvIGxvb2sgYXBwcm9wcmlhdGUKLQkJZmxvYXRbXSBmb2dDb2xvciA9IHsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotCQlHTC5nbEZvZ2Z2KEdMLkdMX0ZPR19DT0xPUiwgZm9nQ29sb3IpOwotCQlHTC5nbEhpbnQoR0wuR0xfRk9HX0hJTlQsIEdMLkdMX0RPTlRfQ0FSRSk7Ci0JCUdMLmdsRm9nZihHTC5HTF9GT0dfU1RBUlQsIDApOwotCQlHTC5nbEZvZ2YoR0wuR0xfRk9HX0RFTlNJVFksIDAuMGYpOwotCQkvLyBzZXQgdGhlIGVuZCBvZiB0aGUgc3RhcnQgZGlzdGFuY2U7IGFueXRoaW5nID4gMTUKLQkJLy8gdW5pdHMgZnJvbSB0aGUgY2FtZXJhIHdpbGwgYmUgY292ZXJlZCBpbiBmb2cKLQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19FTkQsIDE1KTsKLQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19NT0RFLCBGT0dfVFlQRVNbMF0pOwotCQlHTC5nbEVuYWJsZShHTC5HTF9GT0cpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQotCQljdWJlTGlzdEluZGV4QmFzZSA9IEdMLmdsR2VuTGlzdHMoMSk7Ci0JCWNyZWF0ZUN1YmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xSb3RhdGVmKHJvdFksIDAuMGYsIDEuMGYsIDAuMGYpOwotCi0JCUdMLmdsQ2FsbExpc3QoY3ViZUxpc3RJbmRleEJhc2UpOwotCi0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMywgMCwgLTMpOwotCQlHTC5nbENhbGxMaXN0KGN1YmVMaXN0SW5kZXhCYXNlKTsKLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKC0zLCAwLCAtMyk7Ci0JCUdMLmdsQ2FsbExpc3QoY3ViZUxpc3RJbmRleEJhc2UpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMCwgMCwgNCk7Ci0JCUdMLmdsQ2FsbExpc3QoY3ViZUxpc3RJbmRleEJhc2UpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCXJvdFkgKz0gMC42ZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0dyYWRpZW50VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0dyYWRpZW50VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOWQ1ZGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9HcmFkaWVudFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgR3JhZGllbnRUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAuMGYsIHlQb3MgPSAwLjBmLCB6UG9zID0gLTcuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB4Um90ID0gMTgwLjBmLCB5Um90ID0gMTgwLjBmLCB6Um90ID0gMTgwLjBmOwotCXByaXZhdGUgaW50IGN1cnJlbnRTZWxlY3Rpb24gPSAxOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGZsb2F0W10gQkVaSUVSX0NPTE9SUyA9IHsKLQkJMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4zZiwgMC42ZiwgMC4xZiwgMC4wZiwKLQkJMC44ZiwgMC4yZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKLQkJMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC44ZiwgMC44ZiwgMC44ZiwgMC4wZgotCX07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXRbXSBCRVpJRVJfUE9JTlRTID0gewotCQktMS41ZiwgLTEuNWYsIDQuMGYsIC0wLjVmLCAtMS41ZiwgMi4wZiwgMC41ZiwgLTEuNWYsCi0JCS0xLjBmLCAxLjVmLCAtMS41ZiwgMi4wZiwgLTEuNWYsIC0wLjVmLCAxLjBmLCAtMC41ZiwKLQkJLTAuNWYsIDMuMGYsIDAuNWYsIC0wLjVmLCAwLjBmLCAxLjVmLCAtMC41ZiwgLTEuMGYsCi0JCS0xLjVmLCAwLjVmLCA0LjBmLCAtMC41ZiwgMC41ZiwgMC4wZiwgMC41ZiwgMC41ZiwKLQkJMy4wZiwgMS41ZiwgMC41ZiwgNC4wZiwgLTEuNWYsIDEuNWYsIC0yLjBmLCAtMC41ZiwKLQkJMS41ZiwgLTIuMGYsIDAuNWYsIDEuNWYsIDAuMGYsIDEuNWYsIDEuNWYsIC0xLjBmLAotCX07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gT0JKRUNUX05BTUVTID0geyAiQmV6aWVyIiwgIlNxdWFyZSIgfTsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDEyOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCByb3RhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyb3RhdGlvbkdyb3VwLnNldFRleHQoIlJvdGF0aW9uIik7Ci0JCXJvdGF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeFJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl4Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl4Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeFJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl4Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXhSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMTgwKTsKLQkJeFJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4Um90ID0geFJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeVJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXlSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXlSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl5Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXlSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeVJvdGF0aW9uLnNldFNlbGVjdGlvbigxODApOwotCQl5Um90YXRpb24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlSb3QgPSB5Um90YXRpb24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl6Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJelJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJelJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXpSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJelJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl6Um90YXRpb24uc2V0U2VsZWN0aW9uKDE4MCk7Ci0JCXpSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelJvdCA9IHpSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgb2JqZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSxTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMixmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlvYmplY3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJb2JqZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJbmV3IExhYmVsKG9iamVjdEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiT2JqZWN0OiIpOwotCQlmaW5hbCBDb21ibyBvYmplY3RDb21ibyA9IG5ldyBDb21ibyhvYmplY3RHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJb2JqZWN0Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJb2JqZWN0Q29tYm8uc2V0SXRlbXMoT0JKRUNUX05BTUVTKTsKLQkJb2JqZWN0Q29tYm8uc2VsZWN0KDApOwotCQlvYmplY3RDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IG9iamVjdENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoMSwgMik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIkdyYWRpZW50cyI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEhpbnQoR0wuR0xfTElORV9TTU9PVEhfSElOVCwgR0wuR0xfTklDRVNUKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJR0wuZ2xQb2x5Z29uTW9kZShHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfRklMTCk7Ci0JCUdMLmdsTWFwMmYoR0wuR0xfTUFQMl9WRVJURVhfMywgMCwgMSwgMywgNCwgMCwgMSwgMTIsIDQsIEJFWklFUl9QT0lOVFMpOwotCQlHTC5nbE1hcDJmKEdMLkdMX01BUDJfQ09MT1JfNCwgMCwgMSwgNCwgMSwgMCwgMSwgNCwgNiwgQkVaSUVSX0NPTE9SUyk7Ci0JCUdMLmdsTWFwR3JpZDJmKDIwLCAwLjBmLCAxLjBmLCAyMCwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsU2hhZGVNb2RlbChHTC5HTF9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NNT09USCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJTkVfU1RJUFBMRSk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTUFQMl9DT0xPUl80KTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTUFQMl9WRVJURVhfMyk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCi0JCS8vIGNyZWF0ZSBkaXNwbGF5IGxpc3RzCi0JCUdMLmdsTmV3TGlzdCgxLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xFdmFsTWVzaDIoR0wuR0xfRklMTCwgMCwgMjAsIDAsIDIwKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCUdMLmdsTmV3TGlzdCgyLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRV9GQU4pOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xSb3RhdGVmKHhSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoeVJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih6Um90LCAwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbENhbGxMaXN0KGN1cnJlbnRTZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5MzU0MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0lDb2xvclNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIgewotCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpOwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9JbWFnZURhdGFVdGlsLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0ltYWdlRGF0YVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE2NmFlOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0ltYWdlRGF0YVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VEYXRhVXRpbCB7Ci0JLyoqCi0JICogQWxwaGEgbW9kZSwgdmFsdWVzIDAgLSAyNTUgc3BlY2lmeSBnbG9iYWwgYWxwaGEgbGV2ZWwKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUFMUEhBX09QQVFVRSA9IDI1NSwgICAgICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQkJQUxQSEFfVFJBTlNQQVJFTlQgPSAwLCAgICAgICAgLy8gRnVsbHkgdHJhbnNwYXJlbnQgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JCUFMUEhBX0NIQU5ORUxfU0VQQVJBVEUgPSAtMSwgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGZyb20gc2VwYXJhdGUgYWxwaGFEYXRhCi0JCUFMUEhBX0NIQU5ORUxfU09VUkNFID0gLTIsICAgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGVtYmVkZGVkIGluIHNvdXJjZURhdGEKLQkJQUxQSEFfTUFTS19VTlBBQ0tFRCA9IC0zLCAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBieXRlcyBpbiBhbHBoYURhdGEgKG5vbi16ZXJvIGlzIG9wYXF1ZSkKLQkJQUxQSEFfTUFTS19QQUNLRUQgPSAtNCwgICAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBwYWNrZWQgYml0cyBpbiBhbHBoYURhdGEKLQkJQUxQSEFfTUFTS19JTkRFWCA9IC01LCAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIHBhbGV0dGUgaW5kaWNlcyB0cmFuc3BhcmVudCBpZiBpbiBhbHBoYURhdGEgYXJyYXkKLQkJQUxQSEFfTUFTS19SR0IgPSAtNjsgICAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIFJHQnMgdHJhbnNwYXJlbnQgaWYgaW4gUkdCODg4IGZvcm1hdCBhbHBoYURhdGEgYXJyYXkKLQkJCi0JLyoqCi0JICogRGF0YSB0eXBlcyAoaW50ZXJuYWwpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCQlUWVBFX0dFTkVSSUNfOCA9IDAsCi0JCVRZUEVfR0VORVJJQ18xNl9NU0IgPSAxLAotCQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQkJVFlQRV9HRU5FUklDXzI0ID0gMywKLQkJVFlQRV9HRU5FUklDXzMyX01TQiA9IDQsCi0JCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1OwotCQkKLQkvKioKLQkgKiBCeXRlIGFuZCBiaXQgb3JkZXIgY29uc3RhbnRzLgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgTFNCX0ZJUlNUID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1TQl9GSVJTVCA9IDE7Ci0JCi0JLyoqCi0JICogQmxpdCBvcGVyYXRpb24gYml0cyB0byBiZSBPUidlZCB0b2dldGhlciB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIG9wZXJhdGlvbi4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUJMSVRfU1JDID0gMSwgICAgIC8vIGNvcHkgc291cmNlIGRpcmVjdGx5LCBlbHNlIGFwcGxpZXMgbG9naWMgb3BlcmF0aW9ucwotCQlCTElUX0FMUEhBID0gMiwgICAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcKLQkJQkxJVF9ESVRIRVIgPSA0OyAgLy8gZW5hYmxlIGRpdGhlcmluZyBpbiBsb3cgY29sb3IgbW9kZXMKLQkJCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+Pj0gYikgIT0gMDspIGluYyB8PSBiaXQ7Ci0JCQlmb3IgKGludCB2ID0gMCwgcCA9IDA7IHYgPCAweDEwMDAwOyB2Kz0gaW5jKSBkYXRhW3ArK10gPSAoYnl0ZSkodiA+PiA4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJsaXRzIGEgZGlyZWN0IHBhbGV0dGUgaW1hZ2UgaW50byBhIGRpcmVjdCBwYWxldHRlIGltYWdlLgotCSAqIDxwPgotCSAqIE5vdGU6IFdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGVwdGgsIG9yZGVyIGFuZCBtYXNrcwotCSAqIGFyZSBwYWlyd2lzZSBlcXVhbCBhbmQgdGhlIGJsaXR0ZXIgb3BlcmF0aW9uIGlzIEJMSVRfU1JDLAotCSAqIHRoZSBtYXNrcyBhcmUgaWdub3JlZC4gIEhlbmNlIHdoZW4gbm90IGNoYW5naW5nIHRoZSBpbWFnZQotCSAqIGRhdGEgZm9ybWF0LCAwIG1heSBiZSBzcGVjaWZpZWQgZm9yIHRoZSBtYXNrcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wIHRoZSBibGl0dGVyIG9wZXJhdGlvbjogYSBjb21iaW5hdGlvbiBvZiBCTElUX3h4eCBmbGFncwotCSAqICAgICAgICAoc2VlIEJMSVRfeHh4IGNvbnN0YW50cykKLQkgKiBAcGFyYW0gc3JjRGF0YSB0aGUgc291cmNlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIHNyY0RlcHRoIHRoZSBzb3VyY2UgZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc291cmNlIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBzcmNPcmRlciB0aGUgc291cmNlIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIHNyY0RlcHRoIGlzIG5vdCAxNiBvciAzMgotCSAqIEBwYXJhbSBzcmNYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1dpZHRoIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY0hlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjUmVkTWFzayB0aGUgc291cmNlIHJlZCBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gc3JjR3JlZW5NYXNrIHRoZSBzb3VyY2UgZ3JlZW4gY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIHNyY0JsdWVNYXNrIHRoZSBzb3VyY2UgYmx1ZSBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gYWxwaGFNb2RlIHRoZSBhbHBoYSBibGVuZGluZyBvciBtYXNrIG1vZGUsIG1heSBiZQotCSAqICAgICAgICBhbiBpbnRlZ2VyIDAtMjU1IGZvciBnbG9iYWwgYWxwaGE7IGlnbm9yZWQgaWYgQkxJVF9BTFBIQQotCSAqICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBibGl0dGVyIG9wZXJhdGlvbnMKLQkgKiAgICAgICAgKHNlZSBBTFBIQV9NT0RFX3h4eCBjb25zdGFudHMpCi0JICogQHBhcmFtIGFscGhhRGF0YSB0aGUgYWxwaGEgYmxlbmRpbmcgb3IgbWFzayBkYXRhLCB2YXJpZXMgZGVwZW5kaW5nCi0JICogICAgICAgIG9uIHRoZSB2YWx1ZSBvZiBhbHBoYU1vZGUgYW5kIHNvbWV0aW1lcyBpZ25vcmVkCi0JICogQHBhcmFtIGFscGhhU3RyaWRlIHRoZSBhbHBoYSBkYXRhIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBhbHBoYVggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGFscGhhIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGFscGhhWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgYWxwaGEgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdERhdGEgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIGRlc3REZXB0aCB0aGUgZGVzdGluYXRpb24gZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIGRlc3RTdHJpZGUgdGhlIGRlc3RpbmF0aW9uIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBkZXN0T3JkZXIgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIGRlc3REZXB0aCBpcyBub3QgMTYgb3IgMzIKLQkgKiBAcGFyYW0gZGVzdFggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RZIHRoZSB0b3AtbGVmdCB5LWNvb3JkIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0SGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RSZWRNYXNrIHRoZSBkZXN0aW5hdGlvbiByZWQgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGRlc3RHcmVlbk1hc2sgdGhlIGRlc3RpbmF0aW9uIGdyZWVuIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBkZXN0Qmx1ZU1hc2sgdGhlIGRlc3RpbmF0aW9uIGJsdWUgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGZsaXBYIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzCi0JICogQHBhcmFtIGZsaXBZIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMKLQkgKi8KLQlzdGF0aWMgdm9pZCBibGl0KGludCBvcCwKLQkJYnl0ZVtdIHNyY0RhdGEsIGludCBzcmNEZXB0aCwgaW50IHNyY1N0cmlkZSwgaW50IHNyY09yZGVyLAotCQlpbnQgc3JjWCwgaW50IHNyY1ksIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKLQkJaW50IHNyY1JlZE1hc2ssIGludCBzcmNHcmVlbk1hc2ssIGludCBzcmNCbHVlTWFzaywKLQkJaW50IGFscGhhTW9kZSwgYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhU3RyaWRlLCBpbnQgYWxwaGFYLCBpbnQgYWxwaGFZLAotCQlieXRlW10gZGVzdERhdGEsIGludCBkZXN0RGVwdGgsIGludCBkZXN0U3RyaWRlLCBpbnQgZGVzdE9yZGVyLAotCQlpbnQgZGVzdFgsIGludCBkZXN0WSwgaW50IGRlc3RXaWR0aCwgaW50IGRlc3RIZWlnaHQsCi0JCWludCBkZXN0UmVkTWFzaywgaW50IGRlc3RHcmVlbk1hc2ssIGludCBkZXN0Qmx1ZU1hc2ssCi0JCWJvb2xlYW4gZmxpcFgsIGJvb2xlYW4gZmxpcFkpIHsKLQkJaWYgKChkZXN0V2lkdGggPD0gMCkgfHwgKGRlc3RIZWlnaHQgPD0gMCkgfHwgKGFscGhhTW9kZSA9PSBBTFBIQV9UUkFOU1BBUkVOVCkpIHJldHVybjsKLQotCQkvLyB0aGVzZSBzaG91bGQgYmUgc3VwcGxpZWQgYXMgcGFyYW1zIGxhdGVyCi0JCWZpbmFsIGludCBzcmNBbHBoYU1hc2sgPSAwLCBkZXN0QWxwaGFNYXNrID0gMDsKLQotCQkvKioqIFByZXBhcmUgc2NhbGluZyBkYXRhICoqKi8KLQkJZmluYWwgaW50IGR3bTEgPSBkZXN0V2lkdGggLSAxOwotCQlmaW5hbCBpbnQgc2Z4aSA9IChkd20xICE9IDApID8gKGludCkoKCgobG9uZylzcmNXaWR0aCA8PCAxNikgLSAxKSAvIGR3bTEpIDogMDsKLQkJZmluYWwgaW50IGRobTEgPSBkZXN0SGVpZ2h0IC0gMTsKLQkJZmluYWwgaW50IHNmeWkgPSAoZGhtMSAhPSAwKSA/IChpbnQpKCgoKGxvbmcpc3JjSGVpZ2h0IDw8IDE2KSAtIDEpIC8gZGhtMSkgOiAwOwotCi0JCS8qKiogUHJlcGFyZSBzb3VyY2UtcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IHNicHAsIHN0eXBlOwotCQlzd2l0Y2ggKHNyY0RlcHRoKSB7Ci0JCQljYXNlIDg6Ci0JCQkJc2JwcCA9IDE7Ci0JCQkJc3R5cGUgPSBUWVBFX0dFTkVSSUNfODsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJc2JwcCA9IDI7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18xNl9NU0IgOiBUWVBFX0dFTkVSSUNfMTZfTFNCOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlzYnBwID0gMzsKLQkJCQlzdHlwZSA9IFRZUEVfR0VORVJJQ18yNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJc2JwcCA9IDQ7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc291cmNlIHR5cGUiKTsKLQkJCQlyZXR1cm47Ci0JCX0JCQkKLQkJaW50IHNwciA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYICogc2JwcDsKLQotCQkvKioqIFByZXBhcmUgZGVzdGluYXRpb24tcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IGRicHAsIGR0eXBlOwotCQlzd2l0Y2ggKGRlc3REZXB0aCkgewotCQkJY2FzZSA4OgotCQkJCWRicHAgPSAxOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWRicHAgPSAyOwotCQkJCWR0eXBlID0gKGRlc3RPcmRlciA9PSBNU0JfRklSU1QpID8gVFlQRV9HRU5FUklDXzE2X01TQiA6IFRZUEVfR0VORVJJQ18xNl9MU0I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJCWRicHAgPSAzOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzI0OwotCQkJCWJyZWFrOwotCQkJY2FzZSAzMjoKLQkJCQlkYnBwID0gNDsKLQkJCQlkdHlwZSA9IChkZXN0T3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGVzdGluYXRpb24gdHlwZSIpOwotCQkJCXJldHVybjsKLQkJfQkJCQotCQlpbnQgZHByID0gKChmbGlwWSkgPyBkZXN0WSArIGRobTEgOiBkZXN0WSkgKiBkZXN0U3RyaWRlICsgKChmbGlwWCkgPyBkZXN0WCArIGR3bTEgOiBkZXN0WCkgKiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeGkgPSAoZmxpcFgpID8gLWRicHAgOiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeWkgPSAoZmxpcFkpID8gLWRlc3RTdHJpZGUgOiBkZXN0U3RyaWRlOwotCi0JCS8qKiogUHJlcGFyZSBzcGVjaWFsIHByb2Nlc3NpbmcgZGF0YSAqKiovCi0JCWludCBhcHI7Ci0JCWlmICgob3AgJiBCTElUX0FMUEhBKSAhPSAwKSB7Ci0JCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCWNhc2UgQUxQSEFfTUFTS19VTlBBQ0tFRDoKLQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYXByID0gYWxwaGFZICogYWxwaGFTdHJpZGUgKyBhbHBoYVg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUxQSEFfTUFTS19QQUNLRUQ6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYWxwaGFTdHJpZGUgPDw9IDM7Ci0JCQkJCWFwciA9IGFscGhhWSAqIGFscGhhU3RyaWRlICsgYWxwaGFYOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMUEhBX01BU0tfSU5ERVg6Ci0JCQkJCS8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhbHBoYSB0eXBlIik7Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWFscGhhTW9kZSA9IChhbHBoYU1vZGUgPDwgMTYpIC8gMjU1OyAvLyBwcmVzY2FsZQotCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCWFwciA9IDA7Ci0JCX0KLQotCQkvKioqIEJsaXQgKioqLwotCQlpbnQgZHAgPSBkcHI7Ci0JCWludCBzcCA9IHNwcjsKLQkJaWYgKChhbHBoYU1vZGUgPT0gMHgxMDAwMCkgJiYgKHN0eXBlID09IGR0eXBlKSAmJgotCQkJKHNyY1JlZE1hc2sgPT0gZGVzdFJlZE1hc2spICYmIChzcmNHcmVlbk1hc2sgPT0gZGVzdEdyZWVuTWFzaykgJiYKLQkJCShzcmNCbHVlTWFzayA9PSBkZXN0Qmx1ZU1hc2spICYmIChzcmNBbHBoYU1hc2sgPT0gZGVzdEFscGhhTWFzaykpIHsKLQkJCS8qKiogRmFzdCBibGl0IChzdHJhaWdodCBjb3B5KSAqKiovCi0JCQlzd2l0Y2ggKHNicHApIHsKLQkJCQljYXNlIDE6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQljYXNlIDI6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gc3JjRGF0YVtzcCArIDFdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgM10gPSBzcmNEYXRhW3NwICsgM107Ci0JCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvKioqIENvbXByZWhlbnNpdmUgYmxpdCAoYXBwbHkgdHJhbnNmb3JtYXRpb25zKSAqKiovCi0JCWZpbmFsIGludCBzcmNSZWRTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNSZWRNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY1JlZHMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY1JlZE1hc2ssIHNyY1JlZFNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNHcmVlblNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0dyZWVuTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNHcmVlbnMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0dyZWVuTWFzaywgc3JjR3JlZW5TaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjQmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0JsdWVNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY0JsdWVzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNCbHVlTWFzaywgc3JjQmx1ZVNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNBbHBoYVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0FscGhhTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNBbHBoYXMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0FscGhhTWFzaywgc3JjQWxwaGFTaGlmdCldOwotCi0JCWZpbmFsIGludCBkZXN0UmVkU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdFJlZE1hc2spOwotCQlmaW5hbCBpbnQgZGVzdFJlZFdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RSZWRNYXNrLCBkZXN0UmVkU2hpZnQpOwotCQlmaW5hbCBieXRlW10gZGVzdFJlZHMgPSBBTllfVE9fRUlHSFRbZGVzdFJlZFdpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RSZWRQcmVTaGlmdCA9IDggLSBkZXN0UmVkV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0R3JlZW5TaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0R3JlZW5NYXNrKTsKLQkJZmluYWwgaW50IGRlc3RHcmVlbldpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RHcmVlbk1hc2ssIGRlc3RHcmVlblNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RHcmVlbnMgPSBBTllfVE9fRUlHSFRbZGVzdEdyZWVuV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEdyZWVuUHJlU2hpZnQgPSA4IC0gZGVzdEdyZWVuV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KGRlc3RCbHVlTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RCbHVlTWFzaywgZGVzdEJsdWVTaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0Qmx1ZXMgPSBBTllfVE9fRUlHSFRbZGVzdEJsdWVXaWR0aF07Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVByZVNoaWZ0ID0gOCAtIGRlc3RCbHVlV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0QWxwaGFTaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0QWxwaGFNYXNrKTsKLQkJZmluYWwgaW50IGRlc3RBbHBoYVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RBbHBoYU1hc2ssIGRlc3RBbHBoYVNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RBbHBoYXMgPSBBTllfVE9fRUlHSFRbZGVzdEFscGhhV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEFscGhhUHJlU2hpZnQgPSA4IC0gZGVzdEFscGhhV2lkdGg7Ci0KLQkJaW50IGFwID0gYXByLCBhbHBoYSA9IGFscGhhTW9kZTsKLQkJaW50IHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOwotCQlpbnQgcnEgPSAwLCBncSA9IDAsIGJxID0gMCwgYXEgPSAwOwotCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwKLQkJCQlzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsCi0JCQkJYXAgPSBhcHIgKz0gKHNmeSA+Pj4gMTYpICogYWxwaGFTdHJpZGUsCi0JCQkJc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLAotCQkJCWRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LAotCQkJCQlkcCArPSBkcHJ4aSwKLQkJCQkJc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJLyoqKiBSRUFEIE5FWFQgUElYRUwgKioqLwotCQkJCXN3aXRjaCAoc3R5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSBzcmNEYXRhW3NwXSAmIDB4ZmY7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMjsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3BdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAyOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAzOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcF0gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCX0KLQotCQkJCS8qKiogRE8gU1BFQ0lBTCBQUk9DRVNTSU5HIElGIFJFUVVJUkVEICoqKi8KLQkJCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCQlhbHBoYSA9ICgoYWxwaGFEYXRhW2FwXSAmIDB4ZmYpIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWFwICs9IChzZnggPj4gMTYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCQlhbHBoYSA9IChhIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfVU5QQUNLRUQ6Ci0JCQkJCQlhbHBoYSA9IChhbHBoYURhdGFbYXBdICE9IDApID8gMHgxMDAwMCA6IDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQljYXNlIEFMUEhBX01BU0tfUEFDS0VEOgotCQkJCQkJYWxwaGEgPSAoYWxwaGFEYXRhW2FwID4+IDNdIDw8ICgoYXAgJiA3KSArIDkpKSAmIDB4MTAwMDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQkJYWxwaGEgPSAweDEwMDAwOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpICs9IDMpIHsKLQkJCQkJCQlpZiAoKHIgPT0gYWxwaGFEYXRhW2ldKSAmJiAoZyA9PSBhbHBoYURhdGFbaSArIDFdKSAmJiAoYiA9PSBhbHBoYURhdGFbaSArIDJdKSkgewotCQkJCQkJCQlhbHBoYSA9IDB4MDAwMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhbHBoYSAhPSAweDEwMDAwKSB7Ci0JCQkJCWlmIChhbHBoYSA9PSAweDAwMDApIGNvbnRpbnVlOwotCQkJCQlzd2l0Y2ggKGR0eXBlKSB7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ184OiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSBkZXN0RGF0YVtkcF0gJiAweGZmOwotCQkJCQkJCXJxID0gZGVzdFJlZHNbKGRhdGEgJiBkZXN0UmVkTWFzaykgPj4+IGRlc3RSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJCWdxID0gZGVzdEdyZWVuc1soZGF0YSAmIGRlc3RHcmVlbk1hc2spID4+PiBkZXN0R3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJCWJxID0gZGVzdEJsdWVzWyhkYXRhICYgZGVzdEJsdWVNYXNrKSA+Pj4gZGVzdEJsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJCWFxID0gZGVzdEFscGhhc1soZGF0YSAmIGRlc3RBbHBoYU1hc2spID4+PiBkZXN0QWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQkJfSBicmVhazsKLQkJCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcCArIDFdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9NU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgM10gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHAgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLy8gUGVyZm9ybSBhbHBoYSBibGVuZGluZwotCQkJCQlhID0gYXEgKyAoKGEgLSBhcSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJCXIgPSBycSArICgociAtIHJxKSAqIGFscGhhID4+IDE2KTsKLQkJCQkJZyA9IGdxICsgKChnIC0gZ3EpICogYWxwaGEgPj4gMTYpOwotCQkJCQliID0gYnEgKyAoKGIgLSBicSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJfQotCi0JCQkJLyoqKiBXUklURSBORVhUIFBJWEVMICoqKi8KLQkJCQlmaW5hbCBpbnQgZGF0YSA9IAotCQkJCQkociA+Pj4gZGVzdFJlZFByZVNoaWZ0IDw8IGRlc3RSZWRTaGlmdCkgfAotCQkJCQkoZyA+Pj4gZGVzdEdyZWVuUHJlU2hpZnQgPDwgZGVzdEdyZWVuU2hpZnQpIHwKLQkJCQkJKGIgPj4+IGRlc3RCbHVlUHJlU2hpZnQgPDwgZGVzdEJsdWVTaGlmdCkgfAotCQkJCQkoYSA+Pj4gZGVzdEFscGhhUHJlU2hpZnQgPDwgZGVzdEFscGhhU2hpZnQpOwotCQkJCXN3aXRjaCAoZHR5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIGRhdGE7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgPj4+IDI0KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDE2KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAzXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDNdID0gKGJ5dGUpIChkYXRhID4+PiAyNCk7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgc2hpZnQgZnJvbSBhIG1hc2suCi0JICovCi0Jc3RhdGljIGludCBnZXRDaGFubmVsU2hpZnQoaW50IG1hc2spIHsKLQkJaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyAoKG1hc2sgJiAxKSA9PSAwKSAmJiAoaSA8IDMyKTsgKytpKSB7Ci0JCQltYXNrID4+Pj0gMTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgd2lkdGggKGRlcHRoKSBmcm9tIGEgbWFzay4KLQkgKi8KLQlzdGF0aWMgaW50IGdldENoYW5uZWxXaWR0aChpbnQgbWFzaywgaW50IHNoaWZ0KSB7Ci0JCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCQlpbnQgaTsKLQkJbWFzayA+Pj49IHNoaWZ0OwotCQlmb3IgKGkgPSBzaGlmdDsgKChtYXNrICYgMSkgIT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQkJbWFzayA+Pj49IDE7Ci0JCX0KLQkJcmV0dXJuIGkgLSBzaGlmdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0KLQkJSW1hZ2VEYXRhVXRpbC5ibGl0ICgKLQkJCTEsCi0JCQlzb3VyY2UuZGF0YSwKLQkJCXNvdXJjZS5kZXB0aCwKLQkJCXNvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkoc291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJc291cmNlLndpZHRoLAotCQkJc291cmNlLmhlaWdodCwKLQkJCXNvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCTI1NSwKLQkJCW51bGwsCi0JCQkwLAotCQkJMCwKLQkJCTAsCi0JCQluZXdTb3VyY2UuZGF0YSwKLQkJCW5ld1NvdXJjZS5kZXB0aCwKLQkJCW5ld1NvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkobmV3U291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLndpZHRoLAotCQkJbmV3U291cmNlLmhlaWdodCwKLQkJCW5ld1NvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCWZhbHNlLAotCQkJdHJ1ZSk7Ci0KLQkJcmV0dXJuIG5ld1NvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xXSkdMRXhhbXBsZS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9MV0pHTEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkMWMyMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xXSkdMRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTENhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMRGF0YTsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLkdMMTE7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5HTENvbnRleHQ7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5nbHUuR0xVOwotaW1wb3J0IG9yZy5sd2pnbC5MV0pHTEV4Y2VwdGlvbjsKLQotLyoKLSAqIFNXVCBPcGVuR0wgc25pcHBldDogdXNlIExXSkdMIHRvIGRyYXcgdG8gYW4gU1dUIEdMQ2FudmFzCi0gKi8KLXB1YmxpYyBjbGFzcyBMV0pHTEV4YW1wbGUgewotCXN0YXRpYyB2b2lkIGRyYXdUb3J1cyhmbG9hdCByLCBmbG9hdCBSLCBpbnQgbnNpZGVzLCBpbnQgcmluZ3MpIHsKLQkJZmxvYXQgcmluZ0RlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIHJpbmdzOwotCQlmbG9hdCBzaWRlRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gbnNpZGVzOwotCQlmbG9hdCB0aGV0YSA9IDAuMGYsIGNvc1RoZXRhID0gMS4wZiwgc2luVGhldGEgPSAwLjBmOwotCQlmb3IgKGludCBpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJZmxvYXQgdGhldGExID0gdGhldGEgKyByaW5nRGVsdGE7Ci0JCQlmbG9hdCBjb3NUaGV0YTEgPSAoZmxvYXQpIE1hdGguY29zKHRoZXRhMSk7Ci0JCQlmbG9hdCBzaW5UaGV0YTEgPSAoZmxvYXQpIE1hdGguc2luKHRoZXRhMSk7Ci0JCQlHTDExLmdsQmVnaW4oR0wxMS5HTF9RVUFEX1NUUklQKTsKLQkJCWZsb2F0IHBoaSA9IDAuMGY7Ci0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJR0wxMS5nbE5vcm1hbDNmKGNvc1RoZXRhMSAqIGNvc1BoaSwgLXNpblRoZXRhMSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTDExLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCUdMMTEuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMMTEuZ2xWZXJ0ZXgzZihjb3NUaGV0YSAqIGRpc3QsIC1zaW5UaGV0YSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJfQotCQkJR0wxMS5nbEVuZCgpOwotCQkJdGhldGEgPSB0aGV0YTE7Ci0JCQljb3NUaGV0YSA9IGNvc1RoZXRhMTsKLQkJCXNpblRoZXRhID0gc2luVGhldGExOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEgKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKGNvbXAsIFNXVC5OT05FLCBkYXRhKTsKLQotCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQl0cnkgewotICAgICAgIAkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLSAgICAgICAgCi0gICAgICAgIGNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAJCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIAkJZmxvYXQgZkFzcGVjdCA9IChmbG9hdCkgYm91bmRzLndpZHRoIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJICAgICAgICB9IGNhdGNoKExXSkdMRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotICAgICAgICAJCUdMMTEuZ2xWaWV3cG9ydCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotICAgICAgICAJCUdMMTEuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7Ci0gICAgICAgIAkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotICAgICAgICAJCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLSAgICAgICAgCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX01PREVMVklFVyk7Ci0gICAgICAgIAkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotICAgICAgICAJfQotICAgICAgICB9KTsKLQotCQlHTDExLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wxMS5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMMTEuZ2xIaW50KEdMMTEuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTDExLkdMX05JQ0VTVCk7Ci0JCUdMMTEuZ2xDbGVhckRlcHRoKDEuMCk7Ci0JCUdMMTEuZ2xMaW5lV2lkdGgoMik7Ci0JCUdMMTEuZ2xFbmFibGUoR0wxMS5HTF9ERVBUSF9URVNUKTsKLQotCQlzaGVsbC5zZXRUZXh0KCJTV1QvTFdKR0wgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRTaXplKDY0MCwgNDgwKTsKLQkJc2hlbGwub3BlbigpOwotCi0JICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkgICAgCWludCByb3QgPSAwOwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCQl0cnkgewotCQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJCSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQkJCQkJR0wxMS5nbENsZWFyKEdMMTEuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMMTEuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCQkJCUdMMTEuZ2xDbGVhckNvbG9yKC4zZiwgLjVmLCAuOGYsIDEuMGYpOwotCQkJCQlHTDExLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJCUdMMTEuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xMC4wZik7Ci0JCQkJCWZsb2F0IGZyb3QgPSByb3Q7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuMTVmICogcm90LCAyLjBmICogZnJvdCwgMTAuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJR0wxMS5nbFJvdGF0ZWYoMC4zZiAqIHJvdCwgMy4wZiAqIGZyb3QsIDEuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJcm90Kys7Ci0JCQkJCUdMMTEuZ2xQb2x5Z29uTW9kZShHTDExLkdMX0ZST05UX0FORF9CQUNLLCBHTDExLkdMX0xJTkUpOwotCQkJCQlHTDExLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJCQkJZHJhd1RvcnVzKDEsIDEuOWYgKyAoKGZsb2F0KSBNYXRoLnNpbigoMC4wMDRmICogZnJvdCkpKSwgMTUsIDE1KTsKLQkJCQkJY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTGlnaHRUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTGlnaHRUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxZTk0OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xpZ2h0VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBMaWdodFRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdFtdIG1hdGVyaWFsU2hpbmluZXNzID0geyAyNS4wZiB9OwotCXByaXZhdGUgZmxvYXRbXSBsaWdodFBvc2l0aW9uID0geyAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmIH07Ci0JcHJpdmF0ZSBmbG9hdFtdW10gY29sb3JWYWx1ZXMgPSB7Ci0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9LAkvLyBsaWdodCBkaWZmdXNlCi0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9LAkvLyBsaWdodCBhbWJpZW50Ci0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9LAkvLyBsaWdodCBzcGVjdWxhcgotCQl7IDAuNWYsIDAuNWYsIDAuNWYsIDEuMGYgfSwJLy8gbGlnaHQgbWFpbiBhbWJpZW50Ci0JCXsgMC4wZiwgMC4wZiwgMS4wZiwgMS4wZiB9LAkvLyBtYXRlcmlhbCBkaWZmdXNlCi0JCXsgMC4zZiwgMC4zZiwgMC4zZiwgMS4wZiB9LAkvLyBtYXRlcmlhbCBhbWJpZW50Ci0JCXsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9CS8vIG1hdGVyaWFsIHNwZWN1bGFyCi0JfTsKLQlwcml2YXRlIGZsb2F0IHlQb3MgPSAwLjBmLCB4UG9zID0gMC4wZiwgelBvcyA9IC0yMC4wZjsKLQlwcml2YXRlIGludCBxdWFkcmF0aWMsIHNwaGVyZTsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl6TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHpNb3ZlLmdldFNlbGVjdGlvbigpIC0gMzA7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIHBvc2l0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBvc2l0aW9uR3JvdXAuc2V0VGV4dCgiTGlnaHQgUG9zaXRpb24iKTsKLQkJcG9zaXRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciBsaWdodFggPSBuZXcgU2xpZGVyKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRYLnNldEluY3JlbWVudCgxKTsKLQkJbGlnaHRYLnNldE1heGltdW0oMjIpOwotCQlsaWdodFguc2V0TWluaW11bSgwKTsKLQkJbGlnaHRYLnNldFRodW1iKDIpOwotCQlsaWdodFguc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJbGlnaHRYLnNldFNlbGVjdGlvbigxMCk7Ci0JCWxpZ2h0WC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbGlnaHRQb3NpdGlvblswXSA9ICgoZmxvYXQpIGxpZ2h0WC5nZXRTZWxlY3Rpb24oKSAqIDEwKSAtIDEwMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgbGlnaHRZID0gbmV3IFNsaWRlcihwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0WS5zZXRJbmNyZW1lbnQoMSk7Ci0JCWxpZ2h0WS5zZXRNYXhpbXVtKDIyKTsKLQkJbGlnaHRZLnNldE1pbmltdW0oMCk7Ci0JCWxpZ2h0WS5zZXRUaHVtYigyKTsKLQkJbGlnaHRZLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWxpZ2h0WS5zZXRTZWxlY3Rpb24oMTApOwotCQlsaWdodFkuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWxpZ2h0UG9zaXRpb25bMV0gPSAoKGZsb2F0KSBsaWdodFkuZ2V0U2VsZWN0aW9uKCkgKiAxMCkgLSAxMDA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIGxpZ2h0WiA9IG5ldyBTbGlkZXIocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQlsaWdodFouc2V0SW5jcmVtZW50KDEpOwotCQlsaWdodFouc2V0TWF4aW11bSgyMik7Ci0JCWxpZ2h0Wi5zZXRNaW5pbXVtKDApOwotCQlsaWdodFouc2V0VGh1bWIoMik7Ci0JCWxpZ2h0Wi5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlsaWdodFouc2V0U2VsZWN0aW9uKDEwKTsKLQkJbGlnaHRaLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlsaWdodFBvc2l0aW9uWzJdID0gKChmbG9hdCkgbGlnaHRaLmdldFNlbGVjdGlvbigpICogMTApIC0gMjA7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIGxpZ2h0Q29sb3JzR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0Q29sb3JzR3JvdXAuc2V0VGV4dCgiTGlnaHQgQ29sb3JzIik7Ci0JCWxpZ2h0Q29sb3JzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWxpZ2h0Q29sb3JzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGxpZ2h0RGlmZnVzZUJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0RGlmZnVzZUJ1dHRvbi5zZXRUZXh0KCJEaWZmdXNlIik7Ci0JCWxpZ2h0RGlmZnVzZUJ1dHRvbi5zZXRSR0IoCi0JCQluZXcgUkdCKAotCQkJCShpbnQpIChjb2xvclZhbHVlc1swXVswXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzBdWzFdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMF1bMl0gKiAyNTUpKSk7Ci0JCWxpZ2h0RGlmZnVzZUJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzBdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMF1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzBdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbGlnaHRBbWJpZW50QnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGxpZ2h0Q29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRBbWJpZW50QnV0dG9uLnNldFRleHQoIkFtYmllbnQiKTsKLQkJbGlnaHRBbWJpZW50QnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzFdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMV1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1sxXVsyXSAqIDI1NSkpKTsKLQkJbGlnaHRBbWJpZW50QnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbMV1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1sxXVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMV1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBsaWdodFNwZWN1bGFyQnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGxpZ2h0Q29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRTcGVjdWxhckJ1dHRvbi5zZXRUZXh0KCJTcGVjdWxhciIpOwotCQlsaWdodFNwZWN1bGFyQnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzJdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMl1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1syXVsyXSAqIDI1NSkpKTsKLQkJbGlnaHRTcGVjdWxhckJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzJdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMl1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzJdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbGlnaHRNYWluQW1iaWVudEJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0TWFpbkFtYmllbnRCdXR0b24uc2V0VGV4dCgiTWFpbiBBbWJpZW50Iik7Ci0JCWxpZ2h0TWFpbkFtYmllbnRCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbM11bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1szXVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzNdWzJdICogMjU1KSkpOwotCQlsaWdodE1haW5BbWJpZW50QnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbM11bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1szXVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbM11bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgbWF0ZXJpYWxDb2xvcnNHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxDb2xvcnNHcm91cC5zZXRUZXh0KCJNYXRlcmlhbCBDb2xvcnMiKTsKLQkJbWF0ZXJpYWxDb2xvcnNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJbWF0ZXJpYWxDb2xvcnNHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbWF0ZXJpYWxEaWZmdXNlQnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKG1hdGVyaWFsQ29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxEaWZmdXNlQnV0dG9uLnNldFRleHQoIkRpZmZ1c2UiKTsKLQkJbWF0ZXJpYWxEaWZmdXNlQnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzRdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNF1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s0XVsyXSAqIDI1NSkpKTsKLQkJbWF0ZXJpYWxEaWZmdXNlQnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbNF1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s0XVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNF1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBtYXRlcmlhbEFtYmllbnRCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobWF0ZXJpYWxDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQltYXRlcmlhbEFtYmllbnRCdXR0b24uc2V0VGV4dCgiQW1iaWVudCIpOwotCQltYXRlcmlhbEFtYmllbnRCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNV1bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s1XVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzVdWzJdICogMjU1KSkpOwotCQltYXRlcmlhbEFtYmllbnRCdXR0b24KLQkJCS5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQljb2xvclZhbHVlc1s1XVswXSA9ICgoZmxvYXQpIHJnYi5yZWQpIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzVdWzFdID0gKChmbG9hdCkgcmdiLmdyZWVuKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s1XVsyXSA9ICgoZmxvYXQpIHJnYi5ibHVlKSAvIDI1NTsKLQkJCQlzZXRDb2xvclZhbHVlcygpOwotCQkJfQotCQl9KTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIG1hdGVyaWFsU3BlY3VsYXJCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobWF0ZXJpYWxDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQltYXRlcmlhbFNwZWN1bGFyQnV0dG9uLnNldFRleHQoIlNwZWN1bGFyIik7Ci0JCW1hdGVyaWFsU3BlY3VsYXJCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNl1bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s2XVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzZdWzJdICogMjU1KSkpOwotCQltYXRlcmlhbFNwZWN1bGFyQnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbNl1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s2XVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNl1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIk1hdGVyaWFsIFNoaW5pbmVzczoiKTsKLQkJZmluYWwgU2xpZGVyIHNoaW5lU2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc2hpbmVTbGlkZXIuc2V0SW5jcmVtZW50KDUpOwotCQlzaGluZVNsaWRlci5zZXRNYXhpbXVtKDEwMik7Ci0JCXNoaW5lU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCXNoaW5lU2xpZGVyLnNldFRodW1iKDIpOwotCQlzaGluZVNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDEwKTsKLQkJc2hpbmVTbGlkZXIuc2V0U2VsZWN0aW9uKDI1KTsKLQkJc2hpbmVTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCW1hdGVyaWFsU2hpbmluZXNzWzBdID0gc2hpbmVTbGlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLAotCQkJCQlHTC5HTF9TSElOSU5FU1MsCi0JCQkJCW1hdGVyaWFsU2hpbmluZXNzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoc3BoZXJlLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJMaWdodCI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlzZXRDb2xvclZhbHVlcygpOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX1NISU5JTkVTUywgbWF0ZXJpYWxTaGluaW5lc3MpOwotCQlxdWFkcmF0aWMgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQlHTFUuZ2x1UXVhZHJpY05vcm1hbHMocXVhZHJhdGljLCBHTFUuR0xVX1NNT09USCk7Ci0JCUdMLmdsSGludChHTC5HTF9MSU5FX1NNT09USF9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbFBvaW50U2l6ZSgyLjBmKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJc3BoZXJlID0gR0wuZ2xHZW5MaXN0cygxKTsKLQkJR0wuZ2xOZXdMaXN0KHNwaGVyZSwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAzLCAzMiwgMzIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX1BPU0lUSU9OLCBsaWdodFBvc2l0aW9uKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKHhQb3MsIHlQb3MsIHpQb3MpOwotCQlHTC5nbENhbGxMaXN0KHNwaGVyZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBjb2xvciB2YWx1ZXMgaW50byB0aGUgcmVuZGVyZWQgZGlzcGxheS4KLQkgKi8KLQl2b2lkIHNldENvbG9yVmFsdWVzKCkgewotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9ESUZGVVNFLCBjb2xvclZhbHVlc1swXSk7Ci0JCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfRElGRlVTRSwgY29sb3JWYWx1ZXNbNF0pOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0FNQklFTlQsIGNvbG9yVmFsdWVzWzVdKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfQU1CSUVOVCwgY29sb3JWYWx1ZXNbMV0pOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9TUEVDVUxBUiwgY29sb3JWYWx1ZXNbMl0pOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX1NQRUNVTEFSLCBjb2xvclZhbHVlc1s2XSk7Ci0JCUdMLmdsTGlnaHRNb2RlbGZ2KEdMLkdMX0xJR0hUX01PREVMX0FNQklFTlQsIGNvbG9yVmFsdWVzWzNdKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TSElOSU5FU1MsIG1hdGVyaWFsU2hpbmluZXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL051cmJUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTnVyYlRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODNmMDQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTnVyYlRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgTnVyYlRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gLTUuMGYsIHlQb3MgPSAtNS4wZiwgelBvcyA9IC0yNS4wZjsKLQlwcml2YXRlIGZsb2F0IHhSb3QgPSAzMzAuMGYsIHlSb3QgPSAwLjBmLCB6Um90ID0gMC4wZjsKLQlwcml2YXRlIGludCBudXJiOwotCi0JLyoqCi0JICogUmV0dXJucyBhIDMgZGltZW5zaW9uYWwgYXJyYXkgdG8gc3RvcmUgdmVydGV4IHBvaW50cyBmb3IgdGhlIG51cmIKLQkgKiBzdXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5Ci0JICovCi0JZmxvYXRbXVtdW10gYnVpbGROdXJiKCkgewotCQlmbG9hdFtdW11bXSBjdHJsID0gbmV3IGZsb2F0WzRdWzRdWzNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCQkvLyBzZXQgdGhlIHggdmFsdWUKLQkJCQljdHJsW2ldW2pdWzBdID0gMiAqIChpICsgKGZsb2F0KSBNYXRoLmNvcyhpICsgaikpOwotCQkJCS8vIHNldCB0aGUgeSB2YWx1ZQotCQkJCWN0cmxbaV1bal1bMV0gPSAyICogKGogKyAoZmxvYXQpIE1hdGguY29zKGkgKyBqKSk7Ci0JCQkJLy8gc2V0IHRoZSB6IHZhbHVlCi0JCQkJaWYgKChpID09IDEgJiYgaiA9PSAxKSB8fCAoaSA9PSAyICYmIGogPT0gMikpIHsKLQkJCQkJLy8gdGhpcyBtYWtlcyB0aGUgaGlsbAotCQkJCQljdHJsW2ldW2pdWzJdID0gNi4wZjsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsW2ldW2pdWzJdID0gMC4wZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gc2V0cyB0aGlzIHBhcnRpY3VsYXIgeiB2YWx1ZSB0byBhIGxhcmdlIG51bWJlciB0byBtYWtlIGEgaGlnaAotCQkvLyBoaWxsCi0JCWN0cmxbMl1bMl1bMl0gPSA4LjBmOwotCi0JCXJldHVybiBjdHJsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgMSBkaW1lbnNpb25hbCBhcnJheSByZXByZXNlbnRpbmcgdGhlIDMgZGltZW5zaW9uYWwKLQkgKiBhcmd1bWVudC4gIFRoaXMgcmVzdWx0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIG51cmIgcmVuZGVyZXIKLQkgKiAKLQkgKiBAcGFyYW0gY3RybCBzb3VyY2UgM0QgYXJyYXkKLQkgKiBAcmV0dXJuIDFEIGFycmF5Ci0JICovCi0JZmxvYXRbXSBjb252ZXJ0KGZsb2F0W11bXVtdIGN0cmwpIHsKLQkJZmxvYXRbXSBwdHMgPQotCQkJbmV3IGZsb2F0W2N0cmwubGVuZ3RoICogY3RybFswXS5sZW5ndGggKiBjdHJsWzBdWzBdLmxlbmd0aF07Ci0JCWludCByb3cgPSAwOwotCQlpbnQgY29sID0gMDsKLQkJLy8gc2V0IHJvd0luY3IgdG8gbnVtYmVyIG9mIGNvbHVtbnMgKiBkZXB0aCAKLQkJaW50IHJvd0luY3IgPSBjdHJsWzBdLmxlbmd0aCAqIGN0cmxbMF1bMF0ubGVuZ3RoOwotCQkvLyBzZXQgY29sSW5jciB0byBkZXB0aCAKLQkJaW50IGNvbEluY3IgPSBjdHJsWzBdWzBdLmxlbmd0aDsKLQkJLy8gbG9vcCB0aHJvdWdoIHJvd3MgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3RybC5sZW5ndGg7IGkrKykgewotCQkJY29sID0gMDsKLQkJCS8vIGxvb3AgdGhyb3VnaCBjb2x1bW5zCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGN0cmxbMF0ubGVuZ3RoOyBqKyspIHsKLQkJCQkvLyBsb29wIHRocm91Z2ggdG8gZ2V0IHRoZSBkZXB0aCB2YWx1ZXMKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGN0cmxbMF1bMF0ubGVuZ3RoOyBrKyspIHsKLQkJCQkJcHRzW3JvdyArIGNvbCArIGtdID0gY3RybFtpXVtqXVtrXTsKLQkJCQl9Ci0JCQkJY29sICs9IGNvbEluY3I7Ci0JCQl9Ci0JCQlyb3cgKz0gcm93SW5jcjsKLQkJfQotCQlyZXR1cm4gcHRzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoMik7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDMwOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCByb3RhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyb3RhdGlvbkdyb3VwLnNldFRleHQoIlJvdGF0aW9uIik7Ci0JCXJvdGF0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeFJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl4Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl4Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeFJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl4Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXhSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMzMwKTsKLQkJeFJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4Um90ID0geFJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeVJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXlSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXlSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl5Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXlSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeVJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJeVJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5Um90ID0geVJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJelJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXpSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXpSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl6Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXpSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJelJvdGF0aW9uLnNldFNlbGVjdGlvbigwKTsKLQkJelJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6Um90ID0gelJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2FtcGxpbmcgVG9sZXJhbmNlOiIpOwotCQlmaW5hbCBTbGlkZXIgc1NsaWRlciA9IG5ldyBTbGlkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQlzU2xpZGVyLnNldE1heGltdW0oMTAxKTsKLQkJc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzU2xpZGVyLnNldFRodW1iKDIpOwotCQlzU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNTbGlkZXIuc2V0U2VsZWN0aW9uKDc1KTsKLQkJc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJR0xVLmdsdU51cmJzUHJvcGVydHkoCi0JCQkJCW51cmIsCi0JCQkJCUdMVS5HTFVfU0FNUExJTkdfVE9MRVJBTkNFLAotCQkJCQlzU2xpZGVyLmdldFNlbGVjdGlvbigpICsgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIEJ1dHRvbiBmaWxsQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZpbGxCdXR0b24uc2V0VGV4dCgiRmlsbCIpOwotCQlmaWxsQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZmlsbEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGZpbGxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJR0xVLmdsdU51cmJzUHJvcGVydHkoCi0JCQkJCQludXJiLAotCQkJCQkJR0xVLkdMVV9ESVNQTEFZX01PREUsCi0JCQkJCQlHTFUuR0xVX0ZJTEwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUdMVS5nbHVOdXJic1Byb3BlcnR5KAotCQkJCQkJbnVyYiwKLQkJCQkJCUdMVS5HTFVfRElTUExBWV9NT0RFLAotCQkJCQkJR0xVLkdMVV9PVVRMSU5FX1BPTFlHT04pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGNvbG9yR3JvdXAgPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbG9yR3JvdXAuc2V0VGV4dCgiRm9yZWdyb3VuZCBjb2xvciIpOwotCQljb2xvckdyb3VwLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCUdMLmdsQ29sb3IzdWIoKGJ5dGUpIHJnYi5yZWQsIChieXRlKSByZ2IuZ3JlZW4sIChieXRlKSByZ2IuYmx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZU51cmJzUmVuZGVyZXIobnVyYik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIk51cmIiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkvLyBzZXQgdXAgbWF0ZXJpYWwgY29sb3Igd2hpY2ggaGVscHMgc2hvdyBjdXJ2ZXMKLQkJZmxvYXQgbWF0X3NwZWN1bGFyW10gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQkJZmxvYXQgbWF0X3NoaW5pbmVzc1tdID0geyAxMDAuMGYgfTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TUEVDVUxBUiwgbWF0X3NwZWN1bGFyKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TSElOSU5FU1MsIG1hdF9zaGluaW5lc3MpOwotCQlHTC5nbENvbG9yTWF0ZXJpYWwoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0FNQklFTlRfQU5EX0RJRkZVU0UpOwotCQkKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSUdIVDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DT0xPUl9NQVRFUklBTCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9BVVRPX05PUk1BTCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX05PUk1BTElaRSk7Ci0JCQotCQludXJiID0gR0xVLmdsdU5ld051cmJzUmVuZGVyZXIoKTsKLQotCQlHTFUuZ2x1TnVyYnNQcm9wZXJ0eSgKLQkJCW51cmIsCi0JCQlHTFUuR0xVX1NBTVBMSU5HX01FVEhPRCwKLQkJCUdMVS5HTFVfUEFUSF9MRU5HVEgpOwotCQkvLyBzYW1wbGluZyB0b2xlcmFuY2UgaXMgc3BlY2lmaWMgZm9yIEdMVS5HTFVfUEFUSF9MRU5HVEgKLQkJR0xVLmdsdU51cmJzUHJvcGVydHkobnVyYiwgR0xVLkdMVV9TQU1QTElOR19UT0xFUkFOQ0UsIDc1LjBmKTsKLQkJR0xVLmdsdU51cmJzUHJvcGVydHkobnVyYiwgR0xVLkdMVV9ESVNQTEFZX01PREUsIEdMVS5HTFVfRklMTCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJLy8gZG8gdHJhbnNsYXRpb24gYW5kIHJvdGF0aW9uCi0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xSb3RhdGVmKHhSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoeVJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih6Um90LCAwLjBmLCAwLjBmLCAxLjBmKTsKLQkJLy8gZGVmaW5lIG51cmJzIHN1cmZhY2UKLQkJZmxvYXRbXSBrbm90cyA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotCQlHTFUuZ2x1QmVnaW5TdXJmYWNlKG51cmIpOwotCQlHTFUuZ2x1TnVyYnNTdXJmYWNlKAotCQkJbnVyYiwgOCwga25vdHMsIDgsIGtub3RzLCAxMiwgMywKLQkJCWNvbnZlcnQoYnVpbGROdXJiKCkpLCA0LCA0LCBHTC5HTF9NQVAyX1ZFUlRFWF8zKTsKLQkJR0xVLmdsdUVuZFN1cmZhY2UobnVyYik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PYmplY3RzVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09iamVjdHNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5MWUwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09iamVjdHNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIE9iamVjdHNUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgY2xhc3MgU2hhcGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGludCBpbmRleDsKLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHNoYXBlCi0JCSAqIEBwYXJhbSBpbmRleCB0aGUgZGlzcGxheSBsaXN0IGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzaGFwZQotCQkgKi8KLQkJU2hhcGUoU3RyaW5nIG5hbWUsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJdm9pZCBkaXNwb3NlKCkgewotCQkJR0wuZ2xEZWxldGVMaXN0cyhpbmRleCwgMSk7Ci0JCX0KLQkJdm9pZCBkcmF3KCkgewotCQkJR0wuZ2xDYWxsTGlzdChpbmRleCk7Ci0JCX0KLQkJU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCX0KLQotCXByaXZhdGUgU2hhcGVbXSBzaGFwZXM7Ci0JcHJpdmF0ZSBTaGFwZSBjdXJyZW50U2hhcGU7Ci0JcHJpdmF0ZSBmbG9hdCB4Um90ID0gMC4wZiwgeVJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBib29sZWFuIGZpbGwgPSB0cnVlOwotCXByaXZhdGUgaW50IHF1YWRyYXRpYzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0xFRVBfTEVOR1RIID0gNTA7Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb250cm9scy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCW5ldyBMYWJlbChjb250cm9scywgU1dULk5PTkUpLnNldFRleHQoIk9iamVjdDoiKTsKLQkJZmluYWwgQ29tYm8gb2JqZWN0c0NvbWJvID0gbmV3IENvbWJvKGNvbnRyb2xzLCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHsKLQkJCW9iamVjdHNDb21iby5hZGQoc2hhcGVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJb2JqZWN0c0NvbWJvLnNlbGVjdCgwKTsKLQkJb2JqZWN0c0NvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbb2JqZWN0c0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBCdXR0b24gZmlsbFRvZ2dsZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udHJvbHMsIFNXVC5DSEVDSyk7Ci0JCWZpbGxUb2dnbGVCdXR0b24uc2V0VGV4dCgiRmlsbCIpOwotCQlmaWxsVG9nZ2xlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZmlsbFRvZ2dsZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmlsbCA9IGZpbGxUb2dnbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBjb2xvckdyb3VwID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldFRleHQoIkZvcmVncm91bmQgY29sb3IiKTsKLQkJY29sb3JHcm91cC5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQlHTC5nbENvbG9yM3ViKChieXRlKSByZ2IucmVkLCAoYnl0ZSkgcmdiLmdyZWVuLCAoYnl0ZSkgcmdiLmJsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMocXVhZHJhdGljKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNoYXBlcyBbaV0uZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaXJjbGUgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gcmFkaXVzCi0JICogQHBhcmFtIHhTaHJpbmsKLQkgKiBAcGFyYW0geVNocmluawotCSAqLwotCXZvaWQgZHJhd0NpcmNsZShmbG9hdCByYWRpdXMsIGZsb2F0IHhTaHJpbmssIGZsb2F0IHlTaHJpbmspIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9QT0xZR09OKTsKLQkJZmxvYXQgZGlhID0gKGZsb2F0KSAyLjAgKiAoZmxvYXQpIE1hdGguUEk7Ci0JCWZvciAoZmxvYXQgYW5nbGUgPSAwLjBmOyBhbmdsZSA8PSBkaWE7IGFuZ2xlICs9IDAuMWYpIHsKLQkJCUdMLmdsVmVydGV4MmQocmFkaXVzICogTWF0aC5jb3MoYW5nbGUpLCByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSkpOwotCQl9Ci0JCUdMLmdsRW5kKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjdWJlIGNlbnRlcmVkIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICogCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEBwYXJhbSBkZXB0aAotCSAqLwotCXZvaWQgZHJhd0N1YmUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgZGVwdGgpIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCS8vIGZyb250Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSBsZWZ0IAkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gdG9wIGxlZnQKLQkJLy8gYmFjawotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYm90dG9tIGxlZnQgCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIHRvcCByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgbGVmdAotCQkvLyBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBib3R0b20gbGVmdAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIHRvcCBsZWZ0CQotCQkvLyByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSBsZWZ0CQkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIHRvcCBsZWZ0Ci0JCS8vIHRvcAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIGhlaWdodCwgLWRlcHRoKTsJLy8gYmFjayBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgbGVmdAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgcmlnaHQKLQkJLy8gYm90dG9tCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgbGVmdAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYmFjayBsZWZ0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgcmlnaHQKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHB5cmFtaWQgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogQHBhcmFtIGRlcHRoCi0JICovCi0Jdm9pZCBkcmF3UHlyYW1pZChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBkZXB0aCkgewotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCS8vIGZyb250Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gbGVmdAkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyByaWdodAotCQkvLyBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGxlZnQJCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIHJpZ2h0CQotCQkvLyBmcm9udAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gbGVmdAkKLQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCBoZWlnaHQsIDAuMGYpOwkJLy8gdG9wCQkJCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIHJpZ2h0Ci0JCS8vIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBsZWZ0CQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyByaWdodAkJCQotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gYm90dG9tCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IGxlZnQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgbGVmdAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBiYWNrIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gZnJvbnQgcmlnaHQKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNxdWFyZSBjZW50ZXJlZCBhdCAwLDAgaW4gdGhlIHZpZXdwb3J0LgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKi8KLQl2b2lkIGRyYXdTcXVhcmUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgewotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIDAuMGYpOwkvLyBib3R0b20gbGVmdCAJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgMC4wZik7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCBoZWlnaHQsIDAuMGYpOwkJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIDAuMGYpOwkvLyB0b3AgbGVmdAotCQlHTC5nbEVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmcm9tIGdsdXRfc2hhcGVzLmMgLgotCSAqIAotCSAqIEBwYXJhbSByCi0JICogQHBhcmFtIFIKLQkgKiBAcGFyYW0gbnNpZGVzCi0JICogQHBhcmFtIHJpbmdzCi0JICovCi0Jdm9pZCBkcmF3VG9ydXMoZmxvYXQgciwgZmxvYXQgUiwgaW50IG5zaWRlcywgaW50IHJpbmdzKSB7Ci0JCWZsb2F0IHJpbmdEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyByaW5nczsKLQkJZmxvYXQgc2lkZURlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIG5zaWRlczsKLQkJZmxvYXQgdGhldGEgPSAwLjBmOwotCQlmbG9hdCBjb3NUaGV0YSA9IDEuMGY7Ci0JCWZsb2F0IHNpblRoZXRhID0gMC4wZjsKLQkJCi0JCWZvciAoaW50IGkgPSByaW5ncyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlmbG9hdCB0aGV0YTEgPSB0aGV0YSArIHJpbmdEZWx0YTsKLQkJCWZsb2F0IGNvc1RoZXRhMSA9IChmbG9hdCkgTWF0aC5jb3ModGhldGExKTsKLQkJCWZsb2F0IHNpblRoZXRhMSA9IChmbG9hdCkgTWF0aC5zaW4odGhldGExKTsKLQkJCUdMLmdsQmVnaW4oR0wuR0xfUVVBRF9TVFJJUCk7Ci0JCQlmbG9hdCBwaGkgPSAwLjBmOwotCQkJCi0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJR0wuZ2xOb3JtYWwzZihjb3NUaGV0YTEgKiBjb3NQaGksIC1zaW5UaGV0YTEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZihjb3NUaGV0YTEgKiBkaXN0LCAtc2luVGhldGExICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQkJR0wuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMLmdsVmVydGV4M2YoY29zVGhldGEgKiBkaXN0LCAtc2luVGhldGEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCX0KLQkJCQotCQkJR0wuZ2xFbmQoKTsKLQkJCXRoZXRhID0gdGhldGExOwotCQkJY29zVGhldGEgPSBjb3NUaGV0YTE7Ci0JCQlzaW5UaGV0YSA9IHNpblRoZXRhMTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgdHJpYW5nbGUgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0Jdm9pZCBkcmF3VHJpYW5nbGUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgewotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIG1pZGRsZSAKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIDAuMGYpOwkvLyBsZWZ0IAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAwLjBmKTsJLy8gcmlnaHQJCSAJCQotCQlHTC5nbEVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRTbGVlcExlbmd0aCgpCi0JICovCi0JaW50IGdldFNsZWVwTGVuZ3RoKCkgewotCQlyZXR1cm4gU0xFRVBfTEVOR1RIOwkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiT2JqZWN0cyI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlxdWFkcmF0aWMgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQlHTFUuZ2x1UXVhZHJpY05vcm1hbHMocXVhZHJhdGljLCBHTFUuR0xVX1NNT09USCk7Ci0JCUdMLmdsTGluZVdpZHRoKDIpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCi0JCS8vIGNyZWF0ZSB0aGUgZGlzcGxheSBsaXN0cyBhbmQgc2hhcGVzCi0JCXNoYXBlcyA9IG5ldyBTaGFwZVsxMV07Ci0JCWludCBpbmRleCA9IDE7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1RyaWFuZ2xlKDIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzBdID0gbmV3IFNoYXBlKCJUcmlhbmdsZSIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdQeXJhbWlkKDIuMGYsIDIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzFdID0gbmV3IFNoYXBlKCJQeXJhbWlkIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1NxdWFyZSgyLjBmLCAyLjBmKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1syXSA9IG5ldyBTaGFwZSgiU3F1YXJlIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0N1YmUoMi4wZiwgMi4wZiwgMi4wZik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbM10gPSBuZXcgU2hhcGUoIkN1YmUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3Q2lyY2xlKDIuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzRdID0gbmV3IFNoYXBlKCJDaXJjbGUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1UGFydGlhbERpc2socXVhZHJhdGljLCAwLjUsIDIuMCwgMTgsIDE4LCA5MCwgMTI1KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s1XSA9IG5ldyBTaGFwZSgiUGFydGlhbCBEaXNrIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJR0xVLmdsdURpc2socXVhZHJhdGljLCAwLjUsIDIuMCwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s2XSA9IG5ldyBTaGFwZSgiRGlzayIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdUb3J1cygxLCAyLCAxOCwgMTgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzddID0gbmV3IFNoYXBlKCJUb3J1cyIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAyLjAsIDE4LCAxOCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbOF0gPSBuZXcgU2hhcGUoIlNwaGVyZSIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVDeWxpbmRlcihxdWFkcmF0aWMsIDIuMCwgMi4wLCA0LCAxOCwgMTgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzldID0gbmV3IFNoYXBlKCJDeWxpbmRlciIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVDeWxpbmRlcihxdWFkcmF0aWMsIDAsIDIuMCwgNCwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1sxMF0gPSBuZXcgU2hhcGUoIkNvbmUiLCBpbmRleCsrKTsKLQotCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbMF07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xNC4wZik7Ci0JCS8vIHJvdGF0ZSBhcm91bmQgWCBhbmQgWSBheGlzCi0JCUdMLmdsUm90YXRlZih5Um90LCAwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHhSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQkvLyBzZXRzIHBvbHlnb24gZmlsbCBtb2RlCi0JCWlmIChmaWxsKSB7Ci0JCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9GSUxMKTsKLQkJfSBlbHNlIHsKLQkJCUdMLmdsUG9seWdvbk1vZGUoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0xJTkUpOwotCQl9Ci0JCWN1cnJlbnRTaGFwZS5kcmF3KCk7Ci0JCXlSb3QgKz0gMS41OwotCQl4Um90ICs9IDEuNTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT3BlbkdMRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNkYTI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT3BlbkdMRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgT3BlbkdMRXhhbXBsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPQotCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImV4YW1wbGVzX29wZW5nbCIpOwotCXByaXZhdGUgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQlwcml2YXRlIE9wZW5HTFRhYltdIHRhYnM7Ci0JcHJpdmF0ZSBpbnQgc2xlZXA7Ci0JCi0JcHVibGljIE9wZW5HTEV4YW1wbGUoKSB7fQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBPcGVuR0xFeGFtcGxlIGVtYmVkZGVkIGluc2lkZQotCSAqIHRoZSBzdXBwbGllZCBwYXJlbnQgQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZXhhbXBsZQotCSAqLwotCXB1YmxpYyBPcGVuR0xFeGFtcGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGFicyA9Ci0JCQluZXcgT3BlbkdMVGFiW10gewotCQkJCW5ldyBBbnRpYWxpYXNpbmdUYWIoKSwKLQkJCQluZXcgQXJlYVRhYigpLAotCQkJCW5ldyBGb2dUYWIoKSwKLQkJCQluZXcgR3JhZGllbnRUYWIoKSwKLQkJCQluZXcgTGlnaHRUYWIoKSwKLQkJCQluZXcgTnVyYlRhYigpLAotCQkJCW5ldyBPYmplY3RzVGFiKCksCi0JCQkJbmV3IFJlZmxlY3Rpb25UYWIoKSwKLQkJCQluZXcgU3RlbmNpbFRhYigpLAotCQkJCW5ldyBUZXh0dXJlVGFiKCksCi0JCQkJbmV3IFRyYW5zcGFyZW5jeVRhYigpCi0JCQl9OwotCQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KHRhYnNbaV0uZ2V0VGFiVGV4dCgpKTsKLQkJCWl0ZW0uc2V0Q29udHJvbCh0YWJzW2ldLmNyZWF0ZVRhYkZvbGRlclBhZ2UodGFiRm9sZGVyKSk7Ci0JCX0KLQkJCi0JCXRhYkZvbGRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJT3BlbkdMVGFiIHRhYiA9IHRhYnNbdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJCXRhYi5zZXRDdXJyZW50KCk7Ci0JCQkJc2xlZXAgPSB0YWIuZ2V0U2xlZXBMZW5ndGgoKTsKLQkJCX0KLQkJfSk7Ci0JCWlmICh0YWJzLmxlbmd0aCA+IDApIHsKLQkJCXRhYnNbMF0uc2V0Q3VycmVudCgpOwotCQkJc2xlZXAgPSB0YWJzWzBdLmdldFNsZWVwTGVuZ3RoKCk7Ci0JCX0KLQkJCi0JCVJ1bm5hYmxlIHRpbWVyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0YWJGb2xkZXIuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJZGlzcGxheSgpOwotCQkJCXRhYkZvbGRlci5nZXREaXNwbGF5KCkudGltZXJFeGVjKHNsZWVwLCB0aGlzKTsKLQkJCX0KLQkJfTsKLQkJdGltZXIucnVuKCk7Ci0JCXRhYkZvbGRlci5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGUgc2NlbmUgb2YgdGhlIGN1cnJlbnQgdGFiLgotCSAqLwotCXZvaWQgZGlzcGxheSgpIHsKLQkJaW50IGluZGV4ID0gdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCXRhYnNbaW5kZXhdLnJlbmRlcigpOwotCQl0YWJzW2luZGV4XS5zd2FwKCk7Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIGFsbCBjb250YWluZWQgdGFicy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRhYkZvbGRlciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewotCQkJdGFic1tpXS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsKLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIEludm9rZXMgYXMgYSBzdGFuZGFsb25lIHByb2dyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlPcGVuR0xFeGFtcGxlIGluc3RhbmNlID0gbmV3IE9wZW5HTEV4YW1wbGUoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KGdldFJlc291cmNlU3RyaW5nKCJ3aW5kb3cudGl0bGUiKSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCEgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoISBkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBTaGVsbCBvcGVuIChEaXNwbGF5IGRpc3BsYXkpIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCW5ldyBPcGVuR0xFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PcGVuR0xUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5OWU4ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLio7Ci0KLS8qKgotICogPGNvZGU+T3BlbkdMVGFiPC9jb2RlPiBpcyB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiBldmVyeSBwYWdlCi0gKiBpbiB0aGUgZXhhbXBsZSdzIHRhYiBmb2xkZXIuICBFYWNoIHBhZ2UgaW4gdGhlIHRhYiBmb2xkZXIKLSAqIGRpc3BsYXlzIGEgZGlmZmVyZW50IGV4YW1wbGUuCi0gKgotICogQW4gT3BlbkdMVGFiIGl0c2VsZiBpcyBub3QgYSBjb250cm9sIGJ1dCBpbnN0ZWFkIHByb3ZpZGVzIGEgaGllcmFyY2h5Ci0gKiB3aXRoIHdoaWNoIHRvIHNoYXJlIGNvZGUgdGhhdCBpcyBjb21tb24gdG8gZXZlcnkgcGFnZSBpbiB0aGUgZm9sZGVyLgotICovCi1hYnN0cmFjdCBjbGFzcyBPcGVuR0xUYWIgewotCXByaXZhdGUgR0xDYW52YXMgZ2xDYW52YXM7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgdGFiRm9sZGVyUGFnZTsKLQlwcml2YXRlIGJvb2xlYW4gc3RlbmNpbFN1cHBvcnQ7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfU0xFRVBfTEVOR1RIID0gMTAwOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGlzIHRhYidzIGNvbnRyb2xzLiAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgotCSAqCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCWFic3RyYWN0IHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWIgZm9sZGVyIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gdGFiRm9sZGVyIHRoZSBwYXJlbnQgdGFiIGZvbGRlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBwYWdlCi0JICovCi0JQ29tcG9zaXRlIGNyZWF0ZVRhYkZvbGRlclBhZ2UoVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQl0YWJGb2xkZXJQYWdlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyUGFnZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEoKTsKLQkJZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotCQlkYXRhLnN0ZW5jaWxTaXplID0gODsKLQkJZ2xDYW52YXMgPSBuZXcgR0xDYW52YXModGFiRm9sZGVyUGFnZSwgU1dULk5PX0JBQ0tHUk9VTkQsIGRhdGEpOwotCQlnbENhbnZhcy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdsQ2FudmFzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlnbENhbnZhcy5zZXRTaXplKDQwMCwgNDAwKTsJCS8vIG5lZWRlZCBmb3Igd2luZG93cwotCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlDb21wb3NpdGUgY29udHJvbENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyUGFnZSwgU1dULk5PTkUpOwotCQljb250cm9sQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29udHJvbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBjcmVhdGUgdGhlIE9wZW5HTCBTY3JlZW4gYW5kIGNvbnRyb2xzCi0JCXNldEN1cnJlbnQoKTsKLQkJc2V0dXBWaWV3aW5nQXJlYSgpOwotCi0JCS8vIGRldGVybWluZSBpZiBuYXRpdmUgc3RlbmNpbCBzdXBwb3J0IGlzIGF2YWlsYWJsZQotCQlpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMV07Ci0JCUdMLmdsR2V0SW50ZWdlcnYoR0wuR0xfU1RFTkNJTF9CSVRTLCBwYXJhbSk7Ci0JCXN0ZW5jaWxTdXBwb3J0ID0gcGFyYW1bMF0gIT0gMDsKLQotCQlpbml0KCk7Ci0KLQkJaWYgKCFpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgfHwgaGFzU3RlbmNpbFN1cHBvcnQoKSkgewotCQkJY3JlYXRlQ29udHJvbHMoY29udHJvbENvbXBvc2l0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250cm9sQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KCJUaGlzIHRhYiByZXF1aXJlcyBuYXRpdmUgc3RlbmNpbCBzdXBwb3J0LiIpOwotCQl9Ci0KLQkJcmV0dXJuIHRhYkZvbGRlclBhZ2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyB0YWIuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdsQ2FudmFzIGZvciB0aGlzIHRhYi4KLQkgKiAKLQkgKiBAcmV0dXJuIENhbnZhcwotCSAqLwotCUdMQ2FudmFzIGdldEdsQ2FudmFzKCkgewotCQlyZXR1cm4gZ2xDYW52YXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGhlIGV4YW1wbGUKLQkgKiBzaG91bGQgc2xlZXAgYmV0d2VlbiBhbmltYXRpb24gcmVkcmF3cy4gIEFzIHRoaXMgbGVuZ3RoCi0JICogaW5jcmVhc2VzLCB1c2VyIHJlc3BvbnNpdmVuZXNzIGluY3JlYXNlcyBhbmQgdGhlIGZyZXF1ZW5jeSBvZgotCSAqIGFuaW1hdGlvbiByZWRyYXdzIGRlY3JlYXNlcy4gIFN1YmNsYXNzZXMgd2l0aCBtb3ZpbmcgYW5pbWF0aW9ucwotCSAqIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYQotCSAqIHNtYWxsZXIgdmFsdWUgaWYgdGhlaXIgYW5pbWF0aW9ucyBkbyBub3Qgb2NjdXIgZnJlcXVlbnRseSBlbm91Z2guIAotCSAqCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJldHdlZW4gcmVkcmF3cwotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0xFRVBfTEVOR1RIOwkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHRleHQgZm9yIHRoZSB0YWIgaXRlbQotCSAqLwotCWFic3RyYWN0IFN0cmluZyBnZXRUYWJUZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYWNoaW5lIGhhcyBuYXRpdmUgc3RlbmNpbHMgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc1N0ZW5jaWxTdXBwb3J0KCkgewotCQlyZXR1cm4gc3RlbmNpbFN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBPcGVuR0wgcmVzb3VyY2VzIGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGluaXQoKTsKLQotCS8qKgotCSAqIExvYWRzIGEgdGV4dHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSB0ZXh0dXJlW10KLQkgKi8KLQlzdGF0aWMgdm9pZCBsb2FkVGV4dHVyZShHTENhbnZhcyBjb250ZXh0LCBTdHJpbmcgZmlsZU5hbWUsIGludCBpbmRleCwgaW50W10gdGV4dHVyZSkgewotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVbaW5kZXhdKTsKLQkJSW1hZ2VEYXRhIHNvdXJjZSA9Ci0JCQluZXcgSW1hZ2VEYXRhKE9wZW5HTFRhYi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKSk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBzb3VyY2UpOwotCQlJbWFnZSBuZXdJbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU2LCAyNTYpOwotCQlHQyBnYyA9IG5ldyBHQyhuZXdJbWFnZSk7Ci0JCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAwLCAwLCAyNTYsIDI1Nik7Ci0JCXNvdXJjZSA9IG5ld0ltYWdlLmdldEltYWdlRGF0YSgpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCXNvdXJjZSA9IEltYWdlRGF0YVV0aWwuY29udmVydEltYWdlRGF0YShzb3VyY2UpOwotCQluZXdJbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJR0wuZ2xUZXhJbWFnZTJEKAotCQkJR0wuR0xfVEVYVFVSRV8yRCwgMCwgMywgCi0JCQlzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQsIDAsCi0JCQlHTC5HTF9SR0IsIEdMLkdMX1VOU0lHTkVEX0JZVEUsIHNvdXJjZS5kYXRhKTsKLQkJR0wuZ2xUZXhQYXJhbWV0ZXJpKEdMLkdMX1RFWFRVUkVfMkQsIEdMLkdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0wuR0xfTElORUFSKTsKLQkJR0wuZ2xUZXhQYXJhbWV0ZXJpKEdMLkdMX1RFWFRVUkVfMkQsIEdMLkdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0wuR0xfTElORUFSKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXJzIHRoaXMgdGFiLgotCSAqLwotCXZvaWQgcmVuZGVyKCkgewotCQlzZXRDdXJyZW50KCk7Ci0JCWlmICghaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHx8IGhhc1N0ZW5jaWxTdXBwb3J0KCkpIHsKLQkJCXJlbmRlclNjZW5lKCk7Ci0JCX0gZWxzZSB7Ci0JCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGUgc2NlbmUgZm9yIHRoaXMgdGFiLiAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlLgotCSAqLwotCWFic3RyYWN0IHZvaWQgcmVuZGVyU2NlbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRhYiByZXF1aXJlcyBzdGVuY2lsIHN1cHBvcnQgaW4gb3JkZXIgdG8gZGlzcGxheQotCSAqIHByb3Blcmx5LiBTdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyByZW5kZXJpbmcgY29udGV4dCB0byBiZSBjdXJyZW50LgotCSAqLwotCXZvaWQgc2V0Q3VycmVudCgpIHsKLQkJZ2xDYW52YXMuc2V0Q3VycmVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSB2aWV3aW5nIGFyZWEgZm9yIHRoZSBPcGVuR0wgc2NyZWVuLiAgVGhlIGRlZmF1bHQKLQkgKiBiZWhhdmlvciBpcyB0byB1c2UgYSBwZXJzcGVjdGl2ZSB2aWV3LCBidXQgdGhlcmUgYWxzbyBleGlzdCBmcnVzdHJ1bQotCSAqIGFuZCBvcnRobyB2aWV3cy4gIFN1YmNsYXNzZXMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0Jdm9pZCBzZXR1cFZpZXdpbmdBcmVhKCkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGdsQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLQkJaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLQkJaW50IGhlaWdodCA9IHJlY3QuaGVpZ2h0OwotCQloZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIDEpOwotCQlHTC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlHTC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJPSkVDVElPTik7CS8vIHNlbGVjdCB0aGUgcHJvamVjdGlvbiBtYXRyaXgKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsJCQkJLy8gcmVzZXQgdGhlIHByb2plY3Rpb24gbWF0cml4Ci0JCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIHdpZHRoIC8gKGZsb2F0KSBoZWlnaHQ7Ci0JCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLQkJR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX01PREVMVklFVyk7CS8vIHNlbGVjdCB0aGUgbW9kZWx2aWV3IG1hdHJpeAotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIFN3YXBzIHRoZSBidWZmZXJzLgotCSAqLwotCXZvaWQgc3dhcCgpIHsKLQkJZ2xDYW52YXMuc3dhcEJ1ZmZlcnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1JlZmxlY3Rpb25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvUmVmbGVjdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjY1NGIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvUmVmbGVjdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgUmVmbGVjdGlvblRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWSA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWiA9IDEuNjY2NjY2NmY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsWCA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBiYWxsUm90ID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IGN1YmVYID0gMi41ZjsKLQlwcml2YXRlIGZsb2F0IGN1YmVZID0gLTIuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBjdWJlWiA9IDIuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IHlQb3MgPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgelBvcyA9IDIyLjBmOwotCXByaXZhdGUgZmxvYXQgYmFsbFJvdFNwZWVkID0gMC4wZjsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBpbnRbXSB0ZXh0dXJlcyA9IG5ldyBpbnRbM107Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCUxJU1RfSU5ERVhfQkFMTCA9IDEsTElTVF9JTkRFWF9CT1ggPSAyLAotCQlMSVNUX0lOREVYX01JUlJPUiA9IDMsIExJU1RfSU5ERVhfUk9PTSA9IDQ7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCVRFWFRVUkVfSU5ERVhfQkFMTCA9IDAsIFRFWFRVUkVfSU5ERVhfRkxPT1IgPSAxLAotCQlURVhUVVJFX0lOREVYX0JPWCA9IDI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gSU1BR0VTID0gewotCQkiaW1hZ2VzL0JhbGwuanBnIiwgImltYWdlcy9GbG9vci5qcGciLCAiaW1hZ2VzL0JveC5ibXAiIH07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogRHJhd3MgdGhlIGJhbGwKLQkgKi8KLQl2b2lkIGNyZWF0ZUJhbGwoKSB7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX0JBTEwsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmluZFRleHR1cmUoR0wuR0xfVEVYVFVSRV8yRCwgdGV4dHVyZXNbVEVYVFVSRV9JTkRFWF9CQUxMXSk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAwLjM1ZiwgMzIsIDE2KTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIGJveAotCSAqLwotCXZvaWQgY3JlYXRlQm94KCkgewotCQlmbG9hdCBzaXplID0gMS4wZjsKLQkJR0wuZ2xOZXdMaXN0KExJU1RfSU5ERVhfQk9YLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xDb2xvcjRmKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQk9YXSk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBmcm9udAkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJLy8gYmFjawkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAtMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyBsZWZ0CQotCQlHTC5nbE5vcm1hbDNmKC0xLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCAtc2l6ZSk7Ci0JCS8vIHJpZ2h0CQotCQlHTC5nbE5vcm1hbDNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyB0b3AJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCS8vIGJvdHRvbQkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAtMS4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGJhbGxUcmFuc2xhdGlvbiA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYmFsbFRyYW5zbGF0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQliYWxsVHJhbnNsYXRpb24uc2V0VGV4dCgiQmFsbCBUcmFuc2xhdGlvbiIpOwotCi0JCW5ldyBMYWJlbChiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgYmFsbFhQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQliYWxsWFBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWJhbGxYUG9zU2xpZGVyLnNldE1heGltdW0oMzgpOwotCQliYWxsWFBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsWFBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDE4KTsKLQkJYmFsbFhQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWJhbGxYID0gKGZsb2F0KSAoYmFsbFhQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAxOCkgLyA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxZUG9zU2xpZGVyID0gbmV3IFNsaWRlcihiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQliYWxsWVBvc1NsaWRlci5zZXRNYXhpbXVtKDM4KTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxOCk7Ci0JCWJhbGxZUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWSA9IChmbG9hdCkgKGJhbGxZUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMTgpIC8gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciBiYWxsWlBvc1NsaWRlciA9IG5ldyBTbGlkZXIoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFpQb3NTbGlkZXIuc2V0TWF4aW11bSgyNCk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldFRodW1iKDEpOwotCQliYWxsWlBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQliYWxsWlBvc1NsaWRlci5zZXRTZWxlY3Rpb24oNCk7Ci0JCWJhbGxaUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWiA9IChmbG9hdCkgKGJhbGxaUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpICsgMSkgLyAzOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBjdWJlVHJhbnNsYXRpb24gPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWN1YmVUcmFuc2xhdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY3ViZVRyYW5zbGF0aW9uLnNldFRleHQoIkN1YmUgVHJhbnNsYXRpb24iKTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVYUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWFBvc1NsaWRlci5zZXRNYXhpbXVtKDE0KTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxMSk7Ci0JCWN1YmVYUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdWJlWCA9IChmbG9hdCkgKGN1YmVYUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gNikgLyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVZUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWVBvc1NsaWRlci5zZXRNYXhpbXVtKDE0KTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyKTsKLQkJY3ViZVlQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1YmVZID0gKGZsb2F0KSAoY3ViZVlQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSA2KSAvIDI7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgY3ViZVpQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGN1YmVUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQljdWJlWlBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWN1YmVaUG9zU2xpZGVyLnNldE1heGltdW0oMTApOwotCQljdWJlWlBvc1NsaWRlci5zZXRNaW5pbXVtKDEpOwotCQljdWJlWlBvc1NsaWRlci5zZXRUaHVtYigxKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIpOwotCQljdWJlWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3ViZVogPSAoZmxvYXQpIChjdWJlWlBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSArIDIpIC8gMjsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJSb29tIFJvdGF0aW9uIik7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWFBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlblhQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHNjcmVlblhQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAyMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWVBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlbllQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHNjcmVlbllQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgLSAyMDsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgc2NyZWVuWlBvc1NsaWRlciA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRNYXhpbXVtKDQyKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXNjcmVlblpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDIwKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHNjcmVlblpQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgKyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiQmFsbCBSb3RhdGlvbiBTcGVlZDoiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxSb3RTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQliYWxsUm90U2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRNYXhpbXVtKDIyKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsUm90U2xpZGVyLnNldFRodW1iKDIpOwotCQliYWxsUm90U2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxSb3RTbGlkZXIuc2V0U2VsZWN0aW9uKDApOwotCQliYWxsUm90U2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsUm90U3BlZWQgPSBiYWxsUm90U2xpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIG1pcnJvcgotCSAqLwotCXZvaWQgY3JlYXRlTWlycm9yKCkgewotCQlHTC5nbE5ld0xpc3QoTElTVF9JTkRFWF9NSVJST1IsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAwLjRmKTsKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIHJvb20KLQkgKi8KLQl2b2lkIGNyZWF0ZVJvb20oKSB7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX1JPT00sIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBsZWZ0IHdhbGwKLQkJR0wuZ2xOb3JtYWwzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgNi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIC00LjBmLCAwLjBmKTsKLQkJLy8gcmlnaHQgd2FsbAotCQlHTC5nbE5vcm1hbDNmKC0xLjBmLCAwLjBmLCAwMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgNC4wZiwgNi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCAwLjBmKTsKLQkJLy8gY2VpbGluZwkKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAtMS4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgNC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbEVuZCgpOwotCQkvLyBiYWNrIHdhbGwgd2l0aCB0cmlhbmdsZSBzdHJpcCB0byBpbGxpbWluYXRlIHQtaW50ZXJzZWN0aW9ucyAKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRV9TVFJJUCk7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDIuMiwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIC00LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAtMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDQuMCwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtNC4wLCAtNC4wLCAwLjApOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJLy8gZHJhdyBmbG9vcgotCQlHTC5nbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmluZFRleHR1cmUoR0wuR0xfVEVYVFVSRV8yRCwgdGV4dHVyZXNbVEVYVFVSRV9JTkRFWF9GTE9PUl0pOwotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gZmxvb3IKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgNi4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgLTQuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbEVuZCgpOwotCQkvLyBkcmF3IG1pcnJvciBmcmFtZQotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQk9YXSk7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyB0b3AKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4yZiwgMi4yZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgMi4yZiwgMC4wZik7Ci0JCS8vIHJpZ2h0Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMGYsIDAuMGYpOwotCQkvLyBib3R0b20KLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4yZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgLTIuMmYsIDAuMGYpOwotCQkvLyBsZWZ0Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMmYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9CQUxMLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhMSVNUX0lOREVYX0JPWCwgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9NSVJST1IsIDEpOwotCQlHTC5nbERlbGV0ZUxpc3RzKExJU1RfSU5ERVhfUk9PTSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiUmVmbGVjdGlvbiI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlpZiAoIWhhc1N0ZW5jaWxTdXBwb3J0KCkpIHJldHVybjsKLQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLQkJR0wuZ2xDbGVhclN0ZW5jaWwoMCk7Ci0JCUdMLmdsR2VuVGV4dHVyZXMoSU1BR0VTLmxlbmd0aCwgdGV4dHVyZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElNQUdFUy5sZW5ndGg7IGkrKykgewotCQkJbG9hZFRleHR1cmUoZ2V0R2xDYW52YXMoKSwgSU1BR0VTW2ldLCBpLCB0ZXh0dXJlcyk7Ci0JCX0KLQotCQlHTC5nbFNoYWRlTW9kZWwoR0wuR0xfU01PT1RIKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0wuR0xfU01PT1RIKTsKLQkJR0xVLmdsdVF1YWRyaWNUZXh0dXJlKHF1YWRyYXRpYywgdHJ1ZSk7Ci0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0xFUVVBTCk7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCUdMLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0KLQkJLy8gc2V0IHVwIHRoZSBsaWdodHMKLQkJZmxvYXRbXSBMaWdodEFtYiA9IHsgMC43ZiwgMC43ZiwgMC43ZiwgMS4wZiB9OwotCQlmbG9hdFtdIExpZ2h0RGlmID0geyAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0JCWZsb2F0W10gbGlnaHRzQW1iaWVudCA9IHsgMC41ZiwgMC41ZiwgMC41ZiwgMS4wZiB9OwotCQlHTC5nbExpZ2h0TW9kZWxmdihHTC5HTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBsaWdodHNBbWJpZW50KTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfQU1CSUVOVCwgTGlnaHRBbWIpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9ESUZGVVNFLCBMaWdodERpZik7Ci0KLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NNT09USCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCi0JCWNyZWF0ZVJvb20oKTsKLQkJY3JlYXRlQmFsbCgpOwotCQljcmVhdGVCb3goKTsKLQkJY3JlYXRlTWlycm9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaXNTdGVuY2lsU3VwcG9ydE5lZWRlZAotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMVS5nbHVMb29rQXQoeFBvcywgeVBvcywgelBvcywgMCwgMCwgMCwgMCwgMSwgMCk7Ci0JCS8vIGNsaXAgcGxhbmUgZXF1YXRpb24KLQkJZG91YmxlIGNsaXBFcXVhdGlvbltdID0geyAwLjBmLCAwLjBmLCAtMS4wZiwgMC4wZiB9OwotCQlmbG9hdFtdIExpZ2h0UG9zID0geyAwLjBmLCAyLjBmLCA3LjBmLCAxLjBmIH07Ci0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gZW5hYmxlIHN0ZW5jaWwgYnVmZmVyIGZvciAibWFya2luZyIgdGhlIG1pcnJvcgkJCi0JCUdMLmdsRW5hYmxlKEdMLkdMX1NURU5DSUxfVEVTVCk7Ci0JCS8vIHNldCB0aGUgc3RlbmNpbCBidWZmZXIgdG8gMSB3aGVyZSBhIHBvbHlnb24gaXMgZHJhd24KLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9BTFdBWVMsIDEsIDEpOwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9SRVBMQUNFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfTUlSUk9SKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsQ29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0VRVUFMLCAxLCAxKTsKLQkJLy8gZHJhdyB3aGVyZSB0aGUgc3RlbmNpbCBpcyAxCQkJCQkJCi0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0tFRVApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DTElQX1BMQU5FMCk7Ci0JCUdMLmdsQ2xpcFBsYW5lKEdMLkdMX0NMSVBfUExBTkUwLCBjbGlwRXF1YXRpb24pOwotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xTY2FsZWYoMS4wZiwgMS4wZiwgLTEuMGYpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9QT1NJVElPTiwgTGlnaHRQb3MpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfUk9PTSk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKGN1YmVYLCBjdWJlWSwgY3ViZVopOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQk9YKTsJCQkvLyByZWZsZWN0aW9uCi0JCUdMLmdsUG9wTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZihiYWxsWCwgYmFsbFksIGJhbGxaKTsKLQkJR0wuZ2xSb3RhdGVmKGJhbGxSb3QsIDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQkFMTCk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfQ0xJUF9QTEFORTApOwotCQlHTC5nbERpc2FibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfUE9TSVRJT04sIExpZ2h0UG9zKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfTUlSUk9SKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfUk9PTSk7Ci0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoY3ViZVgsIGN1YmVZLCBjdWJlWik7Ci0JCUdMLmdsQ2FsbExpc3QoTElTVF9JTkRFWF9CT1gpOwotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoYmFsbFgsIGJhbGxZLCBiYWxsWik7Ci0JCUdMLmdsUm90YXRlZihiYWxsUm90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX0JBTEwpOwotCQliYWxsUm90ICs9IGJhbGxSb3RTcGVlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1N0ZW5jaWxUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvU3RlbmNpbFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjMzN2U2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvU3RlbmNpbFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgU3RlbmNpbFRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBTaGFwZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvcgotCQkgKiAKLQkJICogQHBhcmFtIG5hbWUgdGhlIHNoYXBlJ3MgbmFtZQotCQkgKi8KLQkJU2hhcGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCS8qKgotCQkgKiBEcmF3cyB0aGlzIHNoYXBlLgotCQkgKi8KLQkJYWJzdHJhY3Qgdm9pZCBkcmF3KCk7Ci0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCQkgKiAKLQkJICogQHJldHVybiBTdHJpbmcKLQkJICovCi0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNoYXBlW10gc2hhcGVzID0gbmV3IFNoYXBlWzVdOwotCXByaXZhdGUgU2hhcGUgY3VycmVudFNoYXBlOwotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAsIHlQb3MgPSAwOwotCXByaXZhdGUgZmxvYXQgc2l6ZSA9IDAuNDVmOwotCXByaXZhdGUgaW50IHRleHR1cmU7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTUFHRSA9ICJpbWFnZXMvc3BsYXNoLmJtcCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb21wb3NpdGUgY29udHJvbHMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbnRyb2xzLnNldExheW91dChsYXlvdXQpOwotCQluZXcgTGFiZWwoY29udHJvbHMsIFNXVC5OT05FKS5zZXRUZXh0KCJPYmplY3Q6Iik7Ci0JCWZpbmFsIENvbWJvIHNoYXBlQ29tYm8gPSBuZXcgQ29tYm8oY29udHJvbHMsIFNXVC5SRUFEX09OTFkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkrKykgewotCQkJc2hhcGVDb21iby5hZGQoc2hhcGVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2hhcGVDb21iby5zZWxlY3QoMCk7Ci0JCXNoYXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1cnJlbnRTaGFwZSA9IHNoYXBlc1tzaGFwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiU2l6ZToiKTsKLQkJZmluYWwgU2xpZGVyIHNpemVTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotCQlzaXplU2xpZGVyLnNldFZhbHVlcygwLCAxNSwgNzUsIDUsIDUsIDEwKTsKLQkJc2l6ZVNsaWRlci5zZXRTZWxlY3Rpb24oNDUpOwotCQlzaXplU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzaXplID0gKChmbG9hdCkgc2l6ZVNsaWRlci5nZXRTZWxlY3Rpb24oKSkgLyAxMDA7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFNsZWVwTGVuZ3RoKCkKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBTTEVFUF9MRU5HVEg7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlN0ZW5jaWwiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJaWYgKCFoYXNTdGVuY2lsU3VwcG9ydCgpKSByZXR1cm47Ci0JCQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ2xlYXJEZXB0aCgxLjBmKTsKLQkJaW50W10gdGV4dHVyZU91dCA9IG5ldyBpbnRbMV07Ci0JCUdMLmdsR2VuVGV4dHVyZXMoMSwgdGV4dHVyZU91dCk7Ci0JCWxvYWRUZXh0dXJlKGdldEdsQ2FudmFzKCksIElNQUdFLCAwLCB0ZXh0dXJlT3V0KTsKLQkJdGhpcy50ZXh0dXJlID0gdGV4dHVyZU91dFswXTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCS8vIGNyZWF0ZSBzaGFwZXMKLQkJc2hhcGVzWzBdID0gbmV3IFNoYXBlKCJUcmlhbmdsZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQkJCUdMLmdsVmVydGV4M2YoMC4wZiwgc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIDAuMGYpOwotCQkJCUdMLmdsRW5kKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzFdID0gbmV3IFNoYXBlKCJEaXNrIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTFUuZ2x1RGlzayhxdWFkcmF0aWMsIDAuMGYsIHNpemUsIDMyLCAzMik7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzJdID0gbmV3IFNoYXBlKCJTcXVhcmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsUmVjdGYoLXNpemUsIC1zaXplLCBzaXplLCBzaXplKTsKLQkJCX0KLQkJfTsKLQotCQlzaGFwZXNbM10gPSBuZXcgU2hhcGUoIkhvdXIgR2xhc3MiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVTKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsRW5kKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzRdID0gbmV3IFNoYXBlKCJTdGFyIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigtMC4zZiwgMCwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigyICogc2l6ZSAtIDAuM2YsIDAsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2Yoc2l6ZSAtIDAuM2YsIDIgKiBzaXplICogMC44NWYsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoMiAqIHNpemUgLSAwLjNmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAgLSAwLjNmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUgLSAwLjNmLCAtc2l6ZSAqIDAuODVmLCAwLjBmKTsKLQkJCQlHTC5nbEVuZCgpOwotCQkJfQotCQl9OwotCi0JCWN1cnJlbnRTaGFwZSA9IHNoYXBlc1swXTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkCi0JICovCi0JYm9vbGVhbiBpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcigKLQkJCUdMLkdMX0NPTE9SX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX1NURU5DSUxfQlVGRkVSX0JJVCk7Ci0KLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKAotCQkJKGZsb2F0KSAoMS41ICogTWF0aC5jb3MoeFBvcykpLAotCQkJKGZsb2F0KSAoMS4wICogTWF0aC5zaW4oeVBvcykpLAotCQkJLTMuMGYpOwotCQl4UG9zICs9IDAuMTVmOwotCQl5UG9zICs9IDAuM2Y7Ci0KLQkJR0wuZ2xDb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlHTC5nbFN0ZW5jaWxGdW5jKEdMLkdMX0FMV0FZUywgMSwgMSk7Ci0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX1JFUExBQ0UpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQotCQljdXJyZW50U2hhcGUuZHJhdygpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9FUVVBTCwgMSwgMSk7Ci0JCUdMLmdsU3RlbmNpbE9wKEdMLkdMX0tFRVAsIEdMLkdMX0tFRVAsIEdMLkdMX0tFRVApOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCS8vIGxvYWQgdGhlIHRleHR1cmUgYmVoaW5kIHRoZSBzdGVuY2lsIG9iamVjdAotCQlHTC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTMuMWYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjg1ZiwgLTAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuODVmLCAtMC44NWYsIDEuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC44NWYsIDAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjg1ZiwgMC44NWYsIDEuMGYpOwotCQlHTC5nbEVuZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVGV4dHVyZVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UZXh0dXJlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYWUxMWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UZXh0dXJlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUZXh0dXJlVGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGZsb2F0IHlyb3QgPSAwLCB6cm90ID0gMDsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC0yMDsKLQlwcml2YXRlIGludCB0ZXh0dXJlID0gMDsKLQlwcml2YXRlIGZsb2F0W11bXVtdIHBvaW50cyA9IG5ldyBmbG9hdFs0NV1bNDVdWzNdOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTUFHRSA9ICJpbWFnZXMvc3BsYXNoLmJtcCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl6TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXpNb3ZlLnNldE1heGltdW0oMjQpOwotCQl6TW92ZS5zZXRNaW5pbXVtKDApOwotCQl6TW92ZS5zZXRUaHVtYig0KTsKLQkJek1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJek1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDMwOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRTbGVlcExlbmd0aCgpCi0JICovCi0JaW50IGdldFNsZWVwTGVuZ3RoKCkgewotCQlyZXR1cm4gU0xFRVBfTEVOR1RIOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJUZXh0dXJlIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCS8vR0wuZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuM2YsIDEuMGYpOyAKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0JCWludFtdIHRleHR1cmVPdXQgPSBuZXcgaW50WzFdOwotCQlHTC5nbEdlblRleHR1cmVzKDEsIHRleHR1cmVPdXQpOwotCQlsb2FkVGV4dHVyZShnZXRHbENhbnZhcygpLCBJTUFHRSwgMCwgdGV4dHVyZU91dCk7Ci0JCXRleHR1cmUgPSB0ZXh0dXJlT3V0WzBdOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0JBQ0ssIEdMLkdMX0ZJTEwpOwotCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05ULCBHTC5HTF9MSU5FKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElTVF9NT0RFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBpbml0aWFsaXplIHBvaW50cwkKLQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NTsgeCsrKSB7Ci0JCQlmb3IgKGludCB5ID0gMDsgeSA8IDQ1OyB5KyspIHsKLQkJCQlwb2ludHNbeF1beV1bMF0gPSB4IC8gNS4wZiAtIDQuNWY7Ci0JCQkJcG9pbnRzW3hdW3ldWzFdID0geSAvIDUuMGYgLSA0LjVmOwotCQkJCXBvaW50c1t4XVt5XVsyXSA9Ci0JCQkJCShmbG9hdCkgTWF0aC5zaW4oCi0JCQkJCQkoKCh4IC8gNS4wZikgKiA0MC4wZikgLyAzNjAuMGYpICogTWF0aC5QSSAqIDIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih5cm90LCAwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHpyb3QsIDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwotCi0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IDQ0OyB4KyspIHsKLQkJCWZvciAoaW50IHkgPSAwOyB5IDwgNDQ7IHkrKykgewotCQkJCWZsb2F0IGZ4ID0geCAvIDQ0LjBmOwotCQkJCWZsb2F0IGZ5ID0geSAvIDQ0LjBmOwotCQkJCWZsb2F0IGZ4YiA9ICh4ICsgMSkgLyA0NC4wZjsKLQkJCQlmbG9hdCBmeWIgPSAoeSArIDEpIC8gNDQuMGY7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4LCBmeSk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigKLQkJCQkJcG9pbnRzW3hdW3ldWzBdLAotCQkJCQlwb2ludHNbeF1beV1bMV0sCi0JCQkJCXBvaW50c1t4XVt5XVsyXSk7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4LCBmeWIpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMF0sCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMV0sCi0JCQkJCXBvaW50c1t4XVt5ICsgMV1bMl0pOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeGIsIGZ5Yik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigKLQkJCQkJcG9pbnRzW3ggKyAxXVt5ICsgMV1bMF0sCi0JCQkJCXBvaW50c1t4ICsgMV1beSArIDFdWzFdLAotCQkJCQlwb2ludHNbeCArIDFdW3kgKyAxXVsyXSk7Ci0JCQkJR0wuZ2xUZXhDb29yZDJmKGZ4YiwgZnkpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMF0sCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMV0sCi0JCQkJCXBvaW50c1t4ICsgMV1beV1bMl0pOwotCQkJfQotCQl9Ci0JCUdMLmdsRW5kKCk7Ci0JCS8vIHBlcmZvcm0gd2F2ZSBtb3Rpb24KLQkJZm9yIChpbnQgeSA9IDA7IHkgPCA0NTsgeSsrKSB7Ci0JCQlmbG9hdCBob2xkID0gcG9pbnRzWzBdW3ldWzJdOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NDsgeCsrKSB7Ci0JCQkJcG9pbnRzW3hdW3ldWzJdID0gcG9pbnRzW3ggKyAxXVt5XVsyXTsKLQkJCX0KLQkJCXBvaW50c1s0NF1beV1bMl0gPSBob2xkOwotCQl9Ci0JCXlyb3QgKz0gMC45ZjsKLQkJenJvdCArPSAwLjZmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVHJhbnNwYXJlbmN5VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RyYW5zcGFyZW5jeVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDlkYjUzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVHJhbnNwYXJlbmN5VGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBUcmFuc3BhcmVuY3lUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXRbXSBhbHBoYXMgPSB7IDAuM2YsIDAuNWYsIDEuMGYgfTsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBpbnQgY3VycmVudFNlbGVjdGlvbiA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50Ci0JCUlOREVYX1RSSUFOR0xFID0gMSwgSU5ERVhfU1BIRVJFID0gMiwgSU5ERVhfRElTSyA9IDM7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gT0JKRUNUUyA9IHsiVHJpYW5nbGUiLCAiU3BoZXJlIiwgIkRpc2siIH07Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUNvbXBvc2l0ZSBvYmplY3RHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJb2JqZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCW9iamVjdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCW5ldyBMYWJlbChvYmplY3RHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIk9iamVjdDoiKTsKLQkJZmluYWwgQ29tYm8gb2JqZWN0Q29tYm8gPSBuZXcgQ29tYm8ob2JqZWN0R3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCW9iamVjdENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9iamVjdENvbWJvLnNldEl0ZW1zKE9CSkVDVFMpOwotCQlvYmplY3RDb21iby5zZWxlY3QoMCk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiVHJhbnNwYXJlbmN5OiIpOwotCQlmaW5hbCBTbGlkZXIgdHJhbnNwYXJlbmN5U2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJdHJhbnNwYXJlbmN5U2xpZGVyLnNldFZhbHVlcygwLCAwLCAxMSwgMSwgMSwgMik7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRTZWxlY3Rpb24oNyk7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmxvYXQgYWxwaGEgPSB0cmFuc3BhcmVuY3lTbGlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJYWxwaGEgPSAxLjBmIC0gYWxwaGEgLyAxMDsKLQkJCQlhbHBoYXNbY3VycmVudFNlbGVjdGlvbiAtIDFdID0gYWxwaGE7Ci0JCQl9Ci0JCX0pOwotCQlvYmplY3RDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IG9iamVjdENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgKyAxOwotCQkJCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRTZWxlY3Rpb24oCi0JCQkJCShpbnQpICgoMS4wZiAtIGFscGhhc1tjdXJyZW50U2VsZWN0aW9uIC0gMV0pICogMTApKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfRElTSywgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfU1BIRVJFLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhJTkRFWF9UUklBTkdMRSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiVHJhbnNwYXJlbmN5IjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9DVUxMX0ZBQ0UpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQkvLyBjcmVhdGUgZGlzcGxheSBsaXN0cwkJCi0JCUdMLmdsTmV3TGlzdChJTkRFWF9TUEhFUkUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfRklMTCk7Ci0JCUdMVS5nbHVTcGhlcmUocXVhZHJhdGljLCAxLjUsIDMyLCAzMik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoSU5ERVhfRElTSywgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVRdWFkcmljRHJhd1N0eWxlKHF1YWRyYXRpYywgR0xVLkdMVV9GSUxMKTsKLQkJR0xVLmdsdURpc2socXVhZHJhdGljLCAxLjAsIDMsIDMyLCAzMik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoSU5ERVhfVFJJQU5HTEUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAyLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMi4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VsZWN0aW9uVGFiLnByb2Nlc3NQaWNrIChpbnRbXSwgaW50KQotCSAqLwotCXZvaWQgcHJvY2Vzc1BpY2soaW50W10gcFNlbGVjdEJ1ZmYsIGludCBoaXRzKSB7Ci0JCWludCB6RGVwdGg7Ci0JCWludCB0ZW1wU2VsZWN0aW9uID0gcFNlbGVjdEJ1ZmZbM107Ci0JCXpEZXB0aCA9IHBTZWxlY3RCdWZmWzJdOwotCQkvLyBwaWNrIG9iamVjdCB3aXRoIGxhcmdlc3QgeiB2YWx1ZQotCQlmb3IgKGludCBpID0gNDsgaSA8PSA0ICogKGhpdHMgLSAxKTsgaSA9IGkgKyA0KSB7Ci0JCQlpZiAoekRlcHRoID4gcFNlbGVjdEJ1ZmZbaSArIDJdKSB7Ci0JCQkJekRlcHRoID0gcFNlbGVjdEJ1ZmZbaSArIDJdOwotCQkJCXRlbXBTZWxlY3Rpb24gPSBwU2VsZWN0QnVmZltpICsgM107Ci0JCQl9Ci0JCX0KLQkJaWYgKHRlbXBTZWxlY3Rpb24gPiAwKSBjdXJyZW50U2VsZWN0aW9uID0gdGVtcFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJLy8gZHJhdyBpdGVtcyB3aXRoIHRyYW5zcGFyZW50IHF1YWxpdGllcyBpbiByZXZlcnNlIFogb3JkZXIKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTQuMGYpOwotCQlHTC5nbFB1c2hOYW1lKDApOwotCi0JCS8vIGRyYXcgZGlzawotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKC0xLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjRmKDAuMGYsIDEuMGYsIDAuMGYsIGFscGhhc1syXSk7Ci0JCUdMLmdsTG9hZE5hbWUoSU5ERVhfRElTSyk7Ci0JCUdMLmdsQ2FsbExpc3QoSU5ERVhfRElTSyk7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX0RJU0spIHsKLQkJCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJCUdMVS5nbHVRdWFkcmljRHJhd1N0eWxlKHF1YWRyYXRpYywgR0xVLkdMVV9MSU5FKTsKLQkJCUdMVS5nbHVEaXNrKHF1YWRyYXRpYywgMC45OCwgMy4wMiwgMzIsIDMyKTsKLQkJfQotCQlHTC5nbFBvcE1hdHJpeCgpOwotCi0JCS8vIGRyYXcgdHJpYW5nbGUKLQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsICszLjBmKTsKLQkJR0wuZ2xMb2FkTmFtZShJTkRFWF9UUklBTkdMRSk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAwLjBmLCAwLjBmLCBhbHBoYXNbMF0pOwotCQlHTC5nbENhbGxMaXN0KElOREVYX1RSSUFOR0xFKTsKLQkJR0wuZ2xQb2ludFNpemUoNS4wZik7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX1RSSUFOR0xFKSB7Ci0JCQlHTC5nbEJlZ2luKEdMLkdMX1BPSU5UUyk7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTC5nbFZlcnRleDNmKDAuMGYsIDIuMGYsIDAuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDIuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMi4wZik7Ci0JCQlHTC5nbEVuZCgpOwotCQl9Ci0KLQkJLy8gZHJhdyBzcGhlcmUKLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigxLjBmLCAwLjBmLCArMy4wZik7Ci0JCUdMLmdsQ29sb3I0ZigwLjBmLCAwLjBmLCAxLjBmLCBhbHBoYXNbMV0pOwotCQlHTC5nbExvYWROYW1lKElOREVYX1NQSEVSRSk7Ci0JCUdMLmdsQ2FsbExpc3QoSU5ERVhfU1BIRVJFKTsKLQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gPT0gSU5ERVhfU1BIRVJFKSB7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfTElORSk7Ci0JCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMS41MSwgOCwgOCk7Ci0JCX0KLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9CYWxsLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JhbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODkwZDI2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JhbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQm94LmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JveC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZWY2NjMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQm94LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0Zsb29yLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0Zsb29yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzNGM5Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9GbG9vci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9zcGxhc2guYm1wIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvc3BsYXNoLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNzVkYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9zcGxhc2guYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvdW50aXRsZWQuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvdW50aXRsZWQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ2YWExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3VudGl0bGVkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTVjZTE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFhYTkzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnN3dHNuaXBwZXRzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlMDIxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gU1dUIFNuaXBwZXRzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczZDVhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTBiMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBIZWxsbyBXb3JsZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjc0ZWI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBEcmF3IHVzaW5nIHRyYW5zZm9ybWF0aW9ucywgcGF0aHMgYW5kIGFscGhhIGJsZW5kaW5nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiQWR2YW5jZWQgR3JhcGhpY3MiKTsKLQkJRm9udERhdGEgZmQgPSBzaGVsbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJZmluYWwgRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCA2MCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgNjQwLCA0ODApOwotCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxPdmFsKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7CQkJCQotCQkJCVRyYW5zZm9ybSB0ciA9IG5ldyBUcmFuc2Zvcm0oZGlzcGxheSk7Ci0JCQkJdHIudHJhbnNsYXRlKDUwLCAxMjApOwotCQkJCXRyLnJvdGF0ZSgtMzApOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIDAsIDAsIHJlY3Qud2lkdGggLyAyLCByZWN0LmhlaWdodCAvIDIpOwotCQkJCWdjLnNldEFscGhhKDEwMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyKTsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJCQlwYXRoLmFkZFN0cmluZygiU1dUIiwgMCwgMCwgZm9udCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkJCXRyLmRpc3Bvc2UoKTsKLQkJCQlwYXRoLmRpc3Bvc2UoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUocmVjdC53aWR0aCAvIDIsIHJlY3QuaGVpZ2h0IC8gMikpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmZjgwYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9udCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxhcmdlIGZvbnQgZm9yIHVzZSBieSBhIHRleHQgd2lkZ2V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkpOwotCXRleHQuc2V0Qm91bmRzKDEwLCAxMCwgMTUwLCAxNTApOwotCUZvbnQgaW5pdGlhbEZvbnQgPSB0ZXh0LmdldEZvbnQoKTsKLQlGb250RGF0YVtdIGZvbnREYXRhID0gaW5pdGlhbEZvbnQuZ2V0Rm9udERhdGEoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWZvbnREYXRhW2ldLnNldEhlaWdodCgyNCk7Ci0JfQotCUZvbnQgbmV3Rm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZvbnREYXRhKTsKLQl0ZXh0LnNldEZvbnQobmV3Rm9udCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JbmV3Rm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGU5NzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdGFibGUgaXRlbSAoYXQgYW4gaW5kZXgpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FLCAxKTsKLQlpdGVtLnNldFRleHQgKCIqKiogTmV3IEl0ZW0gIiArIHRhYmxlLmluZGV4T2YgKGl0ZW0pICsgIiAqKioiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDU2YjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgYSB0cmVlIGl0ZW0gKGF0IGFuIGluZGV4KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FLCAxKTsKLQlUcmVlSXRlbSBbXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMgKCk7Ci0JaW50IGluZGV4ID0gMDsKLQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGggJiYgaXRlbXMgW2luZGV4XSAhPSBpdGVtKSBpbmRleCsrOwotCWl0ZW0uc2V0VGV4dCAoIioqKiBOZXcgSXRlbSAiICsgaW5kZXggKyAiICoqKiIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjczZmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIHRhYmxlIGl0ZW0gdGV4dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMyB7Ci0KLXN0YXRpYyBjaGFyIGNvbnRlbnQgPSAnYSc7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDI0MCk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsIDEwLCAxNjAsIDE2MCk7Ci0KLQlmaW5hbCBUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bNF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSkuc2V0V2lkdGgoNDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJcG9wdWxhdGVJdGVtKGl0ZW1zW2ldKTsKLQl9Ci0KLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJDaGFuZ2UiKTsKLQlidXR0b24ucGFjaygpOwotCWJ1dHRvbi5zZXRMb2NhdGlvbigxMCwgMTgwKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQlwb3B1bGF0ZUl0ZW0oaXRlbXNbaV0pOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBwb3B1bGF0ZUl0ZW0oVGFibGVJdGVtIGl0ZW0pIHsKLQlTdHJpbmcgc3RyaW5nQ29udGVudCA9IFN0cmluZy52YWx1ZU9mKGNvbnRlbnQpOwotCWl0ZW0uc2V0VGV4dCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCXN0cmluZ0NvbnRlbnQsCi0JCQlzdHJpbmdDb250ZW50LAotCQkJc3RyaW5nQ29udGVudCwKLQkJCXN0cmluZ0NvbnRlbnQgfSk7Ci0JY29udGVudCsrOwotCWlmIChjb250ZW50ID4gJ3onKSBjb250ZW50ID0gJ2EnOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDM4ZDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNwbGFzaCBzY3JlZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgaW50IFtdIGNvdW50ID0gbmV3IGludCBbXSB7NH07Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMzAwLCAzMDApOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0NZQU4pKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQlnYy5kcmF3VGV4dCgiU3BsYXNoIFNjcmVlbiIsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIFNoZWxsIHNwbGFzaCA9IG5ldyBTaGVsbChTV1QuT05fVE9QKTsKLQlmaW5hbCBQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc3BsYXNoLCBTV1QuTk9ORSk7Ci0JYmFyLnNldE1heGltdW0oY291bnRbMF0pOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNwbGFzaCwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGltYWdlKTsKLQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0Jc3BsYXNoLnNldExheW91dChsYXlvdXQpOwotCUZvcm1EYXRhIGxhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JbGFiZWxEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0JRm9ybURhdGEgcHJvZ3Jlc3NEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCXByb2dyZXNzRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCA1KTsKLQlwcm9ncmVzc0RhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCXByb2dyZXNzRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCWJhci5zZXRMYXlvdXREYXRhKHByb2dyZXNzRGF0YSk7Ci0Jc3BsYXNoLnBhY2soKTsKLQlSZWN0YW5nbGUgc3BsYXNoUmVjdCA9IHNwbGFzaC5nZXRCb3VuZHMoKTsKLQlSZWN0YW5nbGUgZGlzcGxheVJlY3QgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCWludCB4ID0gKGRpc3BsYXlSZWN0LndpZHRoIC0gc3BsYXNoUmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gKGRpc3BsYXlSZWN0LmhlaWdodCAtIHNwbGFzaFJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc3BsYXNoLnNldExvY2F0aW9uKHgsIHkpOwotCXNwbGFzaC5vcGVuKCk7Ci0JZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGxbY291bnRbMF1dOwotCQkJZm9yIChpbnQgaT0wOyBpPGNvdW50WzBdOyBpKyspIHsKLQkJCQlzaGVsbHMgW2ldID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCXNoZWxscyBbaV0uc2V0U2l6ZSAoMzAwLCAzMDApOwotCQkJCXNoZWxscyBbaV0uYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCQktLWNvdW50WzBdOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYmFyLnNldFNlbGVjdGlvbihpKzEpOwotCQkJCXRyeSB7VGhyZWFkLnNsZWVwKDEwMDApO30gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQotCQkJfQotCQkJc3BsYXNoLmNsb3NlKCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y291bnRbMF07IGkrKykgewotCQkJCXNoZWxscyBbaV0ub3BlbigpOwotCQkJfQotCQl9Ci0JfSk7Ci0Jd2hpbGUgKGNvdW50IFswXSAhPSAwKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyM2QzMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyYW0gZXhhbXBsZSBzbmlwcGV0OiBpbnZva2UgYW4gZXh0ZXJuYWwgYmF0Y2ggZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVByb2dyYW0ubGF1bmNoKCJjOlxcY3lnd2luXFxjeWd3aW4uYmF0Iik7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzNhY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdGFibGUgY29sdW1uIChhdCBhbiBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKCJDb2x1bW4gIiArIGkpOwotCX0KLQlmaW5hbCBUYWJsZUNvbHVtbiBbXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucyAoKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGo9MDsgajxjb2x1bW5zLmxlbmd0aDsgaisrKSB7Ci0JCQlpdGVtLnNldFRleHQgKGosICJJdGVtICIgKyBpKTsKLQkJfQotCX0KLQlmb3IgKGludCBpPTA7IGk8Y29sdW1ucy5sZW5ndGg7IGkrKykgY29sdW1ucyBbaV0ucGFjayAoKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlmaW5hbCBpbnQgaW5kZXggPSAxOwotCWJ1dHRvbi5zZXRUZXh0ICgiSW5zZXJ0IENvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQljb2x1bW4uc2V0VGV4dCAoIkNvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoaW5kZXgsICJJdGVtICIgKyBpICsgImEiKTsKLQkJCX0KLQkJCWNvbHVtbi5wYWNrICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMzY5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyoKLSAqIFNhc2ggZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgYSBzaW1wbGUgc3BsaXR0ZXIgKHdpdGggYSAyMCBwaXhlbCBsaW1pdCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJCdXR0b24gMSIpOwotCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoIChzaGVsbCwgU1dULlZFUlRJQ0FMKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0ICgiQnV0dG9uIDIiKTsKLQkKLQlmaW5hbCBGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCAoKTsKLQlzaGVsbC5zZXRMYXlvdXQgKGZvcm0pOwotCQotCUZvcm1EYXRhIGJ1dHRvbjFEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWJ1dHRvbjFEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50IChzYXNoLCAwKTsKLQlidXR0b24xRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24xLnNldExheW91dERhdGEgKGJ1dHRvbjFEYXRhKTsKLQotCWZpbmFsIGludCBsaW1pdCA9IDIwLCBwZXJjZW50ID0gNTA7Ci0JZmluYWwgRm9ybURhdGEgc2FzaERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0Jc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAocGVyY2VudCwgMCk7Ci0Jc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlzYXNoRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0Jc2FzaC5zZXRMYXlvdXREYXRhIChzYXNoRGF0YSk7Ci0Jc2FzaC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBzYXNoUmVjdCA9IHNhc2guZ2V0Qm91bmRzICgpOwotCQkJUmVjdGFuZ2xlIHNoZWxsUmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlpbnQgcmlnaHQgPSBzaGVsbFJlY3Qud2lkdGggLSBzYXNoUmVjdC53aWR0aCAtIGxpbWl0OwotCQkJZS54ID0gTWF0aC5tYXggKE1hdGgubWluIChlLngsIHJpZ2h0KSwgbGltaXQpOwotCQkJaWYgKGUueCAhPSBzYXNoUmVjdC54KSAgewotCQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIGUueCk7Ci0JCQkJc2hlbGwubGF5b3V0ICgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMkRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMkRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoc2FzaCwgMCk7Ci0JYnV0dG9uMkRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMkRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlidXR0b24yRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMi5zZXRMYXlvdXREYXRhIChidXR0b24yRGF0YSk7Ci0JCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODdmYTNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXR0b24gZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoIkVudGVyIHlvdXIgbmFtZToiKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDEwMCwgU1dULkRFRkFVTFQpKTsKLQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCW9rLnNldFRleHQgKCJPSyIpOwotCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9LIik7Ci0JCX0KLQl9KTsKLQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQljYW5jZWwuc2V0VGV4dCAoIkNhbmNlbCIpOwotCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5jZWwiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKGNhbmNlbCk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMjViYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNhc2hGb3JtIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2FzaCBmb3JtIHdpdGggdGhyZWUgY2hpbGRyZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwOSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlTYXNoRm9ybSBmb3JtID0gbmV3IFNhc2hGb3JtKHNoZWxsLFNXVC5IT1JJWk9OVEFMKTsKLQlmb3JtLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlDb21wb3NpdGUgY2hpbGQxID0gbmV3IENvbXBvc2l0ZShmb3JtLFNXVC5OT05FKTsKLQljaGlsZDEuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCW5ldyBMYWJlbChjaGlsZDEsU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGluIHBhbmUgMSIpOwotCQotCUNvbXBvc2l0ZSBjaGlsZDIgPSBuZXcgQ29tcG9zaXRlKGZvcm0sU1dULk5PTkUpOwotCWNoaWxkMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IEJ1dHRvbihjaGlsZDIsU1dULlBVU0gpLnNldFRleHQoIkJ1dHRvbiBpbiBwYW5lMiIpOwotCi0JQ29tcG9zaXRlIGNoaWxkMyA9IG5ldyBDb21wb3NpdGUoZm9ybSxTV1QuTk9ORSk7Ci0JY2hpbGQzLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQluZXcgTGFiZWwoY2hpbGQzLFNXVC5QVVNIKS5zZXRUZXh0KCJMYWJlbCBpbiBwYW5lMyIpOwotCQotCWZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10gezMwLDQwLDMwfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NDgwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgc2VsZWN0aW9uIChpLWJlYW0pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0ZXh0LnNldEJvdW5kcyAoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJdGV4dC5hcHBlbmQgKCJMaW5lICIgKyBpICsgIlxuIik7Ci0JfQotCXNoZWxsLm9wZW4gKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24gKDMwKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJzZWxlY3Rpb249IiArIHRleHQuZ2V0U2VsZWN0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBwb3NpdGlvbj0iICsgdGV4dC5nZXRDYXJldFBvc2l0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBsb2NhdGlvbj0iICsgdGV4dC5nZXRDYXJldExvY2F0aW9uICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmRhMGMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGZpbmQgYSB0YWJsZSBjZWxsIGZyb20gbW91c2UgZG93biAod29ya3MgZm9yIGFueSB0YWJsZSBzdHlsZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCWZpbmFsIGludCByb3dDb3VudCA9IDY0LCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0ICgiQ29sdW1uICIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGo9MDsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dCAoaiwgIkl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJfQotCX0KLQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbiAoaSkucGFjayAoKTsKLQl9Ci0JUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgMjAwKTsKLQl0YWJsZS5zZXRTaXplIChzaXplKTsKLQlzaGVsbC5wYWNrICgpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gdGFibGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmdldFRvcEluZGV4ICgpOwotCQkJd2hpbGUgKGluZGV4IDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKSB7Ci0JCQkJYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpbmRleCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzIChpKTsKLQkJCQkJaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiSXRlbSAiICsgaW5kZXggKyAiLSIgKyBpKTsKLQkJCQkJfQotCQkJCQlpZiAoIXZpc2libGUgJiYgcmVjdC5pbnRlcnNlY3RzIChjbGllbnRBcmVhKSkgewotCQkJCQkJdmlzaWJsZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCF2aXNpYmxlKSByZXR1cm47Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmVkMWU3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IGVkaXQgdGhlIHRleHQgb2YgYSB0cmVlIGl0ZW0gKGluIHBsYWNlLCBmYW5jeSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtSSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtSS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWZvciAoaW50IGo9MDsgajwxNjsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtSiA9IG5ldyBUcmVlSXRlbSAoaXRlbUksIFNXVC5OT05FKTsKLQkJCWl0ZW1KLnNldFRleHQgKCJJdGVtICIgKyBqKTsKLQkJfQotCX0KLQlmaW5hbCBUcmVlSXRlbSBbXSBsYXN0SXRlbSA9IG5ldyBUcmVlSXRlbSBbMV07Ci0JZmluYWwgVHJlZUVkaXRvciBlZGl0b3IgPSBuZXcgVHJlZUVkaXRvciAodHJlZSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtID09IGxhc3RJdGVtIFswXSkgewotCQkJCWJvb2xlYW4gc2hvd0JvcmRlciA9IHRydWU7Ci0JCQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHRyZWUsIFNXVC5OT05FKTsKLQkJCQlpZiAoc2hvd0JvcmRlcikgY29tcG9zaXRlLnNldEJhY2tncm91bmQgKGJsYWNrKTsKLQkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJZmluYWwgaW50IGluc2V0ID0gc2hvd0JvcmRlciA/IDEgOiAwOwotCQkJCWNvbXBvc2l0ZS5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJCQl0ZXh0LnNldEJvdW5kcyAocmVjdC54ICsgaW5zZXQsIHJlY3QueSArIGluc2V0LCByZWN0LndpZHRoIC0gaW5zZXQgKiAyLCByZWN0LmhlaWdodCAtIGluc2V0ICogMik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlMaXN0ZW5lciB0ZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZSkgewotCQkJCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQkJCQljYXNlIFNXVC5Gb2N1c091dDoKLQkJCQkJCQkJaXRlbS5zZXRUZXh0ICh0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQljb21wb3NpdGUuZGlzcG9zZSAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBTV1QuVmVyaWZ5OgotCQkJCQkJCQlTdHJpbmcgbmV3VGV4dCA9IHRleHQuZ2V0VGV4dCAoKTsKLQkJCQkJCQkJU3RyaW5nIGxlZnRUZXh0ID0gbmV3VGV4dC5zdWJzdHJpbmcgKDAsIGUuc3RhcnQpOwotCQkJCQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gbmV3VGV4dC5zdWJzdHJpbmcgKGUuZW5kLCBuZXdUZXh0Lmxlbmd0aCAoKSk7Ci0JCQkJCQkJCUdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLQkJCQkJCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQgKGxlZnRUZXh0ICsgZS50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQkJCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUgKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCQkJCQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCQkJCQlSZWN0YW5nbGUgaXRlbVJlY3QgPSBpdGVtLmdldEJvdW5kcyAoKSwgcmVjdCA9IHRyZWUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IE1hdGgubWF4IChzaXplLngsIGl0ZW1SZWN0LndpZHRoKSArIGluc2V0ICogMjsKLQkJCQkJCQkJaW50IGxlZnQgPSBpdGVtUmVjdC54LCByaWdodCA9IHJlY3QueCArIHJlY3Qud2lkdGg7Ci0JCQkJCQkJCWVkaXRvci5taW5pbXVtV2lkdGggPSBNYXRoLm1pbiAoZWRpdG9yLm1pbmltdW1XaWR0aCwgcmlnaHQgLSBsZWZ0KTsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1IZWlnaHQgPSBzaXplLnkgKyBpbnNldCAqIDI7Ci0JCQkJCQkJCWVkaXRvci5sYXlvdXQgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgU1dULlRyYXZlcnNlOgotCQkJCQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQkJCQkJaXRlbS5zZXRUZXh0ICh0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQkJCQkJY29tcG9zaXRlLmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c091dCwgdGV4dExpc3RlbmVyKTsKLQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIHRleHRMaXN0ZW5lcik7Ci0JCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULlZlcmlmeSwgdGV4dExpc3RlbmVyKTsKLQkJCQllZGl0b3Iuc2V0RWRpdG9yIChjb21wb3NpdGUsIGl0ZW0pOwotCQkJCXRleHQuc2V0VGV4dCAoaXRlbS5nZXRUZXh0ICgpKTsKLQkJCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCQl0ZXh0LnNldEZvY3VzICgpOwotCQkJfQotCQkJbGFzdEl0ZW0gWzBdID0gaXRlbTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTMyYTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEltYWdlIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBhbiBpbWFnZSBpbiBhIGdyb3VwCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlHcm91cCBncm91cCA9IG5ldyBHcm91cCAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlncm91cC5zZXRUZXh0ICgiYSBzcXVhcmUiKTsKLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyAoZ3JvdXAsIFNXVC5OT05FKTsKLQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lciAobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2wgKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5kcmF3SW1hZ2UgKGltYWdlLCAwLCAwKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmEzNGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBhIHNlbGVjdGlvbiBvciBjaGVjayBldmVudCBpbiBhIHRhYmxlIChTV1QuQ0hFQ0spCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLID8gIkNoZWNrZWQiIDogIlNlbGVjdGVkIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZXZlbnQuaXRlbSArICIgIiArIHN0cmluZyk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzZmYzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IGEgc2VsZWN0aW9uIG9yIGNoZWNrIGV2ZW50IGluIGEgdHJlZSAoU1dULkNIRUNLKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRyZWUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0sgPyAiQ2hlY2tlZCIgOiAiU2VsZWN0ZWQiOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChldmVudC5pdGVtICsgIiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMjI0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogZm9yY2UgcmFkaW8gYmVoYXZpb3Igb24gdHdvIGRpZmZlcmVudCBjb21wb3NpdGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCkpOwotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMS5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMi5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCWZpbmFsIENvbXBvc2l0ZSBbXSBjb21wb3NpdGVzID0gbmV3IENvbXBvc2l0ZSBbXSB7YzEsIGMyfTsKLQlMaXN0ZW5lciByYWRpb0dyb3VwID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y29tcG9zaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjb21wb3NpdGVzIFtpXTsKLQkJCQlDb250cm9sIFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQkJCWZvciAoaW50IGo9MDsgajxjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2pdOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBjaGlsZDsKLQkJCQkJCWlmICgoYnV0dG9uLmdldFN0eWxlICgpICYgU1dULlJBRElPKSAhPSAwKSBidXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCX0KLQl9OwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgaSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgKGkgKyA0KSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTVlZjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzdG9wIENSIGZyb20gZ29pbmcgdG8gdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTYgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JdGV4dC5zZXRUZXh0KCJIZXJlIGlzIHNvbWUgdGV4dCIpOwotCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQgZGVmYXVsdCBzZWxlY3RlZCAob3ZlcnJpZGVzIGRlZmF1bHQgYnV0dG9uKSIpOwotCQl9Ci0JfSk7Ci0JdGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJPayIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdXR0b24gc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNmU5ODguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBhZGQgYSBzZWxlY3QgYWxsIG1lbnUgaXRlbSB0byB0aGUgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTcgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0gICAgdC5zZXRUZXh0ICgiaGVyZSBpcyBzb21lIHRleHQgdG8gYmUgc2VsZWN0ZWQiKTsKLQlNZW51IGJhciA9IG5ldyBNZW51IChzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhciAoYmFyKTsKLQlNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZWRpdEl0ZW0uc2V0VGV4dCAoIkVkaXQiKTsKLQlNZW51IHN1Ym1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWVkaXRJdGVtLnNldE1lbnUgKHN1Ym1lbnUpOwotCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAoc3VibWVudSwgU1dULlBVU0gpOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQl0LnNlbGVjdEFsbCgpOwotCQl9Ci0JfSk7Ci0JaXRlbS5zZXRUZXh0ICgiU2VsZWN0ICZBbGxcdEN0cmwrQSIpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0EnKTsKLQkKLQkvLyBOb3RlIHRoYXQgYXMgbG9uZyBhcyB5b3VyIGFwcGxpY2F0aW9uIGhhcyBub3Qgb3ZlcnJpZGRlbiAKLQkvLyB0aGUgZ2xvYmFsIGFjY2VsZXJhdG9ycyBmb3IgY29weSwgcGFzdGUsIGFuZCBjdXQgCi0JLy8oQ1RSTCtDIG9yIENUUkwrSU5TRVJULCBDVFJMK1Ygb3IgU0hJRlQrSU5TRVJULCBhbmQgQ1RSTCtYIG9yIFNISUZUK0RFTEVURSkKLQkvLyB0aGVzZSBiZWhhdmlvdXJzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSBieSBkZWZhdWx0LgotCS8vIElmIHlvdXIgYXBwbGljYXRpb24gb3ZlcnJpZGVzIHRoZXNlIGFjY2VsZXJhdG9ycywKLQkvLyB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgVGV4dC5jb3B5KCksIFRleHQucGFzdGUoKSBhbmQgVGV4dC5jdXQoKQotCS8vIGZyb20gdGhlIFNlbGVjdGlvbiBjYWxsYmFjayBmb3IgdGhlIGFjY2VsZXJhdG9yIHdoZW4gdGhlIAotCS8vIHRleHQgd2lkZ2V0IGhhcyBmb2N1cy4KLQotCXNoZWxsLnNldFNpemUoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY1MGM4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29sb3IgY3Vyc29yIGZyb20gYW4gaW1hZ2UgZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQlmaW5hbCBDdXJzb3JbXSBjdXJzb3IgPSBuZXcgQ3Vyc29yWzFdOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNoYW5nZSBjdXJzb3IiKTsKLQlQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JYnV0dG9uLnNldFNpemUoc2l6ZSk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmljbyIsICIqLmdpZiIsICIqLioifSk7Ci0JCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSByZXR1cm47Ci0JCQlJbWFnZURhdGEgaW1hZ2UgPSBuZXcgSW1hZ2VEYXRhKG5hbWUpOwotCQkJQ3Vyc29yIG9sZEN1cnNvciA9IGN1cnNvclswXTsKLQkJCWN1cnNvclswXSA9IG5ldyBDdXJzb3IoZGlzcGxheSwgaW1hZ2UsIDAsIDApOwotCQkJc2hlbGwuc2V0Q3Vyc29yKGN1cnNvclswXSk7Ci0JCQlpZiAob2xkQ3Vyc29yICE9IG51bGwpIG9sZEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpZiAoY3Vyc29yWzBdICE9IG51bGwpIGN1cnNvclswXS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjc5MzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29sb3IgY3Vyc29yIGZyb20gYSBzb3VyY2UgYW5kIGEgbWFzawotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExOSB7Ci0KLXN0YXRpYyBieXRlW10gc3JjRGF0YSA9IHsKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTEsIAotCShieXRlKTB4MTEsIChieXRlKTB4MDAsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MDAsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMiwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgzMywgKGJ5dGUpMHgzMCwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4MjIsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MzMsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwKLQkoYnl0ZSkweDAxLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDEwLAotCShieXRlKTB4MDEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTAsCi0JKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDU1LCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4NDQsIChieXRlKTB4NDQsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4NTUsIChieXRlKTB4NTUsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHg1MCwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwKLX07Ci0KLXN0YXRpYyBieXRlW10gbXNrRGF0YSA9IHsKLQkoYnl0ZSkweDAzLCAoYnl0ZSkweGMwLCAKLQkoYnl0ZSkweDFmLCAoYnl0ZSkweGY4LAotCShieXRlKTB4M2YsIChieXRlKTB4ZmMsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHhmZiwgKGJ5dGUpMHhmZiwKLQkoYnl0ZSkweGZlLCAoYnl0ZSkweDdmLAotCShieXRlKTB4ZmUsIChieXRlKTB4N2YsCi0JKGJ5dGUpMHhmZiwgKGJ5dGUpMHhmZiwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDNmLCAoYnl0ZSkweGZjLAotCShieXRlKTB4MWYsIChieXRlKTB4ZjgsCi0JKGJ5dGUpMHgwMywgKGJ5dGUpMHhjMAotfTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCUNvbG9yIHllbGxvdyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0dSRUVOKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vQ3JlYXRlIGEgc291cmNlIEltYWdlRGF0YSBvZiBkZXB0aCA0Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQltdIHsKLQkJYmxhY2suZ2V0UkdCKCksIHdoaXRlLmdldFJHQigpLCB5ZWxsb3cuZ2V0UkdCKCksIAotCQlyZWQuZ2V0UkdCKCksIGJsdWUuZ2V0UkdCKCksIGdyZWVuLmdldFJHQigpfSk7Ci0JSW1hZ2VEYXRhIHNvdXJjZURhdGEgPSBuZXcgSW1hZ2VEYXRhICgxNiwgMTYsIDQsIHBhbGV0dGUsIDEsIHNyY0RhdGEpOwotCQotCS8vQ3JlYXRlIGEgbWFzayBJbWFnZURhdGEgb2YgZGVwdGggMSAobW9ub2Nocm9tZSkKLQlwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHtibGFjay5nZXRSR0IoKSwgd2hpdGUuZ2V0UkdCKCksfSk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gbmV3IEltYWdlRGF0YSAoMTYsIDE2LCAxLCBwYWxldHRlLCAxLCBtc2tEYXRhKTsKLQotCS8vU2V0IG1hc2sKLQlzb3VyY2VEYXRhLm1hc2tEYXRhID0gbWFza0RhdGEuZGF0YTsKLQlzb3VyY2VEYXRhLm1hc2tQYWQgPSBtYXNrRGF0YS5zY2FubGluZVBhZDsKLQotCS8vQ3JlYXRlIGN1cnNvcgotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZURhdGEsIDEwLCAxMCk7Ci0KLQkvL1JlbW92ZSBtYXNrIHRvIGRyYXcgdGhlbSBzZXBhcmF0ZWx5IGp1c3QgdG8gc2hvdyB3aGF0IHRoZXkgbG9vayBsaWtlCi0Jc291cmNlRGF0YS5tYXNrRGF0YSA9IG51bGw7Ci0Jc291cmNlRGF0YS5tYXNrUGFkID0gLTE7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBJbWFnZSBzb3VyY2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksc291cmNlRGF0YSk7Ci0JZmluYWwgSW1hZ2UgbWFzayA9IG5ldyBJbWFnZSAoZGlzcGxheSwgbWFza0RhdGEpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWludCB4ID0gMTAsIHkgPSAxMDsKLQkJCVN0cmluZyBzdHJpbmdTb3VyY2UgPSAic291cmNlOiAiOwotCQkJU3RyaW5nIHN0cmluZ01hc2sgPSAibWFzazogIjsKLQkJCWdjLmRyYXdTdHJpbmcoc3RyaW5nU291cmNlLCB4LCB5KTsKLQkJCWdjLmRyYXdTdHJpbmcoc3RyaW5nTWFzaywgeCwgeSArIDMwKTsKLQkJCXggKz0gTWF0aC5tYXgoZ2Muc3RyaW5nRXh0ZW50KHN0cmluZ1NvdXJjZSkueCwgZ2Muc3RyaW5nRXh0ZW50KHN0cmluZ01hc2spLngpOwotCQkJZ2MuZHJhd0ltYWdlKHNvdXJjZSwgeCwgeSk7Ci0JCQlnYy5kcmF3SW1hZ2UobWFzaywgeCwgeSArIDMwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCXNoZWxsLm9wZW4oKTsKLQlzaGVsbC5zZXRDdXJzb3IoY3Vyc29yKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlKCk7Ci0Jc291cmNlLmRpc3Bvc2UoKTsKLQltYXNrLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2E5OTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIHNlbGVjdGlvbiAoc3RhcnQsIGVuZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQuc2V0Qm91bmRzICgxMCwgMTAsIDEwMCwgMTAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQl0ZXh0LmFwcGVuZCAoIkxpbmUgIiArIGkgKyAiXG4iKTsKLQl9Ci0Jc2hlbGwub3BlbiAoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbiAoMzAsIDM4KTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJzZWxlY3Rpb249IiArIHRleHQuZ2V0U2VsZWN0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBwb3NpdGlvbj0iICsgdGV4dC5nZXRDYXJldFBvc2l0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBsb2NhdGlvbj0iICsgdGV4dC5nZXRDYXJldExvY2F0aW9uICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfSAKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwNzBjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1vbml0b3IgZXhhbXBsZSBzbmlwcGV0OiBjZW50ZXIgYSBzaGVsbCBvbiB0aGUgcHJpbWFyeSBtb25pdG9yCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCU1vbml0b3IgcHJpbWFyeSA9IGRpc3BsYXkuZ2V0UHJpbWFyeU1vbml0b3IgKCk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW1hcnkuZ2V0Qm91bmRzICgpOwotCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Qm91bmRzICgpOwotCWludCB4ID0gYm91bmRzLnggKyAoYm91bmRzLndpZHRoIC0gcmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gYm91bmRzLnkgKyAoYm91bmRzLmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc2hlbGwuc2V0TG9jYXRpb24gKHgsIHkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMTZhMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgcGFzc3dvcmQgKHNldCB0aGUgZWNobyBjaGFyYWN0ZXIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldEVjaG9DaGFyICgnKicpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmYmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDbGlwYm9hcmQgZXhhbXBsZSBzbmlwcGV0OiBlbmFibGUvZGlzYWJsZSBtZW51IGRlcGVuZGluZyBvbiBjbGlwYm9hcmQgY29udGVudCBhdmFpbGFiaWxpdHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBDbGlwYm9hcmQgY2IgPSBuZXcgQ2xpcGJvYXJkKGRpc3BsYXkpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULlBPUF9VUCk7Ci0JZmluYWwgTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCWNvcHlJdGVtLnNldFRleHQoIkNvcHkiKTsKLQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCgpID09IDApIHJldHVybjsKLQkJCU9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0W117c2VsZWN0aW9ufTsKLQkJCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCQkJY2Iuc2V0Q29udGVudHMoZGF0YSwgdHlwZXMpOwotCQl9Ci0JfSk7Ci0JZmluYWwgTWVudUl0ZW0gcGFzdGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQlwYXN0ZUl0ZW0uc2V0VGV4dCAoIlBhc3RlIik7Ci0JcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKShjYi5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSkpOwotCQkJaWYgKHN0cmluZyAhPSBudWxsKSB0ZXh0Lmluc2VydChzdHJpbmcpOwotCQl9Ci0JfSk7Ci0JbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCS8vIGlzIGNvcHkgdmFsaWQ/Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQljb3B5SXRlbS5zZXRFbmFibGVkKHNlbGVjdGlvbi5sZW5ndGgoKSA+IDApOwotCQkJLy8gaXMgcGFzdGUgdmFsaWQ/Ci0JCQlUcmFuc2ZlckRhdGFbXSBhdmFpbGFibGUgPSBjYi5nZXRBdmFpbGFibGVUeXBlcygpOwotCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoYXZhaWxhYmxlW2ldKSkgewotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcGFzdGVJdGVtLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9KTsKLQl0ZXh0LnNldE1lbnUgKG1lbnUpOwotCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY2IuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGM2ZGZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE9MRSBhbmQgQWN0aXZlWCBleGFtcGxlIHNuaXBwZXQ6IGdldCBldmVudHMgZnJvbSBJRSBjb250cm9sICh3aW4zMiBvbmx5KQotICogCi0gKiBUaGlzIHNuaXBwZXQgb25seSBydW5zIGFzLWlzIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzIGJlY2F1c2UgaXQgdXNlcwotICogamF2YSBpbnRlZ2VycyB0byByZXByZXNlbnQgbmF0aXZlIHBvaW50ZXJzLiAgImxvbmciIGNvbW1lbnRzIGFyZSBpbmNsdWRlZAotICogdGhyb3VnaG91dCB0aGUgc25pcHBldCB0byBzaG93IHdoZXJlIGludCBzaG91bGQgYmUgY2hhbmdlZCB0byBsb25nIGluCi0gKiBvcmRlciB0byBydW4gb24gYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLgotICogCi0gKiBOT1RFOiBUaGlzIHNuaXBwZXQgdXNlcyBpbnRlcm5hbCBTV1QgcGFja2FnZXMgdGhhdCBhcmUKLSAqIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQlzaGVsbC5vcGVuKCk7Ci0JCi0JLy8gSVdlYkJyb3dzZXIKLQlmaW5hbCBPbGVBdXRvbWF0aW9uIHdlYkJyb3dzZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0KLQkvLyBXaGVuIGEgbmV3IGRvY3VtZW50IGlzIGxvYWRlZCwgYWNjZXNzIHRoZSBkb2N1bWVudCBvYmplY3QgZm9yIHRoZSBuZXcgcGFnZS4KLQlpbnQgRG93bmxvYWRDb21wbGV0ZSA9IDEwNDsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKERvd25sb2FkQ29tcGxldGUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCWludFtdIGh0bWxEb2N1bWVudElEID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiRG9jdW1lbnQifSk7IAotCQkJaWYgKGh0bWxEb2N1bWVudElEID09IG51bGwpIHJldHVybjsKLQkJCVZhcmlhbnQgcFZhclJlc3VsdCA9IHdlYkJyb3dzZXIuZ2V0UHJvcGVydHkoaHRtbERvY3VtZW50SURbMF0pOwotCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkvL0lIVE1MRG9jdW1lbnQyCi0JCQlPbGVBdXRvbWF0aW9uIGh0bWxEb2N1bWVudCA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCi0JCQkvLyBSZXF1ZXN0IHRvIGJlIG5vdGlmaWVkIG9mIGNsaWNrLCBkb3VibGUgY2xpY2sgYW5kIGtleSBkb3duIGV2ZW50cwotCQkJRXZlbnREaXNwYXRjaCBteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmNsaWNrKTsKLQkJCUlEaXNwYXRjaCBpZGlzcGF0Y2ggPSBuZXcgSURpc3BhdGNoKG15RGlzcGF0Y2guZ2V0QWRkcmVzcygpKTsKLQkJCVZhcmlhbnQgZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25jbGljaywgZGlzcGF0Y2gpOwotCi0JCQlteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmRibGNsaWNrKTsKLQkJCWlkaXNwYXRjaCA9IG5ldyBJRGlzcGF0Y2gobXlEaXNwYXRjaC5nZXRBZGRyZXNzKCkpOwotCQkJZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25kYmxjbGljaywgZGlzcGF0Y2gpOwotCi0JCQlteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmtleWRvd24pOwotCQkJaWRpc3BhdGNoID0gbmV3IElEaXNwYXRjaChteURpc3BhdGNoLmdldEFkZHJlc3MoKSk7Ci0JCQlkaXNwYXRjaCA9IG5ldyBWYXJpYW50KGlkaXNwYXRjaCk7Ci0JCQlodG1sRG9jdW1lbnQuc2V0UHJvcGVydHkoRXZlbnREaXNwYXRjaC5vbmtleWRvd24sIGRpc3BhdGNoKTsKLQkJCQotCQkJLy9SZW1lbWJlciB0byByZWxlYXNlIE9sZUF1dG9tYXRpb24gT2JqZWN0Ci0JCQlodG1sRG9jdW1lbnQuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gTmF2aWdhdGUgdG8gYSB3ZWIgc2l0ZQotCWludFtdIGlkcyA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50W10ge25ldyBWYXJpYW50KCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKX07Ci0JaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50W117aWRzWzFdfTsKLQl3ZWJCcm93c2VyLmludm9rZShpZHNbMF0sIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCS8vUmVtZW1iZXIgdG8gcmVsZWFzZSBPbGVBdXRvbWF0aW9uIE9iamVjdAotCXdlYkJyb3dzZXIuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCQotfQotfQotLy8gRXZlbnREaXNwYXRjaCBpbXBsZW1lbnRzIGEgc2ltcGxlIElEaXNwYXRjaCBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBiZSBjYWxsZWQgCi0vLyB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC4KLWNsYXNzIEV2ZW50RGlzcGF0Y2ggewotCXByaXZhdGUgQ09NT2JqZWN0IGlEaXNwYXRjaDsKLQlwcml2YXRlIGludCByZWZDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZXZlbnRJRDsKLQkKLQlmaW5hbCBzdGF0aWMgaW50IG9uaGVscCA9IDB4ODAwMTE3N2Q7Ci0JZmluYWwgc3RhdGljIGludCBvbmNsaWNrID0gMHg4MDAxMTc3ODsKLQlmaW5hbCBzdGF0aWMgaW50IG9uZGJsY2xpY2sgPSAweDgwMDExNzc5OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXl1cCA9IDB4ODAwMTE3NzY7Ci0JZmluYWwgc3RhdGljIGludCBvbmtleWRvd24gPSAweDgwMDExNzc1OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXlwcmVzcyA9IDB4ODAwMTE3Nzc7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNldXAgPSAweDgwMDExNzczOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZWRvd24gPSAweDgwMDExNzcyOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW1vdmUgPSAweDgwMDExNzc0OwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW91dCA9IDB4ODAwMTE3NzE7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNlb3ZlciA9IDB4ODAwMTE3NzA7Ci0JZmluYWwgc3RhdGljIGludCBvbnJlYWR5c3RhdGVjaGFuZ2UgPSAweDgwMDExNzg5OwotCWZpbmFsIHN0YXRpYyBpbnQgb25hZnRlcnVwZGF0ZSA9IDB4ODAwMTE3ODY7Ci0JZmluYWwgc3RhdGljIGludCBvbnJvd2V4aXQ9IDB4ODAwMTE3ODI7Ci0JZmluYWwgc3RhdGljIGludCBvbnJvd2VudGVyID0gMHg4MDAxMTc4MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9uZHJhZ3N0YXJ0ID0gMHg4MDAxMTc5MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9uc2VsZWN0c3RhcnQgPSAweDgwMDExNzk1OwotCi0JRXZlbnREaXNwYXRjaChpbnQgZXZlbnRJRCkgewotCQl0aGlzLmV2ZW50SUQgPSBldmVudElEOwotCQljcmVhdGVDT01JbnRlcmZhY2VzKCk7Ci0JfQotCWludCAvKmxvbmcqLyBnZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gaURpc3BhdGNoLmdldEFkZHJlc3MoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNPTUludGVyZmFjZXMoKSB7Ci0JCWlEaXNwYXRjaCA9IG5ldyBDT01PYmplY3QobmV3IGludFtdezIsIDAsIDAsIDEsIDMsIDQsIDh9KXsKLQkJCXB1YmxpYyBpbnQgLypsb25nKi8gbWV0aG9kMChpbnQgLypsb25nKi9bXSBhcmdzKSB7cmV0dXJuIFF1ZXJ5SW50ZXJmYWNlKGFyZ3NbMF0sIGFyZ3NbMV0pO30KLQkJCXB1YmxpYyBpbnQgLypsb25nKi8gbWV0aG9kMShpbnQgLypsb25nKi9bXSBhcmdzKSB7cmV0dXJuIEFkZFJlZigpO30KLQkJCXB1YmxpYyBpbnQgLypsb25nKi8gbWV0aG9kMihpbnQgLypsb25nKi9bXSBhcmdzKSB7cmV0dXJuIFJlbGVhc2UoKTt9Ci0JCQkvLyBtZXRob2QzIEdldFR5cGVJbmZvQ291bnQgLSBub3QgaW1wbGVtZW50ZWQKLQkJCS8vIG1ldGhvZDQgR2V0VHlwZUluZm8gLSBub3QgaW1wbGVtZW50ZWQKLQkJCS8vIG1ldGhvZDUgR2V0SURzT2ZOYW1lcyAtIG5vdCBpbXBsZW1lbnRlZAotCQkJcHVibGljIGludCAvKmxvbmcqLyBtZXRob2Q2KGludCAvKmxvbmcqL1tdIGFyZ3MpIHtyZXR1cm4gSW52b2tlKChpbnQpLyo2NCovYXJnc1swXSwgYXJnc1sxXSwgKGludCkvKjY0Ki9hcmdzWzJdLCAoaW50KS8qNjQqL2FyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0sIGFyZ3NbNl0sIGFyZ3NbN10pO30KLQkJfTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VDT01JbnRlcmZhY2VzKCkgewotCQlpZiAoaURpc3BhdGNoICE9IG51bGwpCi0JCQlpRGlzcGF0Y2guZGlzcG9zZSgpOwotCQlpRGlzcGF0Y2ggPSBudWxsOwotCQkKLQl9Ci0JcHJpdmF0ZSBpbnQgQWRkUmVmKCkgewotCQlyZWZDb3VudCsrOwotCQlyZXR1cm4gcmVmQ291bnQ7Ci0JfQotCXByaXZhdGUgaW50IEludm9rZShpbnQgZGlzcElkTWVtYmVyLCBpbnQgLypsb25nKi8gcmlpZCwgaW50IGxjaWQsIGludCBkd0ZsYWdzLCBpbnQgLypsb25nKi8gcERpc3BQYXJhbXMsIGludCAvKmxvbmcqLyBwVmFyUmVzdWx0LCBpbnQgLypsb25nKi8gcEV4Y2VwSW5mbywgaW50IC8qbG9uZyovIHBBcmdFcnIpCXsKLQkJc3dpdGNoIChldmVudElEKSB7Ci0JCQljYXNlIG9uaGVscDogU3lzdGVtLm91dC5wcmludGxuKCJvbmhlbHAiKTsgYnJlYWs7Ci0JCQljYXNlIG9uY2xpY2s6IFN5c3RlbS5vdXQucHJpbnRsbigib25jbGljayIpOyBicmVhazsKLQkJCWNhc2Ugb25kYmxjbGljazogU3lzdGVtLm91dC5wcmludGxuKCJvbmRibGNsaWNrIik7IGJyZWFrOwotCQkJY2FzZSBvbmtleXVwOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ua2V5dXAiKTsgYnJlYWs7Ci0JCQljYXNlIG9ua2V5ZG93bjogU3lzdGVtLm91dC5wcmludGxuKCJvbmtleWRvd24iKTsgYnJlYWs7Ci0JCQljYXNlIG9ua2V5cHJlc3M6IFN5c3RlbS5vdXQucHJpbnRsbigib25rZXlwcmVzcyIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZXVwOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2V1cCIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZWRvd246IFN5c3RlbS5vdXQucHJpbnRsbigib25tb3VzZWRvd24iKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2Vtb3ZlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2Vtb3ZlIik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNlb3V0OiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2VvdXQiKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2VvdmVyOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2VvdmVyIik7IGJyZWFrOwotCQkJY2FzZSBvbnJlYWR5c3RhdGVjaGFuZ2U6IFN5c3RlbS5vdXQucHJpbnRsbigib25yZWFkeXN0YXRlY2hhbmdlIik7IGJyZWFrOwotCQkJY2FzZSBvbmFmdGVydXBkYXRlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uYWZ0ZXJ1cGRhdGUiKTsgYnJlYWs7Ci0JCQljYXNlIG9ucm93ZXhpdDogU3lzdGVtLm91dC5wcmludGxuKCJvbnJvd2V4aXQiKTsgYnJlYWs7Ci0JCQljYXNlIG9ucm93ZW50ZXI6IFN5c3RlbS5vdXQucHJpbnRsbigib25yb3dlbnRlciIpOyBicmVhazsKLQkJCWNhc2Ugb25kcmFnc3RhcnQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25kcmFnc3RhcnQiKTsgYnJlYWs7Ci0JCQljYXNlIG9uc2VsZWN0c3RhcnQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25zZWxlY3RzdGFydCIpOyBicmVhazsKLQkJfQotCQlyZXR1cm4gQ09NLlNfT0s7Ci0JfQotCXByaXZhdGUgaW50IFF1ZXJ5SW50ZXJmYWNlKGludCAvKmxvbmcqLyByaWlkLCBpbnQgLypsb25nKi8gcHB2T2JqZWN0KSB7Ci0JCWlmIChyaWlkID09IDAgfHwgcHB2T2JqZWN0ID09IDApIHJldHVybiBDT00uRV9JTlZBTElEQVJHOwotCQlHVUlEIGd1aWQgPSBuZXcgR1VJRCgpOwotCQlDT00uTW92ZU1lbW9yeShndWlkLCByaWlkLCBHVUlELnNpemVvZik7Ci0JCi0JCWlmIChDT00uSXNFcXVhbEdVSUQoZ3VpZCwgQ09NLklJRElVbmtub3duKSB8fCBDT00uSXNFcXVhbEdVSUQoZ3VpZCwgQ09NLklJRElEaXNwYXRjaCkpIHsKLQkJCUNPTS5Nb3ZlTWVtb3J5KHBwdk9iamVjdCwgbmV3IGludCAvKmxvbmcqL1tdIHtpRGlzcGF0Y2guZ2V0QWRkcmVzcygpfSwgT1MuUFRSX1NJWkVPRik7Ci0JCQlBZGRSZWYoKTsKLQkJCXJldHVybiBDT00uU19PSzsKLQkJfQotCQlDT00uTW92ZU1lbW9yeShwcHZPYmplY3QsIG5ldyBpbnQgLypsb25nKi9bXSB7MH0sIE9TLlBUUl9TSVpFT0YpOwotCQlyZXR1cm4gQ09NLkVfTk9JTlRFUkZBQ0U7Ci0JfQotCWludCBSZWxlYXNlKCkgewotCQlyZWZDb3VudC0tOwotCQlpZiAocmVmQ291bnQgPT0gMCkgewotCQkJZGlzcG9zZUNPTUludGVyZmFjZXMoKTsKLQkJfQotCQlyZXR1cm4gcmVmQ291bnQ7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDFmYmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGVFZGl0b3IgZXhhbXBsZSBzbmlwcGV0OiBlZGl0IGEgY2VsbCBpbiBhIHRhYmxlIChpbiBwbGFjZSwgZmFuY3kpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjQgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgxMDApOwotCX0KLQlmb3IgKGludCBpPTA7IGk8MzsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyIiICsgaSwgIiIgKyBpICwgIiIgKyBpfSk7Ci0JfQotCWZpbmFsIFRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHRhYmxlLmdldENsaWVudEFyZWEgKCk7Ci0JCQlQb2ludCBwdCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5nZXRUb3BJbmRleCAoKTsKLQkJCXdoaWxlIChpbmRleCA8IHRhYmxlLmdldEl0ZW1Db3VudCAoKSkgewotCQkJCWJvb2xlYW4gdmlzaWJsZSA9IGZhbHNlOwotCQkJCWZpbmFsIFRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaW5kZXgpOwotCQkJCWZvciAoaW50IGk9MDsgaTx0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMgKGkpOwotCQkJCQlpZiAocmVjdC5jb250YWlucyAocHQpKSB7Ci0JCQkJCQlmaW5hbCBpbnQgY29sdW1uID0gaTsKLQkJCQkJCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQkJTGlzdGVuZXIgdGV4dExpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZSkgewotCQkJCQkJCQlzd2l0Y2ggKGUudHlwZSkgewotCQkJCQkJCQkJY2FzZSBTV1QuRm9jdXNPdXQ6Ci0JCQkJCQkJCQkJaXRlbS5zZXRUZXh0IChjb2x1bW4sIHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCQkJdGV4dC5kaXNwb3NlICgpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBTV1QuVHJhdmVyc2U6Ci0JCQkJCQkJCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQkJCQkJCQlpdGVtLnNldFRleHQgKGNvbHVtbiwgdGV4dC5nZXRUZXh0ICgpKTsKLQkJCQkJCQkJCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJCQkJCQkJCWNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLQkJCQkJCQkJCQkJCXRleHQuZGlzcG9zZSAoKTsKLQkJCQkJCQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuRm9jdXNPdXQsIHRleHRMaXN0ZW5lcik7Ci0JCQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIHRleHRMaXN0ZW5lcik7Ci0JCQkJCQllZGl0b3Iuc2V0RWRpdG9yICh0ZXh0LCBpdGVtLCBpKTsKLQkJCQkJCXRleHQuc2V0VGV4dCAoaXRlbS5nZXRUZXh0IChpKSk7Ci0JCQkJCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCQkJCXRleHQuc2V0Rm9jdXMgKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKCF2aXNpYmxlICYmIHJlY3QuaW50ZXJzZWN0cyAoY2xpZW50QXJlYSkpIHsKLQkJCQkJCXZpc2libGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghdmlzaWJsZSkgcmV0dXJuOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhYjc1Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2wgVGlwcyBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBmYWtlIHRvb2wgdGlwcyBmb3IgaXRlbXMgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIml0ZW0gIiArIGkpOwotCX0KLQkvLyBEaXNhYmxlIG5hdGl2ZSB0b29sdGlwCi0JdGFibGUuc2V0VG9vbFRpcFRleHQgKCIiKTsKLQkKLQkvLyBJbXBsZW1lbnQgYSAiZmFrZSIgdG9vbHRpcAotCWZpbmFsIExpc3RlbmVyIGxhYmVsTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gbGFiZWwuZ2V0U2hlbGwgKCk7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCUV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0JCQkJCWUuaXRlbSA9IChUYWJsZUl0ZW0pIGxhYmVsLmdldERhdGEgKCJfVEFCTEVJVEVNIik7Ci0JCQkJCS8vIEFzc3VtaW5nIHRhYmxlIGlzIHNpbmdsZSBzZWxlY3QsIHNldCB0aGUgc2VsZWN0aW9uIGFzIGlmCi0JCQkJCS8vIHRoZSBtb3VzZSBkb3duIGV2ZW50IHdlbnQgdGhyb3VnaCB0byB0aGUgdGFibGUKLQkJCQkJdGFibGUuc2V0U2VsZWN0aW9uIChuZXcgVGFibGVJdGVtIFtdIHsoVGFibGVJdGVtKSBlLml0ZW19KTsKLQkJCQkJdGFibGUubm90aWZ5TGlzdGVuZXJzIChTV1QuU2VsZWN0aW9uLCBlKTsKLQkJCQkJc2hlbGwuZGlzcG9zZSAoKTsKLQkJCQkJdGFibGUuc2V0Rm9jdXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VFeGl0OgotCQkJCQlzaGVsbC5kaXNwb3NlICgpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JCi0JTGlzdGVuZXIgdGFibGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCVNoZWxsIHRpcCA9IG51bGw7Ci0JCUxhYmVsIGxhYmVsID0gbnVsbDsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJCWNhc2UgU1dULktleURvd246Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOiB7Ci0JCQkJCWlmICh0aXAgPT0gbnVsbCkgYnJlYWs7Ci0JCQkJCXRpcC5kaXNwb3NlICgpOwotCQkJCQl0aXAgPSBudWxsOwotCQkJCQlsYWJlbCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5Nb3VzZUhvdmVyOiB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAobmV3IFBvaW50IChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJCWlmICh0aXAgIT0gbnVsbCAgJiYgIXRpcC5pc0Rpc3Bvc2VkICgpKSB0aXAuZGlzcG9zZSAoKTsKLQkJCQkJCXRpcCA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5PTl9UT1AgfCBTV1QuTk9fRk9DVVMgfCBTV1QuVE9PTCk7Ci0JCQkJCQl0aXAuc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJCQkJRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCAoKTsKLQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCQkJCQl0aXAuc2V0TGF5b3V0IChsYXlvdXQpOwotCQkJCQkJbGFiZWwgPSBuZXcgTGFiZWwgKHRpcCwgU1dULk5PTkUpOwotCQkJCQkJbGFiZWwuc2V0Rm9yZWdyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotCQkJCQkJbGFiZWwuc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJCQkJbGFiZWwuc2V0RGF0YSAoIl9UQUJMRUlURU0iLCBpdGVtKTsKLQkJCQkJCWxhYmVsLnNldFRleHQgKGl0ZW0uZ2V0VGV4dCAoKSk7Ci0JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbGFiZWxMaXN0ZW5lcik7Ci0JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGFiZWxMaXN0ZW5lcik7Ci0JCQkJCQlQb2ludCBzaXplID0gdGlwLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoMCk7Ci0JCQkJCQlQb2ludCBwdCA9IHRhYmxlLnRvRGlzcGxheSAocmVjdC54LCByZWN0LnkpOwotCQkJCQkJdGlwLnNldEJvdW5kcyAocHQueCwgcHQueSwgc2l6ZS54LCBzaXplLnkpOwotCQkJCQkJdGlwLnNldFZpc2libGUgKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULkRpc3Bvc2UsIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgdGFibGVMaXN0ZW5lcik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VIb3ZlciwgdGFibGVMaXN0ZW5lcik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzYmFjNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYXJiaXRyYXJ5IGNvbnRyb2xzIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNiB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8MzsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0V2lkdGggKDEwMCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JfQotCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zICgpOwotCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQlUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJQ0NvbWJvIGNvbWJvID0gbmV3IENDb21ibyAodGFibGUsIFNXVC5OT05FKTsKLQkJY29tYm8uc2V0VGV4dCgiQ0NvbWJvIik7Ci0JCWNvbWJvLmFkZCgiaXRlbSAxIik7Ci0JCWNvbWJvLmFkZCgiaXRlbSAyIik7Ci0JCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWVkaXRvci5zZXRFZGl0b3IoY29tYm8sIGl0ZW1zW2ldLCAwKTsKLQkJZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0ICh0YWJsZSwgU1dULk5PTkUpOwotCQl0ZXh0LnNldFRleHQoIlRleHQiKTsKLQkJZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJZWRpdG9yLnNldEVkaXRvcih0ZXh0LCBpdGVtc1tpXSwgMSk7Ci0JCWVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAodGFibGUsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5wYWNrICgpOwotCQllZGl0b3IubWluaW11bVdpZHRoID0gYnV0dG9uLmdldFNpemUgKCkueDsKLQkJZWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQkJZWRpdG9yLnNldEVkaXRvciAoYnV0dG9uLCBpdGVtc1tpXSwgMik7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGVmZWJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBUYWIgZnJvbSB0cmF2ZXJzaW5nIG91dCBvZiBhIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyNyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCgiQ2FuJ3QgVHJhdmVyc2UiKTsKLQlidXR0b24xLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX05FWFQ6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTOiB7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQoIkNhbiBUcmF2ZXJzZSIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODkxZmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogYnJpbmcgdXAgYSBicm93c2VyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCVRvb2xCYXIgdG9vbGJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCVRvb2xJdGVtIGl0ZW1CYWNrID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbUJhY2suc2V0VGV4dCgiQmFjayIpOwotCQlUb29sSXRlbSBpdGVtRm9yd2FyZCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1Gb3J3YXJkLnNldFRleHQoIkZvcndhcmQiKTsKLQkJVG9vbEl0ZW0gaXRlbVN0b3AgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtU3RvcC5zZXRUZXh0KCJTdG9wIik7Ci0JCVRvb2xJdGVtIGl0ZW1SZWZyZXNoID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbVJlZnJlc2guc2V0VGV4dCgiUmVmcmVzaCIpOwotCQlUb29sSXRlbSBpdGVtR28gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtR28uc2V0VGV4dCgiR28iKTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXRvb2xiYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlMYWJlbCBsYWJlbEFkZHJlc3MgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJbGFiZWxBZGRyZXNzLnNldFRleHQoIkFkZHJlc3MiKTsKLQkJCi0JCWZpbmFsIFRleHQgbG9jYXRpb24gPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxvY2F0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlicm93c2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgTGFiZWwgc3RhdHVzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXN0YXR1cy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIFByb2dyZXNzQmFyIHByb2dyZXNzQmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRU5EOwotCQlwcm9ncmVzc0Jhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8qIGV2ZW50IGhhbmRsaW5nICovCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlUb29sSXRlbSBpdGVtID0gKFRvb2xJdGVtKWV2ZW50LndpZGdldDsKLQkJCQlTdHJpbmcgc3RyaW5nID0gaXRlbS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHN0cmluZy5lcXVhbHMoIkJhY2siKSkgYnJvd3Nlci5iYWNrKCk7IAotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIkZvcndhcmQiKSkgYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCQkJZWxzZSBpZiAoc3RyaW5nLmVxdWFscygiU3RvcCIpKSBicm93c2VyLnN0b3AoKTsKLQkJCQllbHNlIGlmIChzdHJpbmcuZXF1YWxzKCJSZWZyZXNoIikpIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIkdvIikpIGJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCSAgIH0KLQkJfTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC50b3RhbCA9PSAwKSByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlpbnQgcmF0aW8gPSBldmVudC5jdXJyZW50ICogMTAwIC8gZXZlbnQudG90YWw7Ci0JCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbihyYXRpbyk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbigwKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCXN0YXR1cy5zZXRUZXh0KGV2ZW50LnRleHQpOwkKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC50b3ApIGxvY2F0aW9uLnNldFRleHQoZXZlbnQubG9jYXRpb24pOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJaXRlbUJhY2suYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtRm9yd2FyZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWl0ZW1TdG9wLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaXRlbVJlZnJlc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtR28uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlsb2NhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWJyb3dzZXIuc2V0VXJsKGxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFVybCgiaHR0cDovL2VjbGlwc2Uub3JnIik7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTAwMWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNvbG9yIGNlbGxzIGFuZCByb3dzIGluIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI5IHsKLSAKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGdyYXkgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkFZKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEJhY2tncm91bmQoZ3JheSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsInJlZCBmb3JlZ3JvdW5kIn0pOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZChyZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsInJlZCBiYWNrZ3JvdW5kIn0pOwotCWl0ZW0uc2V0QmFja2dyb3VuZChyZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImVudGlyZSIsInJvdyIsIndoaXRlIGZvcmUvcmVkIGJhY2sifSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKHdoaXRlKTsKLQlpdGVtLnNldEJhY2tncm91bmQocmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJub3JtYWwiLCJibHVlIGZvcmVncm91bmQiLCJyZWQgZm9yZWdyb3VuZCJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQoMSwgYmx1ZSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDIsIHJlZCk7Ci0JaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsibm9ybWFsIiwiYmx1ZSBiYWNrZ3JvdW5kIiwicmVkIGJhY2tncm91bmQifSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKDEsIGJsdWUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgyLCByZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IndoaXRlIGZvcmUvYmx1ZSBiYWNrIiwibm9ybWFsIiwid2hpdGUgZm9yZS9yZWQgYmFjayJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQoMCwgd2hpdGUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgwLCBibHVlKTsKLQlpdGVtLnNldEZvcmVncm91bmQoMiwgd2hpdGUpOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgyLCByZWQpOwotCQotCWNvbHVtbjEucGFjaygpOwotCWNvbHVtbjIucGFjaygpOwotCWNvbHVtbjMucGFjaygpOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YThkMDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogZHJhdyBhIHRoaWNrIGxpbmUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCUdDIGdjID0gbmV3IEdDIChzaGVsbCk7Ci0JZ2Muc2V0TGluZVdpZHRoICg0KTsKLQlnYy5kcmF3UmVjdGFuZ2xlICgyMCwgMjAsIDEwMCwgMTAwKTsKLQlnYy5kaXNwb3NlICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzgwY2I4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXN5SW5kaWNhdG9yIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBidXN5IGN1cnNvciBkdXJpbmcgbG9uZyBydW5uaW5nIHRhc2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzAgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWZpbmFsIGludFtdIG5leHRJZCA9IG5ldyBpbnRbMV07Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoImludm9rZSBsb25nIHJ1bm5pbmcgam9iIik7Ci0JCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUnVubmFibGUgbG9uZ0pvYiA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJCWludCBpZDsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJaWQgPSBuZXh0SWRbMF0rKzsKLQkJCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHRleHQuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQkJCQkJdGV4dC5hcHBlbmQoIlxuU3RhcnQgbG9uZyBydW5uaW5nIHRhc2sgIitpZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZG8gdGFzayB0aGF0IHRha2VzIGEgbG9uZyB0aW1lIGluIGEgc2VwYXJhdGUgdGhyZWFkICIraWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAodGV4dC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJCQl0ZXh0LmFwcGVuZCgiXG5Db21wbGV0ZWQgbG9uZyBydW5uaW5nIHRhc2sgIitpZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCQkJZGlzcGxheS53YWtlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQl0aHJlYWQuc3RhcnQoKTsKLQkJCQkJCXdoaWxlICghZG9uZSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGRpc3BsYXksIGxvbmdKb2IpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSgyNTAsIDE1MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQwYzA1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IHNob3cgYSBwb3B1cCBtZW51ICh3YWl0IGZvciBpdCB0byBjbG9zZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzMSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKCJNZW51IEl0ZW0iKTsKLQkJCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiSXRlbSBTZWxlY3RlZCIpOwotCQkJCX0KLQkJCX0pOwotCQkJbWVudS5zZXRMb2NhdGlvbiAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJd2hpbGUgKCFtZW51LmlzRGlzcG9zZWQgKCkgJiYgbWVudS5pc1Zpc2libGUgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQkJfQotCQkJbWVudS5kaXNwb3NlICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzAwOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogUHJpbnRpbmcgZXhhbXBsZSBzbmlwcGV0OiBwcmludCAiSGVsbG8gV29ybGQhIiBpbiBibGFjaywgb3V0bGluZWQgaW4gcmVkLCB0byBkZWZhdWx0IHByaW50ZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JaWYgKGRhdGEgPT0gbnVsbCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IE5vIGRlZmF1bHQgcHJpbnRlci4iKTsKLQkJcmV0dXJuOwotCX0KLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlpZiAocHJpbnRlci5zdGFydEpvYigiU1dUIFByaW50aW5nIFNuaXBwZXQiKSkgewotCQlDb2xvciBibGFjayA9IHByaW50ZXIuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKTsKLQkJQ29sb3Igd2hpdGUgPSBwcmludGVyLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JCUNvbG9yIHJlZCA9IHByaW50ZXIuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJUG9pbnQgZHBpID0gcHJpbnRlci5nZXREUEkoKTsKLQkJaW50IGxlZnRNYXJnaW4gPSBkcGkueCArIHRyaW0ueDsgLy8gb25lIGluY2ggZnJvbSBsZWZ0IHNpZGUgb2YgcGFwZXIKLQkJaW50IHRvcE1hcmdpbiA9IGRwaS55IC8gMiArIHRyaW0ueTsgLy8gb25lLWhhbGYgaW5jaCBmcm9tIHRvcCBlZGdlIG9mIHBhcGVyCi0JCUdDIGdjID0gbmV3IEdDKHByaW50ZXIpOwotCQlpZiAocHJpbnRlci5zdGFydFBhZ2UoKSkgewotCQkJZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGJsYWNrKTsKLQkJCVN0cmluZyB0ZXN0U3RyaW5nID0gIkhlbGxvIFdvcmxkISI7Ci0JCQlQb2ludCBleHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQodGVzdFN0cmluZyk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRlc3RTdHJpbmcsIGxlZnRNYXJnaW4sIHRvcE1hcmdpbik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JCQlnYy5kcmF3UmVjdGFuZ2xlKGxlZnRNYXJnaW4sIHRvcE1hcmdpbiwgZXh0ZW50LngsIGV4dGVudC55KTsKLQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJcHJpbnRlci5lbmRKb2IoKTsKLQl9Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTljNjI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBQcmludGluZyBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHRleHQgdG8gcHJpbnRlciwgd2l0aCB3b3JkIHdyYXAgYW5kIHBhZ2luYXRpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzMgewotCURpc3BsYXkgZGlzcGxheTsKLQlTaGVsbCBzaGVsbDsKLQlUZXh0IHRleHQ7Ci0JRm9udCBmb250OwotCUNvbG9yIGZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yOwotCQotCVByaW50ZXIgcHJpbnRlcjsKLQlHQyBnYzsKLQlGb250RGF0YVtdIHByaW50ZXJGb250RGF0YTsKLQlSR0IgcHJpbnRlckZvcmVncm91bmQsIHByaW50ZXJCYWNrZ3JvdW5kOwotCi0JaW50IGxpbmVIZWlnaHQgPSAwOwotCWludCB0YWJXaWR0aCA9IDA7Ci0JaW50IGxlZnRNYXJnaW4sIHJpZ2h0TWFyZ2luLCB0b3BNYXJnaW4sIGJvdHRvbU1hcmdpbjsKLQlpbnQgeCwgeTsKLQlpbnQgaW5kZXgsIGVuZDsKLQlTdHJpbmcgdGV4dFRvUHJpbnQ7Ci0JU3RyaW5nIHRhYnM7Ci0JU3RyaW5nQnVmZmVyIHdvcmRCdWZmZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBTbmlwcGV0MTMzKCkub3BlbigpOwotCX0KLQkKLQl2b2lkIG9wZW4oKSB7Ci0JCWRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KCJQcmludCBUZXh0Iik7Ci0JCXRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlpdGVtLnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0TWVudShmaWxlTWVudSk7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCImT3Blbi4uLiIpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DVFJMICsgJ08nKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudU9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJGb250Li4uIik7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVGb250KCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRm9yZWdyb3VuZCBDb2xvci4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Rm9yZWdyb3VuZENvbG9yKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiQmFja2dyb3VuZCBDb2xvci4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51QmFja2dyb3VuZENvbG9yKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiJlByaW50Li4uIik7Ci0JCWl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNUUkwgKyAnUCcpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51UHJpbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCW5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlNFUEFSQVRPUik7Ci0JCWl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJFJnhpdCIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCWlmIChmb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSBiYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCQotCXZvaWQgbWVudU9wZW4oKSB7Ci0JCWZpbmFsIFN0cmluZyB0ZXh0U3RyaW5nOwotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouamF2YSIsICIqLioifSk7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSByZXR1cm47Ci0JCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW09IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZS5nZXRQYXRoKCkpOwotCQkJdHJ5IHsKLQkJCQlSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotCQkJCWNoYXJbXSByZWFkQnVmZmVyPSBuZXcgY2hhclsyMDQ4XTsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKChpbnQpIGZpbGUubGVuZ3RoKCkpOwotCQkJCWludCBuOwotCQkJCXdoaWxlICgobiA9IGluLnJlYWQocmVhZEJ1ZmZlcikpID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCX0KLQkJCQl0ZXh0U3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJCWJveC5zZXRNZXNzYWdlKCJFcnJvciByZWFkaW5nIGZpbGU6XG4iICsgbmFtZSk7Ci0JCQkJYm94Lm9wZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuSUNPTl9FUlJPUik7Ci0JCQlib3guc2V0TWVzc2FnZSgiRmlsZSBub3QgZm91bmQ6XG4iICsgbmFtZSk7Ci0JCQlib3gub3BlbigpOwotCQkJcmV0dXJuOwotCQl9CQotCQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JfQotCi0Jdm9pZCBtZW51Rm9udCgpIHsKLQkJRm9udERpYWxvZyBmb250RGlhbG9nID0gbmV3IEZvbnREaWFsb2coc2hlbGwpOwotCQlmb250RGlhbG9nLnNldEZvbnRMaXN0KHRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCkpOwotCQlGb250RGF0YSBmb250RGF0YSA9IGZvbnREaWFsb2cub3BlbigpOwotCQlpZiAoZm9udERhdGEgIT0gbnVsbCkgewotCQkJaWYgKGZvbnQgIT0gbnVsbCkgZm9udC5kaXNwb3NlKCk7Ci0JCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZm9udERhdGEpOwotCQkJdGV4dC5zZXRGb250KGZvbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51Rm9yZWdyb3VuZENvbG9yKCkgewotCQlDb2xvckRpYWxvZyBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhzaGVsbCk7Ci0JCWNvbG9yRGlhbG9nLnNldFJHQih0ZXh0LmdldEZvcmVncm91bmQoKS5nZXRSR0IoKSk7Ci0JCVJHQiByZ2IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZ2IgIT0gbnVsbCkgewotCQkJaWYgKGZvcmVncm91bmRDb2xvciAhPSBudWxsKSBmb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJZm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCQl0ZXh0LnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQkJfQotCX0KLQotCXZvaWQgbWVudUJhY2tncm91bmRDb2xvcigpIHsKLQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQljb2xvckRpYWxvZy5zZXRSR0IodGV4dC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCkpOwotCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQlpZiAocmdiICE9IG51bGwpIHsKLQkJCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVQcmludCgpIHsKLQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCVByaW50ZXJEYXRhIGRhdGEgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JCWlmIChkYXRhLnByaW50VG9GaWxlKSB7Ci0JCQlkYXRhLmZpbGVOYW1lID0gInByaW50Lm91dCI7IC8vIHlvdSBwcm9iYWJseSB3YW50IHRvIGFzayB0aGUgdXNlciBmb3IgYSBmaWxlbmFtZQotCQl9Ci0JCQotCQkvKiBHZXQgdGhlIHRleHQgdG8gcHJpbnQgZnJvbSB0aGUgVGV4dCB3aWRnZXQgKHlvdSBjb3VsZCBnZXQgaXQgZnJvbSBhbnl3aGVyZSwgaS5lLiB5b3VyIGphdmEgbW9kZWwpICovCi0JCXRleHRUb1ByaW50ID0gdGV4dC5nZXRUZXh0KCk7Ci0KLQkJLyogR2V0IHRoZSBmb250ICYgZm9yZWdyb3VuZCAmIGJhY2tncm91bmQgZGF0YS4gKi8KLQkJcHJpbnRlckZvbnREYXRhID0gdGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJcHJpbnRlckZvcmVncm91bmQgPSB0ZXh0LmdldEZvcmVncm91bmQoKS5nZXRSR0IoKTsKLQkJcHJpbnRlckJhY2tncm91bmQgPSB0ZXh0LmdldEJhY2tncm91bmQoKS5nZXRSR0IoKTsKLQkJCi0JCS8qIERvIHRoZSBwcmludGluZyBpbiBhIGJhY2tncm91bmQgdGhyZWFkIHNvIHRoYXQgc3Bvb2xpbmcgZG9lcyBub3QgZnJlZXplIHRoZSBVSS4gKi8KLQkJcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCQlUaHJlYWQgcHJpbnRpbmdUaHJlYWQgPSBuZXcgVGhyZWFkKCJQcmludGluZyIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcmludChwcmludGVyKTsKLQkJCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfTsKLQkJcHJpbnRpbmdUaHJlYWQuc3RhcnQoKTsKLQl9Ci0JCi0Jdm9pZCBwcmludChQcmludGVyIHByaW50ZXIpIHsKLQkJaWYgKHByaW50ZXIuc3RhcnRKb2IoIlRleHQiKSkgeyAgIC8vIHRoZSBzdHJpbmcgaXMgdGhlIGpvYiBuYW1lIC0gc2hvd3MgdXAgaW4gdGhlIHByaW50ZXIncyBqb2IgbGlzdAotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwcmludGVyLmdldENsaWVudEFyZWEoKTsKLQkJCVJlY3RhbmdsZSB0cmltID0gcHJpbnRlci5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJCVBvaW50IGRwaSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCQlsZWZ0TWFyZ2luID0gZHBpLnggKyB0cmltLng7IC8vIG9uZSBpbmNoIGZyb20gbGVmdCBzaWRlIG9mIHBhcGVyCi0JCQlyaWdodE1hcmdpbiA9IGNsaWVudEFyZWEud2lkdGggLSBkcGkueCArIHRyaW0ueCArIHRyaW0ud2lkdGg7IC8vIG9uZSBpbmNoIGZyb20gcmlnaHQgc2lkZSBvZiBwYXBlcgotCQkJdG9wTWFyZ2luID0gZHBpLnkgKyB0cmltLnk7IC8vIG9uZSBpbmNoIGZyb20gdG9wIGVkZ2Ugb2YgcGFwZXIKLQkJCWJvdHRvbU1hcmdpbiA9IGNsaWVudEFyZWEuaGVpZ2h0IC0gZHBpLnkgKyB0cmltLnkgKyB0cmltLmhlaWdodDsgLy8gb25lIGluY2ggZnJvbSBib3R0b20gZWRnZSBvZiBwYXBlcgotCQkJCi0JCQkvKiBDcmVhdGUgYSBidWZmZXIgZm9yIGNvbXB1dGluZyB0YWIgd2lkdGguICovCi0JCQlpbnQgdGFiU2l6ZSA9IDQ7IC8vIGlzIHRhYiB3aWR0aCBhIHVzZXIgc2V0dGluZyBpbiB5b3VyIFVJPwotCQkJU3RyaW5nQnVmZmVyIHRhYkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGFiU2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYlNpemU7IGkrKykgdGFiQnVmZmVyLmFwcGVuZCgnICcpOwotCQkJdGFicyA9IHRhYkJ1ZmZlci50b1N0cmluZygpOwotCi0JCQkvKiBDcmVhdGUgcHJpbnRlciBHQywgYW5kIGNyZWF0ZSBhbmQgc2V0IHRoZSBwcmludGVyIGZvbnQgJiBmb3JlZ3JvdW5kIGNvbG9yLiAqLwotCQkJZ2MgPSBuZXcgR0MocHJpbnRlcik7Ci0JCQlGb250IHByaW50ZXJGb250ID0gbmV3IEZvbnQocHJpbnRlciwgcHJpbnRlckZvbnREYXRhKTsKLQkJCUNvbG9yIHByaW50ZXJGb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IocHJpbnRlciwgcHJpbnRlckZvcmVncm91bmQpOwotCQkJQ29sb3IgcHJpbnRlckJhY2tncm91bmRDb2xvciA9IG5ldyBDb2xvcihwcmludGVyLCBwcmludGVyQmFja2dyb3VuZCk7IAotCQkJCi0JCQlnYy5zZXRGb250KHByaW50ZXJGb250KTsKLQkJCWdjLnNldEZvcmVncm91bmQocHJpbnRlckZvcmVncm91bmRDb2xvcik7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHByaW50ZXJCYWNrZ3JvdW5kQ29sb3IpOwotCQkJdGFiV2lkdGggPSBnYy5zdHJpbmdFeHRlbnQodGFicykueDsKLQkJCWxpbmVIZWlnaHQgPSBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwotCQkKLQkJCS8qIFByaW50IHRleHQgdG8gY3VycmVudCBnYyB1c2luZyB3b3JkIHdyYXAgKi8KLQkJCXByaW50VGV4dCgpOwotCQkJcHJpbnRlci5lbmRKb2IoKTsKLQotCQkJLyogQ2xlYW51cCBncmFwaGljcyByZXNvdXJjZXMgdXNlZCBpbiBwcmludGluZyAqLwotCQkJcHJpbnRlckZvbnQuZGlzcG9zZSgpOwotCQkJcHJpbnRlckZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQlwcmludGVyQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQl2b2lkIHByaW50VGV4dCgpIHsKLQkJcHJpbnRlci5zdGFydFBhZ2UoKTsKLQkJd29yZEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJeCA9IGxlZnRNYXJnaW47Ci0JCXkgPSB0b3BNYXJnaW47Ci0JCWluZGV4ID0gMDsKLQkJZW5kID0gdGV4dFRvUHJpbnQubGVuZ3RoKCk7Ci0JCXdoaWxlIChpbmRleCA8IGVuZCkgewotCQkJY2hhciBjID0gdGV4dFRvUHJpbnQuY2hhckF0KGluZGV4KTsKLQkJCWluZGV4Kys7Ci0JCQlpZiAoYyAhPSAwKSB7Ci0JCQkJaWYgKGMgPT0gMHgwYSB8fCBjID09IDB4MGQpIHsKLQkJCQkJaWYgKGMgPT0gMHgwZCAmJiBpbmRleCA8IGVuZCAmJiB0ZXh0VG9QcmludC5jaGFyQXQoaW5kZXgpID09IDB4MGEpIHsKLQkJCQkJCWluZGV4Kys7IC8vIGlmIHRoaXMgaXMgY3ItbGYsIHNraXAgdGhlIGxmCi0JCQkJCX0KLQkJCQkJcHJpbnRXb3JkQnVmZmVyKCk7Ci0JCQkJCW5ld2xpbmUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYyAhPSAnXHQnKSB7Ci0JCQkJCQl3b3JkQnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJfQotCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCQkJcHJpbnRXb3JkQnVmZmVyKCk7Ci0JCQkJCQlpZiAoYyA9PSAnXHQnKSB7Ci0JCQkJCQkJeCArPSB0YWJXaWR0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoeSArIGxpbmVIZWlnaHQgPD0gYm90dG9tTWFyZ2luKSB7Ci0JCQlwcmludGVyLmVuZFBhZ2UoKTsKLQkJfQotCX0KLQotCXZvaWQgcHJpbnRXb3JkQnVmZmVyKCkgewotCQlpZiAod29yZEJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyB3b3JkID0gd29yZEJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50IHdvcmRXaWR0aCA9IGdjLnN0cmluZ0V4dGVudCh3b3JkKS54OwotCQkJaWYgKHggKyB3b3JkV2lkdGggPiByaWdodE1hcmdpbikgewotCQkJCS8qIHdvcmQgZG9lc24ndCBmaXQgb24gY3VycmVudCBsaW5lLCBzbyB3cmFwICovCi0JCQkJbmV3bGluZSgpOwotCQkJfQotCQkJZ2MuZHJhd1N0cmluZyh3b3JkLCB4LCB5LCBmYWxzZSk7Ci0JCQl4ICs9IHdvcmRXaWR0aDsKLQkJCXdvcmRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG5ld2xpbmUoKSB7Ci0JCXggPSBsZWZ0TWFyZ2luOwotCQl5ICs9IGxpbmVIZWlnaHQ7Ci0JCWlmICh5ICsgbGluZUhlaWdodCA+IGJvdHRvbU1hcmdpbikgewotCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCQlpZiAoaW5kZXggKyAxIDwgZW5kKSB7Ci0JCQkJeSA9IHRvcE1hcmdpbjsKLQkJCQlwcmludGVyLnN0YXJ0UGFnZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ4MTlhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBub24tcmVjdGFuZ3VsYXIgd2luZG93Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzQgewotCi1zdGF0aWMgaW50W10gY2lyY2xlKGludCByLCBpbnQgb2Zmc2V0WCwgaW50IG9mZnNldFkpIHsKLQlpbnRbXSBwb2x5Z29uID0gbmV3IGludFs4ICogciArIDRdOwotCS8veF4yICsgeV4yID0gcl4yCi0JZm9yIChpbnQgaSA9IDA7IGkgPCAyICogciArIDE7IGkrKykgewotCQlpbnQgeCA9IGkgLSByOwotCQlpbnQgeSA9IChpbnQpTWF0aC5zcXJ0KHIqciAtIHgqeCk7Ci0JCXBvbHlnb25bMippXSA9IG9mZnNldFggKyB4OwotCQlwb2x5Z29uWzIqaSsxXSA9IG9mZnNldFkgKyB5OwotCQlwb2x5Z29uWzgqciAtIDIqaSAtIDJdID0gb2Zmc2V0WCArIHg7Ci0JCXBvbHlnb25bOCpyIC0gMippIC0gMV0gPSBvZmZzZXRZIC0geTsKLQl9Ci0JcmV0dXJuIHBvbHlnb247Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCS8vU2hlbGwgbXVzdCBiZSBjcmVhdGVkIHdpdGggc3R5bGUgU1dULk5PX1RSSU0KLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JLy9kZWZpbmUgYSByZWdpb24gdGhhdCBsb29rcyBsaWtlIGEga2V5IGhvbGUKLQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCXJlZ2lvbi5hZGQoY2lyY2xlKDY3LCA2NywgNjcpKTsKLQlyZWdpb24uc3VidHJhY3QoY2lyY2xlKDIwLCA2NywgNTApKTsKLQlyZWdpb24uc3VidHJhY3QobmV3IGludFtdezY3LCA1MCwgNTUsIDEwNSwgNzksIDEwNX0pOwotCS8vZGVmaW5lIHRoZSBzaGFwZSBvZiB0aGUgc2hlbGwgdXNpbmcgc2V0UmVnaW9uCi0Jc2hlbGwuc2V0UmVnaW9uKHJlZ2lvbik7Ci0JUmVjdGFuZ2xlIHNpemUgPSByZWdpb24uZ2V0Qm91bmRzKCk7Ci0Jc2hlbGwuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7Ci0JLy9hZGQgYWJpbGl0eSB0byBtb3ZlIHNoZWxsIGFyb3VuZAotCUxpc3RlbmVyIGwgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCVBvaW50IG9yaWdpbjsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCW9yaWdpbiA9IG5ldyBQb2ludChlLngsIGUueSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6Ci0JCQkJCW9yaWdpbiA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKG9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJCQlQb2ludCBwID0gZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIGUueCwgZS55KTsKLQkJCQkJCXNoZWxsLnNldExvY2F0aW9uKHAueCAtIG9yaWdpbi54LCBwLnkgLSBvcmlnaW4ueSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIGwpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZVVwLCBsKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCBsKTsKLQkvL2FkZCBhYmlsaXR5IHRvIGNsb3NlIHNoZWxsCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRCYWNrZ3JvdW5kKHNoZWxsLmdldEJhY2tncm91bmQoKSk7Ci0JYi5zZXRUZXh0KCJjbG9zZSIpOwotCWIucGFjaygpOwotCWIuc2V0TG9jYXRpb24oMTAsIDY4KTsKLQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOGY3MTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBlbWJlZCBTd2luZy9BV1QgaW4gU1dUCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNSB7Ci0KLQlzdGF0aWMgY2xhc3MgRmlsZVRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewkJCi0JCUZpbGVbXSBmaWxlczsgICAgICAgIAotCQlTdHJpbmdbXSBjb2x1bW5zTmFtZSA9IHsiTmFtZSIsICJTaXplIiwgIkRhdGUgTW9kaWZpZWQifTsKLQkJCi0JCXB1YmxpYyBGaWxlVGFibGVNb2RlbCAoRmlsZVtdIGZpbGVzKSB7Ci0JCQl0aGlzLmZpbGVzID0gZmlsZXM7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDb2x1bW5Db3VudCAoKSB7Ci0JCQlyZXR1cm4gY29sdW1uc05hbWUubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyBDbGFzcyBnZXRDb2x1bW5DbGFzcyAoaW50IGNvbCkgewotCQkJaWYgKGNvbCA9PSAxKSByZXR1cm4gTG9uZy5jbGFzczsKLQkJCWlmIChjb2wgPT0gMikgcmV0dXJuIERhdGUuY2xhc3M7Ci0JCQlyZXR1cm4gU3RyaW5nLmNsYXNzOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Um93Q291bnQgKCkgewotCQkJcmV0dXJuIGZpbGVzID09IG51bGwgPyAwIDogZmlsZXMubGVuZ3RoOwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdCAoaW50IHJvdywgaW50IGNvbCkgewotCQkJaWYgKGNvbCA9PSAwKSByZXR1cm4gZmlsZXNbcm93XS5nZXROYW1lKCk7Ci0JCQlpZiAoY29sID09IDEpIHJldHVybiBuZXcgTG9uZyhmaWxlc1tyb3ddLmxlbmd0aCgpKTsKLQkJCWlmIChjb2wgPT0gMikgcmV0dXJuIG5ldyBEYXRlKGZpbGVzW3Jvd10ubGFzdE1vZGlmaWVkKCkpOwotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZSAoaW50IGNvbCkgewotCQkJcmV0dXJuIGNvbHVtbnNOYW1lW2NvbF07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJTV1QgYW5kIFN3aW5nL0FXVCBFeGFtcGxlIik7Ci0KLQkJTGlzdGVuZXIgZXhpdExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCU1lc3NhZ2VCb3ggZGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5DQU5DRUwgfCBTV1QuSUNPTl9RVUVTVElPTik7Ci0JCQkJZGlhbG9nLnNldFRleHQoIlF1ZXN0aW9uIik7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoIkV4aXQ/Iik7Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuQ2xvc2UpIGUuZG9pdCA9IGZhbHNlOwotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IFNXVC5PSykgcmV0dXJuOwotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfTsJCi0JCUxpc3RlbmVyIGFib3V0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZmluYWwgU2hlbGwgcyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCQlzLnNldFRleHQoIkFib3V0Iik7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDIwOwotCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJCQlzLnNldExheW91dChsYXlvdXQpOwotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHMsIFNXVC5OT05FKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJTV1QgYW5kIEFXVCBFeGFtcGxlLiIpOwotCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHMsIFNXVC5QVVNIKTsKLQkJCQlidXR0b24uc2V0VGV4dCgiT0siKTsKLQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlzLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXMucGFjaygpOwotCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcy5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgeCA9IHBhcmVudEJvdW5kcy54ICsgKHBhcmVudEJvdW5kcy53aWR0aCAtIGJvdW5kcy53aWR0aCkgLyAyOwotCQkJCWludCB5ID0gcGFyZW50Qm91bmRzLnkgKyAocGFyZW50Qm91bmRzLmhlaWdodCAtIGJvdW5kcy5oZWlnaHQpIC8gMjsKLQkJCQlzLnNldExvY2F0aW9uKHgsIHkpOwotCQkJCXMub3BlbigpOwotCQkJCXdoaWxlICghcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIGV4aXRMaXN0ZW5lcik7Ci0JCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtKG1iLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVJdGVtLnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgZmlsZU1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JCWZpbGVJdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotCQlNZW51SXRlbSBleGl0SXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlleGl0SXRlbS5zZXRUZXh0KCImRXhpdFx0Q3RybCtYIik7Ci0JCWV4aXRJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DT05UUk9MICsgJ1gnKTsKLQkJZXhpdEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZXhpdExpc3RlbmVyKTsKLQkJTWVudUl0ZW0gYWJvdXRJdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWFib3V0SXRlbS5zZXRUZXh0KCImQWJvdXRcdEN0cmwrQSIpOwotCQlhYm91dEl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULkNPTlRST0wgKyAnQScpOwotCQlhYm91dEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgYWJvdXRMaXN0ZW5lcik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCi0JCVJHQiBjb2xvciA9IHNoZWxsLmdldEJhY2tncm91bmQoKS5nZXRSR0IoKTsKLQkJTGFiZWwgc2VwYXJhdG9yMSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJTGFiZWwgbG9jYXRpb25MYiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxiLnNldFRleHQoIkxvY2F0aW9uOiIpOwotCQlDb21wb3NpdGUgbG9jYXRpb25Db21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQkJVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIFNXVC5GTEFUKTsKLQkJVG9vbEl0ZW0gZXhpdFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJZXhpdFRvb2xJdGVtLnNldFRleHQoIiZFeGl0Iik7Ci0JCWV4aXRUb29sSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBleGl0TGlzdGVuZXIpOwotCQlUb29sSXRlbSBhYm91dFRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJYWJvdXRUb29sSXRlbS5zZXRUZXh0KCImQWJvdXQiKTsKLQkJYWJvdXRUb29sSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBhYm91dExpc3RlbmVyKTsKLQkJTGFiZWwgc2VwYXJhdG9yMiA9IG5ldyBMYWJlbChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZpbmFsIFRyZWUgZmlsZVRyZWUgPSBuZXcgVHJlZShjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVNhc2ggc2FzaCA9IG5ldyBTYXNoKGNvbXAsIFNXVC5WRVJUSUNBTCk7Ci0JCUNvbXBvc2l0ZSB0YWJsZUNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5FTUJFRERFRCk7Ci0JCUxhYmVsIHNlcGFyYXRvcjMgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUNvbXBvc2l0ZSBzdGF0dXNDb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQotCQlqYXZhLmF3dC5GcmFtZSBsb2NhdGlvbkZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUobG9jYXRpb25Db21wKTsKLQkJZmluYWwgamF2YS5hd3QuVGV4dEZpZWxkIGxvY2F0aW9uVGV4dCA9IG5ldyBqYXZhLmF3dC5UZXh0RmllbGQoKTsKLQkJbG9jYXRpb25GcmFtZS5hZGQobG9jYXRpb25UZXh0KTsKLQotCQlqYXZhLmF3dC5GcmFtZSBmaWxlVGFibGVGcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKHRhYmxlQ29tcCk7Ci0JCWphdmEuYXd0LlBhbmVsIHBhbmVsID0gbmV3IGphdmEuYXd0LlBhbmVsKG5ldyBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQoKSk7Ci0JCWZpbGVUYWJsZUZyYW1lLmFkZChwYW5lbCk7Ci0JCWZpbmFsIEpUYWJsZSBmaWxlVGFibGUgPSBuZXcgSlRhYmxlKG5ldyBGaWxlVGFibGVNb2RlbChudWxsKSk7Ci0JCWZpbGVUYWJsZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJZmlsZVRhYmxlLnNldFNob3dHcmlkKGZhbHNlKTsKLQkJZmlsZVRhYmxlLmNyZWF0ZURlZmF1bHRDb2x1bW5zRnJvbU1vZGVsKCk7Ci0JCUpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUoZmlsZVRhYmxlKTsKLQkJcGFuZWwuYWRkKHNjcm9sbFBhbmUpOwotCi0JCWphdmEuYXd0LkZyYW1lIHN0YXR1c0ZyYW1lID0gU1dUX0FXVC5uZXdfRnJhbWUoc3RhdHVzQ29tcCk7Ci0JCXN0YXR1c0ZyYW1lLnNldEJhY2tncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpKTsKLQkJZmluYWwgamF2YS5hd3QuTGFiZWwgc3RhdHVzTGFiZWwgPSBuZXcgamF2YS5hd3QuTGFiZWwoKTsKLQkJc3RhdHVzRnJhbWUuYWRkKHN0YXR1c0xhYmVsKTsKLQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiU2VsZWN0IGEgZmlsZSIpOwotCi0JCXNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuRFJBRykgcmV0dXJuOwotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpZmlsZVRyZWUuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCVJlY3RhbmdsZSB0cmltID0gZmlsZVRyZWUuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQkJZGF0YS53aWR0aEhpbnQgPSBlLnggLSB0cmltLndpZHRoOwotCQkJCWNvbXAubGF5b3V0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUZpbGVbXSByb290cyA9IEZpbGUubGlzdFJvb3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZmlsZSA9IHJvb3RzW2ldOwotCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0oZmlsZVRyZWUsIFNXVC5OT05FKTsKLQkJCXRyZWVJdGVtLnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl0cmVlSXRlbS5zZXREYXRhKGZpbGUpOwotCQkJbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JCX0KLQkJZmlsZVRyZWUuYWRkTGlzdGVuZXIoU1dULkV4cGFuZCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZS5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlpZiAoaXRlbS5nZXRJdGVtQ291bnQoKSA9PSAxKSB7Ci0JCQkJCVRyZWVJdGVtIGZpcnN0SXRlbSA9IGl0ZW0uZ2V0SXRlbXMoKVswXTsKLQkJCQkJaWYgKGZpcnN0SXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgcmV0dXJuOwotCQkJCQlmaXJzdEl0ZW0uZGlzcG9zZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJRmlsZSByb290ID0gKEZpbGUpaXRlbS5nZXREYXRhKCk7Ci0JCQkJRmlsZVtdIGZpbGVzID0gcm9vdC5saXN0RmlsZXMoKTsKLQkJCQlpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0JCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCXRyZWVJdGVtLnNldFRleHQoZmlsZS5nZXROYW1lKCkpOwotCQkJCQkJdHJlZUl0ZW0uc2V0RGF0YShmaWxlKTsKLQkJCQkJCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZmlsZVRyZWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZS5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlmaW5hbCBGaWxlIHJvb3QgPSAoRmlsZSlpdGVtLmdldERhdGEoKTsKLQkJCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChyb290LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWxvY2F0aW9uVGV4dC5zZXRUZXh0KHJvb3QuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJZmlsZVRhYmxlLnNldE1vZGVsKG5ldyBGaWxlVGFibGVNb2RlbChyb290Lmxpc3RGaWxlcygpKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YTsJCQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlzZXBhcmF0b3IxLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlsb2NhdGlvbkxiLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGxvY2F0aW9uVGV4dC5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQlsb2NhdGlvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJdG9vbEJhci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlzZXBhcmF0b3IyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlkYXRhLmhlaWdodEhpbnQgPSBzdGF0dXNMYWJlbC5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQlzdGF0dXNDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsJCQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCWZpbGVUcmVlLnNldExheW91dERhdGEoZGF0YSk7CQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJc2FzaC5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGFibGVDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTUwYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiByZW5kZXIgSFRNTCBmcm9tIG1lbW9yeQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM2IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlTdHJpbmcgaHRtbCA9ICI8SFRNTD48SEVBRD48VElUTEU+SFRNTCBUZXN0PC9USVRMRT48L0hFQUQ+PEJPRFk+IjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgaHRtbCArPSAiPFA+VGhpcyBpcyBsaW5lICIraSsiPC9QPiI7Ci0JCWh0bWwgKz0gIjwvQk9EWT48L0hUTUw+IjsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjZjc0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IHJlbmRlciBIVE1MIHRoYXQgaW5jbHVkZXMgcmVsYXRpdmUgbGlua3MgZnJvbSBtZW1vcnkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JLyogUmVsYXRpdmUgbGlua3M6IHVzZSB0aGUgSFRNTCBiYXNlIHRhZyAqLwotCVN0cmluZyBodG1sID0gIjxodG1sPjxoZWFkPiIrCi0JCSI8YmFzZSBocmVmPVwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvXCIgPiIrCi0JCSI8dGl0bGU+SFRNTCBUZXN0PC90aXRsZT48L2hlYWQ+IisKLQkJIjxib2R5PjxhIGhyZWY9XCJmYXEucGhwXCI+bG9jYWwgbGluazwvYT48L2JvZHk+PC9odG1sPiI7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlCcm93c2VyIGJyb3dzZXI7Ci0JdHJ5IHsKLQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQlyZXR1cm47Ci0JfQotCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjODQyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogc2V0IGljb25zIHdpdGggZGlmZmVyZW50IHJlc29sdXRpb25zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCi0JCUltYWdlIHNtYWxsID0gbmV3IEltYWdlKGRpc3BsYXksIDE2LCAxNik7Ci0JCUdDIGdjID0gbmV3IEdDKHNtYWxsKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZmlsbEFyYygwLCAwLCAxNiwgMTYsIDQ1LCAyNzApOwotCQlnYy5kaXNwb3NlKCk7Ci0JCQotCQlJbWFnZSBsYXJnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAzMiwgMzIpOwotCQlnYyA9IG5ldyBHQyhsYXJnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxBcmMoMCwgMCwgMzIsIDMyLCA0NSwgMjcwKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJLyogUHJvdmlkZSBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgZm9yIGljb25zIHRvIGdldAotCQkgKiBoaWdoIHF1YWxpdHkgcmVuZGVyaW5nIHdoZXJldmVyIHRoZSBPUyBuZWVkcyAKLQkJICogbGFyZ2UgaWNvbnMuIEZvciBleGFtcGxlLCB0aGUgQUxUK1RBQiB3aW5kb3cgCi0JCSAqIG9uIGNlcnRhaW4gc3lzdGVtcyB1c2VzIGEgbGFyZ2VyIGljb24uCi0JCSAqLwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiU21hbGwgYW5kIExhcmdlIGljb25zIik7Ci0JCXNoZWxsLnNldEltYWdlcyhuZXcgSW1hZ2VbXSB7c21hbGwsIGxhcmdlfSk7Ci0KLQkJLyogTm8gbGFyZ2UgaWNvbjogdGhlIE9TIHdpbGwgc2NhbGUgdXAgdGhlCi0JCSAqIHNtYWxsIGljb24gd2hlbiBpdCBuZWVkcyBhIGxhcmdlIG9uZS4KLQkJICovCi0JCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwyLnNldFRleHQoIlNtYWxsIGljb24iKTsKLQkJc2hlbGwyLnNldEltYWdlKHNtYWxsKTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJc2hlbGwyLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJc21hbGwuZGlzcG9zZSgpOwotCQlsYXJnZS5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0OWZhZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUaGlzIHNuaXBwZXQgd2FzIGFkYXB0ZWQgZnJvbSBvcmcuZWNsaXBzZS5kcmF3MmQuSW1hZ2VVdGlsaXRpZXMgaW4gCi0gKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL29yZy5lY2xpcHNlLmRyYXcyZC8/Y3Zzcm9vdD1Ub29sc19Qcm9qZWN0Ci0gKiBieSBQcmF0aWsgU2hhaC4KLSAqCi0gKiBleGFtcGxlIHNuaXBwZXQ6IHJvdGF0ZSBhbmQgZmxpcCBhbiBpbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzkgewkKLQotc3RhdGljIEltYWdlRGF0YSByb3RhdGUoSW1hZ2VEYXRhIHNyY0RhdGEsIGludCBkaXJlY3Rpb24pIHsKLQlpbnQgYnl0ZXNQZXJQaXhlbCA9IHNyY0RhdGEuYnl0ZXNQZXJMaW5lIC8gc3JjRGF0YS53aWR0aDsKLQlpbnQgZGVzdEJ5dGVzUGVyTGluZSA9IChkaXJlY3Rpb24gPT0gU1dULkRPV04pPyBzcmNEYXRhLndpZHRoICogYnl0ZXNQZXJQaXhlbCA6IHNyY0RhdGEuaGVpZ2h0ICogYnl0ZXNQZXJQaXhlbDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlWyhkaXJlY3Rpb24gPT0gU1dULkRPV04pPyBzcmNEYXRhLmhlaWdodCAqIGRlc3RCeXRlc1BlckxpbmUgOiBzcmNEYXRhLndpZHRoICogZGVzdEJ5dGVzUGVyTGluZV07Ci0JaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLQlmb3IgKGludCBzcmNZID0gMDsgc3JjWSA8IHNyY0RhdGEuaGVpZ2h0OyBzcmNZKyspIHsKLQkJZm9yIChpbnQgc3JjWCA9IDA7IHNyY1ggPCBzcmNEYXRhLndpZHRoOyBzcmNYKyspIHsKLQkJCWludCBkZXN0WCA9IDAsIGRlc3RZID0gMCwgZGVzdEluZGV4ID0gMCwgc3JjSW5kZXggPSAwOwotCQkJc3dpdGNoIChkaXJlY3Rpb24pewotCQkJCWNhc2UgU1dULkxFRlQ6IC8vIGxlZnQgOTAgZGVncmVlcwotCQkJCQlkZXN0WCA9IHNyY1k7Ci0JCQkJCWRlc3RZID0gc3JjRGF0YS53aWR0aCAtIHNyY1ggLSAxOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEuaGVpZ2h0OwotCQkJCQloZWlnaHQgPSBzcmNEYXRhLndpZHRoOyAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuUklHSFQ6IC8vIHJpZ2h0IDkwIGRlZ3JlZXMKLQkJCQkJZGVzdFggPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJCQlkZXN0WSA9IHNyY1g7Ci0JCQkJCXdpZHRoID0gc3JjRGF0YS5oZWlnaHQ7Ci0JCQkJCWhlaWdodCA9IHNyY0RhdGEud2lkdGg7IAotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5ET1dOOiAvLyAxODAgZGVncmVlcwotCQkJCQlkZXN0WCA9IHNyY0RhdGEud2lkdGggLSBzcmNYIC0gMTsKLQkJCQkJZGVzdFkgPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEud2lkdGg7Ci0JCQkJCWhlaWdodCA9IHNyY0RhdGEuaGVpZ2h0OyAKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZXN0SW5kZXggPSAoZGVzdFkgKiBkZXN0Qnl0ZXNQZXJMaW5lKSArIChkZXN0WCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJc3JjSW5kZXggPSAoc3JjWSAqIHNyY0RhdGEuYnl0ZXNQZXJMaW5lKSArIChzcmNYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNyY0RhdGEuZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgYnl0ZXNQZXJQaXhlbCk7Ci0JCX0KLQl9Ci0JLy8gZGVzdEJ5dGVzUGVyTGluZSBpcyB1c2VkIGFzIHNjYW5saW5lUGFkIHRvIGVuc3VyZSB0aGF0IG5vIHBhZGRpbmcgaXMgcmVxdWlyZWQKLQlyZXR1cm4gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCBzcmNEYXRhLmRlcHRoLCBzcmNEYXRhLnBhbGV0dGUsIHNyY0RhdGEuc2NhbmxpbmVQYWQsIG5ld0RhdGEpOwotfQotc3RhdGljIEltYWdlRGF0YSBmbGlwKEltYWdlRGF0YSBzcmNEYXRhLCBib29sZWFuIHZlcnRpY2FsKSB7Ci0JaW50IGJ5dGVzUGVyUGl4ZWwgPSBzcmNEYXRhLmJ5dGVzUGVyTGluZSAvIHNyY0RhdGEud2lkdGg7Ci0JaW50IGRlc3RCeXRlc1BlckxpbmUgPSBzcmNEYXRhLndpZHRoICogYnl0ZXNQZXJQaXhlbDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW3NyY0RhdGEuZGF0YS5sZW5ndGhdOwotCWZvciAoaW50IHNyY1kgPSAwOyBzcmNZIDwgc3JjRGF0YS5oZWlnaHQ7IHNyY1krKykgewotCQlmb3IgKGludCBzcmNYID0gMDsgc3JjWCA8IHNyY0RhdGEud2lkdGg7IHNyY1grKykgewotCQkJaW50IGRlc3RYID0gMCwgZGVzdFkgPSAwLCBkZXN0SW5kZXggPSAwLCBzcmNJbmRleCA9IDA7Ci0JCQlpZiAodmVydGljYWwpewotCQkJCWRlc3RYID0gc3JjWDsKLQkJCQlkZXN0WSA9IHNyY0RhdGEuaGVpZ2h0IC0gc3JjWSAtIDE7Ci0JCQl9IGVsc2UgewotCQkJCWRlc3RYID0gc3JjRGF0YS53aWR0aCAtIHNyY1ggLSAxOwotCQkJCWRlc3RZID0gc3JjWTsgCi0JCQl9Ci0JCQlkZXN0SW5kZXggPSAoZGVzdFkgKiBkZXN0Qnl0ZXNQZXJMaW5lKSArIChkZXN0WCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJc3JjSW5kZXggPSAoc3JjWSAqIHNyY0RhdGEuYnl0ZXNQZXJMaW5lKSArIChzcmNYICogYnl0ZXNQZXJQaXhlbCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNyY0RhdGEuZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgYnl0ZXNQZXJQaXhlbCk7Ci0JCX0KLQl9Ci0JLy8gZGVzdEJ5dGVzUGVyTGluZSBpcyB1c2VkIGFzIHNjYW5saW5lUGFkIHRvIGVuc3VyZSB0aGF0IG5vIHBhZGRpbmcgaXMgcmVxdWlyZWQKLQlyZXR1cm4gbmV3IEltYWdlRGF0YShzcmNEYXRhLndpZHRoLCBzcmNEYXRhLmhlaWdodCwgc3JjRGF0YS5kZXB0aCwgc3JjRGF0YS5wYWxldHRlLCBzcmNEYXRhLnNjYW5saW5lUGFkLCBuZXdEYXRhKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCi0JLy8gY3JlYXRlIGFuIGltYWdlIHdpdGggdGhlIHdvcmQgImhlbGxvIiBvbiBpdAotCWZpbmFsIEltYWdlIGltYWdlMCA9IG5ldyBJbWFnZShkaXNwbGF5LCA1MCwgMzApOwotCUdDIGdjID0gbmV3IEdDKGltYWdlMCk7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlMC5nZXRCb3VuZHMoKSk7Ci0JZ2MuZHJhd1N0cmluZygiaGVsbG8iLAk1LCA1LCB0cnVlKTsKLQlnYy5kaXNwb3NlKCk7Ci0JCi0JSW1hZ2VEYXRhIGRhdGEgPSBpbWFnZTAuZ2V0SW1hZ2VEYXRhKCk7Ci0JLy8gcm90YXRlIGFuZCBmbGlwIHRoaXMgaW1hZ2UKLQlmaW5hbCBJbWFnZSBpbWFnZTEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcm90YXRlKGRhdGEsIFNXVC5MRUZUKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UyID0gbmV3IEltYWdlKGRpc3BsYXksIHJvdGF0ZShkYXRhLCBTV1QuUklHSFQpKTsKLQlmaW5hbCBJbWFnZSBpbWFnZTMgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcm90YXRlKGRhdGEsIFNXVC5ET1dOKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2U0ID0gbmV3IEltYWdlKGRpc3BsYXksIGZsaXAoZGF0YSwgdHJ1ZSkpOwotCWZpbmFsIEltYWdlIGltYWdlNSA9IG5ldyBJbWFnZShkaXNwbGF5LCBmbGlwKGRhdGEsIGZhbHNlKSk7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkvLyBkcmF3IHRoZSByZXN1bHRzIG9uIHRoZSBzaGVsbAotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKXsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5kcmF3VGV4dCgiT3JpZ2luYWwgSW1hZ2U6IiwgMTAsIDEwLCB0cnVlKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMCwgMTAsIDQwKTsKLQkJCWUuZ2MuZHJhd1RleHQoIkxlZnQsIFJpZ2h0LCAxODA6IiwgMTAsIDgwLCB0cnVlKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMSwgMTAsIDExMCk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTIsIDUwLCAxMTApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UzLCA5MCwgMTEwKTsKLQkJCWUuZ2MuZHJhd1RleHQoIkZsaXBwZWQgVmVydGljYWwsIEhvcml6b250YWw6IiwgMTAsIDE3MCwgdHJ1ZSk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTQsIDEwLCAyMDApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2U1LCA3MCwgMjAwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWltYWdlMC5kaXNwb3NlKCk7Ci0JaW1hZ2UxLmRpc3Bvc2UoKTsKLQlpbWFnZTIuZGlzcG9zZSgpOwotCWltYWdlMy5kaXNwb3NlKCk7Ci0JaW1hZ2U0LmRpc3Bvc2UoKTsKLQlpbWFnZTUuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2YzZiYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBtb3VzZSBlbnRlciwgZXhpdCBhbmQgaG92ZXIgZXZlbnRzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VFbnRlciwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkVOVEVSIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkVYSVQiKTsKLQkJfQotCX0pOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VIb3ZlciwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkhPVkVSIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2U4Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIENvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBkcm9wLWRvd24gYSBjaGV2cm9uIG1lbnUgY29udGFpbmluZyBoaWRkZW4gdG9vbCBpdGVtcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQwIHsKLQlzdGF0aWMgRGlzcGxheSBkaXNwbGF5OwotCXN0YXRpYyBTaGVsbCBzaGVsbDsKLQlzdGF0aWMgQ29vbEJhciBjb29sQmFyOwotCXN0YXRpYyBNZW51IGNoZXZyb25NZW51ID0gbnVsbDsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQljb29sQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvb2xCYXIsIFNXVC5GTEFUIHwgU1dULldSQVApOwotCWludCBtaW5XaWR0aCA9IDA7Ci0JZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKLQkJaW50IHdpZHRoID0gMDsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiQiIgKyBqKTsKLQkJd2lkdGggPSBpdGVtLmdldFdpZHRoKCk7Ci0JCS8qIGZpbmQgdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3QgdG9vbCAqLwotCQlpZiAod2lkdGggPiBtaW5XaWR0aCkgbWluV2lkdGggPSB3aWR0aDsKLQl9Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbCh0b29sQmFyKTsKLQlQb2ludCBzaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCVBvaW50IGNvb2xTaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KTsKLQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZShtaW5XaWR0aCwgY29vbFNpemUueSk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShjb29sU2l6ZSk7Ci0JY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZSk7Ci0JY29vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5BUlJPVykgewotCQkJCUNvb2xJdGVtIGl0ZW0gPSAoQ29vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCVBvaW50IHB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KGl0ZW1Cb3VuZHMueCwgaXRlbUJvdW5kcy55KSk7Ci0JCQkJaXRlbUJvdW5kcy54ID0gcHQueDsKLQkJCQlpdGVtQm91bmRzLnkgPSBwdC55OwotCQkJCVRvb2xCYXIgYmFyID0gKFRvb2xCYXIpIGl0ZW0uZ2V0Q29udHJvbCAoKTsKLQkJCQlUb29sSXRlbVtdIHRvb2xzID0gYmFyLmdldEl0ZW1zICgpOwotCQkJCQotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoaSA8IHRvb2xzLmxlbmd0aCkgewotCQkJCQlSZWN0YW5nbGUgdG9vbEJvdW5kcyA9IHRvb2xzW2ldLmdldEJvdW5kcyAoKTsKLQkJCQkJcHQgPSBiYXIudG9EaXNwbGF5KG5ldyBQb2ludCh0b29sQm91bmRzLngsIHRvb2xCb3VuZHMueSkpOwotCQkJCQl0b29sQm91bmRzLnggPSBwdC54OwotCQkJCQl0b29sQm91bmRzLnkgPSBwdC55OwotCQkJCQkKLQkJCQkJLyogRmlndXJlIG91dCB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSB0b29sIGJ5IGxvb2tpbmcgYXQgdGhlCi0JCQkJCSAqIGludGVyc2VjdGlvbiBvZiB0aGUgdG9vbCBib3VuZHMgd2l0aCB0aGUgY29vbCBpdGVtIGJvdW5kcy4gKi8KLQkJCSAgCQlSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gaXRlbUJvdW5kcy5pbnRlcnNlY3Rpb24gKHRvb2xCb3VuZHMpOwotCQkJICAJCQotCQkJCQkvKiBJZiB0aGUgdG9vbCBpcyBub3QgY29tcGxldGVseSB3aXRoaW4gdGhlIGNvb2wgaXRlbSBib3VuZHMsIHRoZW4gaXQKLQkJCQkJICogaXMgcGFydGlhbGx5IGhpZGRlbiwgYW5kIGFsbCByZW1haW5pbmcgdG9vbHMgYXJlIGNvbXBsZXRlbHkgaGlkZGVuLiAqLwotCQkJICAJCWlmICghaW50ZXJzZWN0aW9uLmVxdWFscyAodG9vbEJvdW5kcykpIGJyZWFrOwotCQkJICAJCWkrKzsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogQ3JlYXRlIGEgbWVudSB3aXRoIGl0ZW1zIGZvciBlYWNoIG9mIHRoZSBjb21wbGV0ZWx5IGhpZGRlbiBidXR0b25zLiAqLwotCQkJCWlmIChjaGV2cm9uTWVudSAhPSBudWxsKSBjaGV2cm9uTWVudS5kaXNwb3NlKCk7Ci0JCQkJY2hldnJvbk1lbnUgPSBuZXcgTWVudSAoY29vbEJhcik7Ci0JCQkJZm9yIChpbnQgaiA9IGk7IGogPCB0b29scy5sZW5ndGg7IGorKykgewotCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAoY2hldnJvbk1lbnUsIFNXVC5QVVNIKTsKLQkJCQkJbWVudUl0ZW0uc2V0VGV4dCAodG9vbHNbal0uZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyogRHJvcCBkb3duIHRoZSBtZW51IGJlbG93IHRoZSBjaGV2cm9uLCB3aXRoIHRoZSBsZWZ0IGVkZ2VzIGFsaWduZWQuICovCi0JCQkJcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCWNoZXZyb25NZW51LnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCQljaGV2cm9uTWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhMWU2ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEltYWdlIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBhbiBhbmltYXRlZCBHSUYKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDEgewotCXN0YXRpYyBEaXNwbGF5IGRpc3BsYXk7Ci0Jc3RhdGljIFNoZWxsIHNoZWxsOwotCXN0YXRpYyBHQyBzaGVsbEdDOwotCXN0YXRpYyBDb2xvciBzaGVsbEJhY2tncm91bmQ7Ci0Jc3RhdGljIEltYWdlTG9hZGVyIGxvYWRlcjsKLQlzdGF0aWMgSW1hZ2VEYXRhW10gaW1hZ2VEYXRhQXJyYXk7Ci0Jc3RhdGljIFRocmVhZCBhbmltYXRlVGhyZWFkOwotCXN0YXRpYyBJbWFnZSBpbWFnZTsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VHSUZCYWNrZ3JvdW5kID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXNoZWxsR0MgPSBuZXcgR0Moc2hlbGwpOwotCQlzaGVsbEJhY2tncm91bmQgPSBzaGVsbC5nZXRCYWNrZ3JvdW5kKCk7Ci0KLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiouZ2lmIn0pOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQl0cnkgewotCQkJCWltYWdlRGF0YUFycmF5ID0gbG9hZGVyLmxvYWQoZmlsZU5hbWUpOwotCQkJCWlmIChpbWFnZURhdGFBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQkJCWFuaW1hdGVUaHJlYWQgPSBuZXcgVGhyZWFkKCJBbmltYXRpb24iKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJLyogQ3JlYXRlIGFuIG9mZi1zY3JlZW4gaW1hZ2UgdG8gZHJhdyBvbiwgYW5kIGZpbGwgaXQgd2l0aCB0aGUgc2hlbGwgYmFja2dyb3VuZC4gKi8KLQkJCQkJCQlJbWFnZSBvZmZTY3JlZW5JbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLCBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCQkJCQkJR0Mgb2ZmU2NyZWVuSW1hZ2VHQyA9IG5ldyBHQyhvZmZTY3JlZW5JbWFnZSk7Ci0JCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKHNoZWxsQmFja2dyb3VuZCk7Ci0JCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5maWxsUmVjdGFuZ2xlKDAsIDAsIGxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGgsIGxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0KTsKLQkJCQkJCQkJCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJLyogQ3JlYXRlIHRoZSBmaXJzdCBpbWFnZSBhbmQgZHJhdyBpdCBvbiB0aGUgb2ZmLXNjcmVlbiBpbWFnZS4gKi8KLQkJCQkJCQkJaW50IGltYWdlRGF0YUluZGV4ID0gMDsJCi0JCQkJCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF07Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQotCQkJCQkJCQkvKiBOb3cgbG9vcCB0aHJvdWdoIHRoZSBpbWFnZXMsIGNyZWF0aW5nIGFuZCBkcmF3aW5nIGVhY2ggb25lCi0JCQkJCQkJCSAqIG9uIHRoZSBvZmYtc2NyZWVuIGltYWdlIGJlZm9yZSBkcmF3aW5nIGl0IG9uIHRoZSBzaGVsbC4gKi8KLQkJCQkJCQkJaW50IHJlcGVhdENvdW50ID0gbG9hZGVyLnJlcGVhdENvdW50OwotCQkJCQkJCQl3aGlsZSAobG9hZGVyLnJlcGVhdENvdW50ID09IDAgfHwgcmVwZWF0Q291bnQgPiAwKSB7Ci0JCQkJCQkJCQlzd2l0Y2ggKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCkgewotCQkJCQkJCQkJY2FzZSBTV1QuRE1fRklMTF9CQUNLR1JPVU5EOgotCQkJCQkJCQkJCS8qIEZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciBiZWZvcmUgZHJhd2luZy4gKi8KLQkJCQkJCQkJCQlDb2xvciBiZ0NvbG9yID0gbnVsbDsKLQkJCQkJCQkJCQlpZiAodXNlR0lGQmFja2dyb3VuZCAmJiBsb2FkZXIuYmFja2dyb3VuZFBpeGVsICE9IC0xKSB7Ci0JCQkJCQkJCQkJCWJnQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgaW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKGxvYWRlci5iYWNrZ3JvdW5kUGl4ZWwpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IgIT0gbnVsbCA/IGJnQ29sb3IgOiBzaGVsbEJhY2tncm91bmQpOwotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZmlsbFJlY3RhbmdsZShpbWFnZURhdGEueCwgaW1hZ2VEYXRhLnksIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCQkJaWYgKGJnQ29sb3IgIT0gbnVsbCkgYmdDb2xvci5kaXNwb3NlKCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIFNXVC5ETV9GSUxMX1BSRVZJT1VTOgotCQkJCQkJCQkJCS8qIFJlc3RvcmUgdGhlIHByZXZpb3VzIGltYWdlIGJlZm9yZSBkcmF3aW5nLiAqLwotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJaW1hZ2VEYXRhSW5kZXggPSAoaW1hZ2VEYXRhSW5kZXggKyAxKSAlIGltYWdlRGF0YUFycmF5Lmxlbmd0aDsKLQkJCQkJCQkJCWltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ltYWdlRGF0YUluZGV4XTsKLQkJCQkJCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJCQkJCQlpbWFnZSwKLQkJCQkJCQkJCQkwLAotCQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQkvKiBEcmF3IHRoZSBvZmYtc2NyZWVuIGltYWdlIHRvIHRoZSBzaGVsbC4gKi8KLQkJCQkJCQkJCXNoZWxsR0MuZHJhd0ltYWdlKG9mZlNjcmVlbkltYWdlLCAwLCAwKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLyogU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgZGVsYXkgdGltZSAoYWRkaW5nIGNvbW1vbmx5LXVzZWQgc2xvdy1kb3duIGZ1ZGdlIGZhY3RvcnMpLiAqLwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlpbnQgbXMgPSBpbWFnZURhdGEuZGVsYXlUaW1lICogMTA7Ci0JCQkJCQkJCQkJaWYgKG1zIDwgMjApIG1zICs9IDMwOwotCQkJCQkJCQkJCWlmIChtcyA8IDMwKSBtcyArPSAxMDsKLQkJCQkJCQkJCQlUaHJlYWQuc2xlZXAobXMpOwotCQkJCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQkvKiBJZiB3ZSBoYXZlIGp1c3QgZHJhd24gdGhlIGxhc3QgaW1hZ2UsIGRlY3JlbWVudCB0aGUgcmVwZWF0IGNvdW50IGFuZCBzdGFydCBhZ2Fpbi4gKi8KLQkJCQkJCQkJCWlmIChpbWFnZURhdGFJbmRleCA9PSBpbWFnZURhdGFBcnJheS5sZW5ndGggLSAxKSByZXBlYXRDb3VudC0tOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgd2FzIGFuIGVycm9yIGFuaW1hdGluZyB0aGUgR0lGIik7Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG9mZlNjcmVlbkltYWdlICE9IG51bGwgJiYgIW9mZlNjcmVlbkltYWdlLmlzRGlzcG9zZWQoKSkgb2ZmU2NyZWVuSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQkJCQlpZiAob2ZmU2NyZWVuSW1hZ2VHQyAhPSBudWxsICYmICFvZmZTY3JlZW5JbWFnZUdDLmlzRGlzcG9zZWQoKSkgb2ZmU2NyZWVuSW1hZ2VHQy5kaXNwb3NlKCk7Ci0JCQkJCQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCWFuaW1hdGVUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQkJCQlhbmltYXRlVGhyZWFkLnN0YXJ0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSB3YXMgYW4gZXJyb3IgbG9hZGluZyB0aGUgR0lGIik7Ci0JCQl9Ci0JCX0KLQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FmMTRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFVJIEF1dG9tYXRpb24gKGZvciB0ZXN0aW5nIHRvb2xzKSBzbmlwcGV0OiBwb3N0IG1vdXNlIGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsU1dULk5PTkUpOwotCWJ1dHRvbi5zZXRTaXplKDEwMCwxMDApOwotCWJ1dHRvbi5zZXRUZXh0KCJDbGljayIpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlIERvd24gKGJ1dHRvbjogIiArIGUuYnV0dG9uICsgIiB4OiAiICsgZS54ICsgIiB5OiAiICsgZS55ICsgIikiKTsKLQkJfQotCX0pOwotCWZpbmFsIFBvaW50IHB0ID0gZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIDUwLCA1MCk7Ci0JbmV3IFRocmVhZCgpewotCQlFdmVudCBldmVudDsKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgzMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlTW92ZTsKLQkJCWV2ZW50LnggPSBwdC54OwotCQkJZXZlbnQueSA9IHB0Lnk7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLQkJCWV2ZW50LmJ1dHRvbiA9IDE7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudC50eXBlID0gU1dULk1vdXNlVXA7Ci0JCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQl9CQotCX0uc3RhcnQoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGE5MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVHJheSBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGFuIGljb24gd2l0aCBhIHBvcHVwIG1lbnUgb24gdGhlIHN5c3RlbSB0cmF5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNDMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCWZpbmFsIFRyYXkgdHJheSA9IGRpc3BsYXkuZ2V0U3lzdGVtVHJheSAoKTsKLQlpZiAodHJheSA9PSBudWxsKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbiAoIlRoZSBzeXN0ZW0gdHJheSBpcyBub3QgYXZhaWxhYmxlIik7Ci0JfSBlbHNlIHsKLQkJZmluYWwgVHJheUl0ZW0gaXRlbSA9IG5ldyBUcmF5SXRlbSAodHJheSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJTV1QgVHJheUl0ZW0iKTsKLQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNob3csIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNob3ciKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5IaWRlLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJoaWRlIik7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24iKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWZhdWx0IHNlbGVjdGlvbiIpOwotCQkJfQotCQl9KTsKLQkJZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCU1lbnVJdGVtIG1pID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQltaS5zZXRUZXh0ICgiSXRlbSIgKyBpKTsKLQkJCW1pLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiAiICsgZXZlbnQud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWlmIChpID09IDApIG1lbnUuc2V0RGVmYXVsdEl0ZW0obWkpOwotCQl9Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQl9Ci0Jc2hlbGwuc2V0Qm91bmRzKDUwLCA1MCwgMzAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTY5NjI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBWaXJ0dWFsIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgd2l0aCAxLDAwMCwwMDAgaXRlbXMgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ0IHsKLQotc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDEwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5WSVJUVUFMIHwgU1dULkJPUkRFUik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YgKGl0ZW0pOwotCQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaW5kZXgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChpdGVtLmdldFRleHQgKCkpOwotCQl9Ci0JfSk7Ci0JdGFibGUuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDIwMCwgMjAwKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJBZGQgSXRlbXMiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJdGFibGUuc2V0SXRlbUNvdW50IChDT1VOVCk7Ci0JCQlsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJbGFiZWwuc2V0VGV4dCAoIkl0ZW1zOiAiICsgQ09VTlQgKyAiLCBUaW1lOiAiICsgKHQyIC0gdDEpICsgIiAobXMpIik7Ci0JCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNjUwZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dExheW91dCBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgaW50ZXJuYXRpb25hbGl6ZWQgc3R5bGVkIHRleHQgb24gYSBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ1IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQkKLQkJRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksICJUYWhvbWEiLCAxNCwgU1dULkJPTEQpOwotCQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgIk1TIE1pbmNobyIsIDIwLCBTV1QuSVRBTElDKTsKLQkJRm9udCBmb250MyA9IG5ldyBGb250KGRpc3BsYXksICJBcmFiaWMgVHJhbnNwYXJlbnQiLCAxOCwgU1dULk5PUk1BTCk7Ci0JCQotCQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCUNvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOwotCQlDb2xvciB5ZWxsb3cgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCQlDb2xvciBncmF5ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSk7Ci0JCQotCQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCQlUZXh0U3R5bGUgc3R5bGUxID0gbmV3IFRleHRTdHlsZShmb250MSwgeWVsbG93LCBibHVlKTsKLQkJVGV4dFN0eWxlIHN0eWxlMiA9IG5ldyBUZXh0U3R5bGUoZm9udDIsIGdyZWVuLCBudWxsKTsKLQkJVGV4dFN0eWxlIHN0eWxlMyA9IG5ldyBUZXh0U3R5bGUoZm9udDMsIGJsdWUsIGdyYXkpOwotCQkKLQkJbGF5b3V0LnNldFRleHQoIkVuZ2xpc2ggXHU2NUU1XHU2NzJDXHU4QTlFICBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NEFcdTA2NTFcdTA2MjkiKTsKLQkJbGF5b3V0LnNldFN0eWxlKHN0eWxlMSwgMCwgNik7Ci0JCWxheW91dC5zZXRTdHlsZShzdHlsZTIsIDgsIDEwKTsKLQkJbGF5b3V0LnNldFN0eWxlKHN0eWxlMywgMTMsIDIxKTsKLQkJCQkJCi0JCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlsYXlvdXQuZHJhdyhldmVudC5nYywgMTAsIDEwKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsJCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlmb250MS5kaXNwb3NlKCk7Ci0JCWZvbnQyLmRpc3Bvc2UoKTsKLQkJZm9udDMuZGlzcG9zZSgpOwotCQlsYXlvdXQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjI5YWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVUkgQXV0b21hdGlvbiAoZm9yIHRlc3RpbmcgdG9vbHMpIHNuaXBwZXQ6IHBvc3Qga2V5IGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQ2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0U2l6ZSh0ZXh0LmNvbXB1dGVTaXplKDE1MCwgU1dULkRFRkFVTFQpKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCW5ldyBUaHJlYWQoKXsKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIkxvdmUgdGhlIG1ldGhvZC4iOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoKCk7IGkrKykgewotCQkJCWNoYXIgY2ggPSBzdHJpbmcuY2hhckF0KGkpOwotCQkJCWJvb2xlYW4gc2hpZnQgPSBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2gpOwotCQkJCWNoID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoKTsKLQkJCQlpZiAoc2hpZnQpIHsKLQkJCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQkJCQlldmVudC5rZXlDb2RlID0gU1dULlNISUZUOwotCQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwkKLQkJCQl9Ci0JCQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQlldmVudC50eXBlID0gU1dULktleURvd247Ci0JCQkJZXZlbnQuY2hhcmFjdGVyID0gY2g7Ci0JCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQkJaWYgKHNoaWZ0KSB7Ci0JCQkJCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJCWV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSBTV1QuU0hJRlQ7Ci0JCQkJCWRpc3BsYXkucG9zdChldmVudCk7CQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9LnN0YXJ0KCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjJiZTBhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21ibyBleGFtcGxlIHNuaXBwZXQ6IHN0b3AgQ1IgZnJvbSBnb2luZyB0byB0aGUgZGVmYXVsdCBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0NyAgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JY29tYm8uc2V0VGV4dCgiSGVyZSBpcyBzb21lIHRleHQiKTsKLQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29tYm8gZGVmYXVsdCBzZWxlY3RlZCAob3ZlcnJpZGVzIGRlZmF1bHQgYnV0dG9uKSIpOwotCQl9Ci0JfSk7Ci0JY29tYm8uYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQllLmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotCQkJfQotCQl9Ci0JfSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiT2siKTsKLQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQnV0dG9uIHNlbGVjdGVkIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk1YzI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IGNoZWNrIGlmIHRoZSBicm93c2VyIGlzIGF2YWlsYWJsZSBvciBub3QKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0OCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUJyb3dzZXIgYnJvd3NlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJLyogVGhlIEJyb3dzZXIgd2lkZ2V0IHRocm93cyBhbiBTV1RFcnJvciBpZiBpdCBmYWlscyB0bwotCQkJICogaW5zdGFudGlhdGUgcHJvcGVybHkuIEFwcGxpY2F0aW9uIGNvZGUgc2hvdWxkIGNhdGNoCi0JCQkgKiB0aGlzIFNXVEVycm9yIGFuZCBkaXNhYmxlIGFueSBmZWF0dXJlIHJlcXVpcmluZyB0aGUKLQkJCSAqIEJyb3dzZXIgd2lkZ2V0LgotCQkJICogUGxhdGZvcm0gcmVxdWlyZW1lbnRzIGZvciB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0IGFyZSBhdmFpbGFibGUKLQkJCSAqIGZyb20gdGhlIFNXVCBGQVEgd2Vic2l0ZS4gCi0JCQkgKi8KLQkJfQotCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkvKiBUaGUgQnJvd3NlciB3aWRnZXQgY2FuIGJlIHVzZWQgKi8KLQkJCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIik7Ci0JCX0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM2MzE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGEgcHJvZ3Jlc3MgYmFyIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0OSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCWZvciAoaW50IGk9MDsgaTwyOyBpKyspIHsKLQkJCW5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJfQotCQl0YWJsZS5nZXRDb2x1bW4gKDApLnNldFRleHQgKCJUYXNrIik7Ci0JCXRhYmxlLmdldENvbHVtbiAoMSkuc2V0VGV4dCAoIlByb2dyZXNzIik7Ci0JCWZvciAoaW50IGk9MDsgaTw0MDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKCJUYXNrICIgKyBpKTsKLQkJCWlmICggaSAlIDUgPT0gMCkgewotCQkJCVByb2dyZXNzQmFyIGJhciA9IG5ldyBQcm9ncmVzc0JhciAodGFibGUsIFNXVC5OT05FKTsKLQkJCQliYXIuc2V0U2VsZWN0aW9uIChpKTsKLQkJCQlUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJCQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSBlZGl0b3IuZ3JhYlZlcnRpY2FsID0gdHJ1ZTsKLQkJCQllZGl0b3Iuc2V0RWRpdG9yIChiYXIsIGl0ZW0sIDEpOwotCQkJfQotCQl9Ci0JCXRhYmxlLmdldENvbHVtbiAoMCkucGFjayAoKTsKLQkJdGFibGUuZ2V0Q29sdW1uICgxKS5zZXRXaWR0aCAoMTI4KTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmVkYzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJVHJlZUl0ZW0gaUl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQlpSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDApIC0iICsgaSk7Ci0JCWZvciAoaW50IGo9MDsgajw0OyBqKyspIHsKLQkJCVRyZWVJdGVtIGpJdGVtID0gbmV3IFRyZWVJdGVtIChpSXRlbSwgMCk7Ci0JCQlqSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDEpIC0iICsgaik7Ci0JCQlmb3IgKGludCBrPTA7IGs8NDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0ga0l0ZW0gPSBuZXcgVHJlZUl0ZW0gKGpJdGVtLCAwKTsKLQkJCQlrSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDIpIC0iICsgayk7Ci0JCQkJZm9yIChpbnQgbD0wOyBsPDQ7IGwrKykgewotCQkJCQlUcmVlSXRlbSBsSXRlbSA9IG5ldyBUcmVlSXRlbSAoa0l0ZW0sIDApOwotCQkJCQlsSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDMpIC0iICsgbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZjEyZjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb29sYmFyIChyZWxheW91dCB3aGVuIHJlc2l6ZWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUwIHsKLQotc3RhdGljIGludCBpdGVtQ291bnQ7Ci1zdGF0aWMgQ29vbEl0ZW0gY3JlYXRlSXRlbShDb29sQmFyIGNvb2xCYXIsIGludCBjb3VudCkgewotICAgIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvb2xCYXIsIFNXVC5GTEFUKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChpdGVtQ291bnQrKyArIiIpOwotICAgIH0KLSAgICB0b29sQmFyLnBhY2soKTsKLSAgICBQb2ludCBzaXplID0gdG9vbEJhci5nZXRTaXplKCk7Ci0gICAgQ29vbEl0ZW0gaXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuTk9ORSk7Ci0gICAgaXRlbS5zZXRDb250cm9sKHRvb2xCYXIpOwotICAgIFBvaW50IHByZWZlcnJlZCA9IGl0ZW0uY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpOwotICAgIGl0ZW0uc2V0UHJlZmVycmVkU2l6ZShwcmVmZXJyZWQpOwotICAgIHJldHVybiBpdGVtOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICBDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULk5PTkUpOwotICAgIGNyZWF0ZUl0ZW0oY29vbEJhciwgMyk7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCAyKTsKLSAgICBjcmVhdGVJdGVtKGNvb2xCYXIsIDMpOwotICAgIGNyZWF0ZUl0ZW0oY29vbEJhciwgNCk7Ci0gICAgaW50IHN0eWxlID0gU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTDsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgc3R5bGUpOwotICAgIEZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBGb3JtRGF0YSBjb29sRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGNvb2xEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0gICAgY29vbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICBjb29sRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0gICAgY29vbEJhci5zZXRMYXlvdXREYXRhKGNvb2xEYXRhKTsKLSAgICBjb29sQmFyLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHNoZWxsLmxheW91dCgpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgRm9ybURhdGEgdGV4dERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICB0ZXh0RGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotICAgIHRleHREYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgdGV4dERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvb2xCYXIpOwotICAgIHRleHREYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YSh0ZXh0RGF0YSk7Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhYjJkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgdmlydHVhbCB0YWJsZSBhbmQgYWRkIDEwMDAgZW50cmllcyB0byBpdCBldmVyeSA1MDAgbXMuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUxIHsKLQotc3RhdGljIGludFtdIGRhdGEgPSBuZXcgaW50WzBdOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZJUlRVQUwpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSllLml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJaXRlbS5zZXRUZXh0KCJJdGVtICIrZGF0YVtpbmRleF0pOwotCQl9Ci0JfSk7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCQkJd2hpbGUgKGNvdW50KysgPCA1MDApIHsKLQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJLy8gYWRkIDEwIHJhbmRvbSBudW1iZXJzIHRvIGFycmF5IGFuZCBzb3J0Ci0JCQkJaW50IGdyb3cgPSAxMDsKLQkJCQlpbnRbXSBuZXdEYXRhID0gbmV3IGludFtkYXRhLmxlbmd0aCArIGdyb3ddOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQkJCWludCBpbmRleCA9IGRhdGEubGVuZ3RoOwotCQkJCWRhdGEgPSBuZXdEYXRhOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZ3JvdzsgaisrKSB7Ci0JCQkJCWRhdGFbaW5kZXgrK10gPSByYW5kb20ubmV4dEludCgpOwotCQkJCX0KLQkJCQlBcnJheXMuc29ydChkYXRhKTsKLQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJdGFibGUuc2V0SXRlbUNvdW50KGRhdGEubGVuZ3RoKTsKLQkJCQkJCXRhYmxlLmNsZWFyQWxsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQl0cnkge1RocmVhZC5zbGVlcCg1MDApO30gY2F0Y2ggKFRocm93YWJsZSB0KSB7fQotCQkJfQotCQl9Ci0JfTsKLQl0aHJlYWQuc3RhcnQoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpIHx8IHRocmVhZC5pc0FsaXZlKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmEyZDUyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIGEgc3RhdHVzIGxpbmUgd2hlbiBhbiBpdGVtIGlzIGFybWVkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICBGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIExpc3RlbmVyIGFybUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgbGFiZWwuc2V0VGV4dChpdGVtLmdldFRleHQoKSk7Ci0gICAgICAgICAgICBsYWJlbC51cGRhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgTGlzdGVuZXIgc2hvd0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgTWVudSBtZW51ID0gKE1lbnUpIGV2ZW50LndpZGdldDsKLSAgICAgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBtZW51LmdldFBhcmVudEl0ZW0oKTsKLSAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KGl0ZW0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBsYWJlbC51cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0gICAgTGlzdGVuZXIgaGlkZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgbGFiZWwuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICBsYWJlbC51cGRhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgRm9ybURhdGEgbGFiZWxEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgbGFiZWxEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0gICAgbGFiZWxEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgbGFiZWxEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIGxhYmVsLnNldExheW91dERhdGEobGFiZWxEYXRhKTsKLSAgICBNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0gICAgc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLSAgICBNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0gICAgZmlsZUl0ZW0uc2V0VGV4dCgiRmlsZSIpOwotICAgIGZpbGVJdGVtLmFkZExpc3RlbmVyKFNXVC5Bcm0sIGFybUxpc3RlbmVyKTsKLSAgICBNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0gICAgZWRpdEl0ZW0uc2V0VGV4dCgiRWRpdCIpOwotICAgIGVkaXRJdGVtLmFkZExpc3RlbmVyKFNXVC5Bcm0sIGFybUxpc3RlbmVyKTsKLSAgICBNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotICAgIGZpbGVNZW51LmFkZExpc3RlbmVyKFNXVC5IaWRlLCBoaWRlTGlzdGVuZXIpOwotICAgIGZpbGVNZW51LmFkZExpc3RlbmVyKFNXVC5TaG93LCBzaG93TGlzdGVuZXIpOwotICAgIGZpbGVJdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotICAgIFN0cmluZ1tdIGZpbGVTdHJpbmdzID0geyAiTmV3IiwgIkNsb3NlIiwgIkV4aXQiIH07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlU3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICBNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChmaWxlU3RyaW5nc1tpXSk7Ci0gICAgICAgIGl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIH0KLSAgICBNZW51IGVkaXRNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotICAgIGVkaXRNZW51LmFkZExpc3RlbmVyKFNXVC5IaWRlLCBoaWRlTGlzdGVuZXIpOwotICAgIGVkaXRNZW51LmFkZExpc3RlbmVyKFNXVC5TaG93LCBzaG93TGlzdGVuZXIpOwotICAgIFN0cmluZ1tdIGVkaXRTdHJpbmdzID0geyAiQ3V0IiwgIkNvcHkiLCAiUGFzdGUiIH07Ci0gICAgZWRpdEl0ZW0uc2V0TWVudShlZGl0TWVudSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICBNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKGVkaXRNZW51LCBTV1QuUFVTSCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChlZGl0U3RyaW5nc1tpXSk7Ci0gICAgICAgIGl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIH0KLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjg2MmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBzdGF0dXMgbGluZSB3aGVuIHRoZSBwb2ludGVyIGVudGVycyBhIFRvb2xJdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MyB7Ci0JCi1zdGF0aWMgU3RyaW5nIHN0YXR1c1RleHQgPSAiIjsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjAwKTsKLSAgICBmaW5hbCBUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuQk9SREVSKTsKLSAgICBiYXIuc2V0Qm91bmRzKDEwLCAxMCwgMTUwLCA1MCk7Ci0gICAgZmluYWwgTGFiZWwgc3RhdHVzTGluZSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgc3RhdHVzTGluZS5zZXRCb3VuZHMoMTAsIDkwLCAxNTAsIDMwKTsKLSAgICBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSkuc2V0VGV4dCgiaXRlbSAxIik7Ci0gICAgbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0gMiIpOwotICAgIG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtIDMiKTsKLSAgICBiYXIuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICBUb29sSXRlbSBpdGVtID0gYmFyLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOwotICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5hbWUgPSBpdGVtLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc3RhdHVzVGV4dC5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaW5lLnNldFRleHQobmFtZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzVGV4dCA9IG5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTdjYTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGVtYmVkIGEgSlRhYmxlIGluIFNXVCAobm8gZmxpY2tlcikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT19CQUNLR1JPVU5EIHwgU1dULkVNQkVEREVEKTsKLQkJCi0JCS8qCi0JCSogU2V0IGEgV2luZG93cyBzcGVjaWZpYyBBV1QgcHJvcGVydHkgdGhhdCBwcmV2ZW50cyBoZWF2eXdlaWdodAotCQkqIGNvbXBvbmVudHMgZnJvbSBlcmFzaW5nIHRoZWlyIGJhY2tncm91bmQuIE5vdGUgdGhhdCB0aGlzCi0JCSogaXMgYSBnbG9iYWwgcHJvcGVydHkgYW5kIGNhbm5vdCBiZSBzY29wZWQuIEl0IG1pZ2h0IG5vdCBiZQotCQkqIHN1aXRhYmxlIGZvciB5b3VyIGFwcGxpY2F0aW9uLgotCQkqLwotCQl0cnkgewotCQkJU3lzdGVtLnNldFByb3BlcnR5KCJzdW4uYXd0Lm5vZXJhc2ViYWNrZ3JvdW5kIiwidHJ1ZSIpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlcnJvcikge30KLQotCQkvKiBDcmVhdGUgYW5kIHNldHRpbmcgdXAgZnJhbWUgKi8KLQkJRnJhbWUgZnJhbWUgPSBTV1RfQVdULm5ld19GcmFtZShjb21wb3NpdGUpOwotCQlQYW5lbCBwYW5lbCA9IG5ldyBQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpIHsKLQkJCXB1YmxpYyB2b2lkIHVwZGF0ZShqYXZhLmF3dC5HcmFwaGljcyBnKSB7Ci0JCQkJLyogRG8gbm90IGVyYXNlIHRoZSBiYWNrZ3JvdW5kICovIAotCQkJCXBhaW50KGcpOwotCQkJfQotCQl9OwotCQlmcmFtZS5hZGQocGFuZWwpOwotCQlKUm9vdFBhbmUgcm9vdCA9IG5ldyBKUm9vdFBhbmUoKTsKLQkJcGFuZWwuYWRkKHJvb3QpOwotCQlqYXZhLmF3dC5Db250YWluZXIgY29udGVudFBhbmUgPSByb290LmdldENvbnRlbnRQYW5lKCk7Ci0KLQkJLyogQ3JlYXRpbmcgY29tcG9uZW50cyAqLwotCQlpbnQgbnJvd3MgPSAxMDAwLCBuY29sdW1ucyA9IDEwOwotCQlWZWN0b3Igcm93cyA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBucm93czsgaSsrKSB7Ci0JCQlWZWN0b3Igcm93ID0gbmV3IFZlY3RvcigpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuY29sdW1uczsgaisrKSB7Ci0JCQkJcm93LmFkZEVsZW1lbnQoIkl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJCX0KLQkJCXJvd3MuYWRkRWxlbWVudChyb3cpOwotCQl9Ci0JCVZlY3RvciBjb2x1bW5zID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5jb2x1bW5zOyBpKyspIHsKLQkJCWNvbHVtbnMuYWRkRWxlbWVudCgiQ29sdW1uICIgKyBpKTsKLQkJfQotCQlKVGFibGUgdGFibGUgPSBuZXcgSlRhYmxlKHJvd3MsIGNvbHVtbnMpOwotCQl0YWJsZS5zZXRBdXRvUmVzaXplTW9kZShKVGFibGUuQVVUT19SRVNJWkVfT0ZGKTsKLQkJdGFibGUuY3JlYXRlRGVmYXVsdENvbHVtbnNGcm9tTW9kZWwoKTsKLQkJSlNjcm9sbFBhbmUgc2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZSh0YWJsZSk7Ci0JCWNvbnRlbnRQYW5lLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQljb250ZW50UGFuZS5hZGQoc2Nyb2xsUGFuZSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIzZDhlZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBkcmF3IGFuIFggdXNpbmcgQVdUIEdyYXBoaWNzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuQ2FudmFzOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVDsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTUgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQkJCi0JCS8qIERyYXcgYW4gWCB1c2luZyBBV1QgKi8KLQkJRnJhbWUgZnJhbWUgPSBTV1RfQVdULm5ld19GcmFtZShjb21wb3NpdGUpOwotCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcygpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50IChHcmFwaGljcyBnKSB7Ci0JCQkJRGltZW5zaW9uIGQgPSBnZXRTaXplKCk7Ci0JCQkJZy5kcmF3TGluZSgwLCAwLCBkLndpZHRoLCBkLmhlaWdodCk7Ci0JCQkJZy5kcmF3TGluZShkLndpZHRoLCAwLCAwLCBkLmhlaWdodCk7Ci0JCQl9Ci0JCX07Ci0JCWZyYW1lLmFkZChjYW52YXMpOwotCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzEwOTQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBjb252ZXJ0IGJldHdlZW4gU1dUIEltYWdlIGFuZCBBV1QgQnVmZmVyZWRJbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5JbnNldHM7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkRpcmVjdENvbG9yTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuSW5kZXhDb2xvck1vZGVsOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLldyaXRhYmxlUmFzdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTYgewotCQotc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgY29udmVydFRvQVdUKEltYWdlRGF0YSBkYXRhKSB7Ci0JQ29sb3JNb2RlbCBjb2xvck1vZGVsID0gbnVsbDsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gZGF0YS5wYWxldHRlOwotCWlmIChwYWxldHRlLmlzRGlyZWN0KSB7Ci0JCWNvbG9yTW9kZWwgPSBuZXcgRGlyZWN0Q29sb3JNb2RlbChkYXRhLmRlcHRoLCBwYWxldHRlLnJlZE1hc2ssIHBhbGV0dGUuZ3JlZW5NYXNrLCBwYWxldHRlLmJsdWVNYXNrKTsKLQkJQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoY29sb3JNb2RlbCwgY29sb3JNb2RlbC5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQpLCBmYWxzZSwgbnVsbCk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzNdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJaW50IHBpeGVsID0gZGF0YS5nZXRQaXhlbCh4LCB5KTsKLQkJCQlSR0IgcmdiID0gcGFsZXR0ZS5nZXRSR0IocGl4ZWwpOwotCQkJCXBpeGVsQXJyYXlbMF0gPSByZ2IucmVkOwotCQkJCXBpeGVsQXJyYXlbMV0gPSByZ2IuZ3JlZW47Ci0JCQkJcGl4ZWxBcnJheVsyXSA9IHJnYi5ibHVlOwotCQkJCXJhc3Rlci5zZXRQaXhlbHMoeCwgeSwgMSwgMSwgcGl4ZWxBcnJheSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JfSBlbHNlIHsKLQkJUkdCW10gcmdicyA9IHBhbGV0dGUuZ2V0UkdCcygpOwotCQlieXRlW10gcmVkID0gbmV3IGJ5dGVbcmdicy5sZW5ndGhdOwotCQlieXRlW10gZ3JlZW4gPSBuZXcgYnl0ZVtyZ2JzLmxlbmd0aF07Ci0JCWJ5dGVbXSBibHVlID0gbmV3IGJ5dGVbcmdicy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJnYnMubGVuZ3RoOyBpKyspIHsKLQkJCVJHQiByZ2IgPSByZ2JzW2ldOwotCQkJcmVkW2ldID0gKGJ5dGUpcmdiLnJlZDsKLQkJCWdyZWVuW2ldID0gKGJ5dGUpcmdiLmdyZWVuOwotCQkJYmx1ZVtpXSA9IChieXRlKXJnYi5ibHVlOwotCQl9Ci0JCWlmIChkYXRhLnRyYW5zcGFyZW50UGl4ZWwgIT0gLTEpIHsKLQkJCWNvbG9yTW9kZWwgPSBuZXcgSW5kZXhDb2xvck1vZGVsKGRhdGEuZGVwdGgsIHJnYnMubGVuZ3RoLCByZWQsIGdyZWVuLCBibHVlLCBkYXRhLnRyYW5zcGFyZW50UGl4ZWwpOwotCQl9IGVsc2UgewotCQkJY29sb3JNb2RlbCA9IG5ldyBJbmRleENvbG9yTW9kZWwoZGF0YS5kZXB0aCwgcmdicy5sZW5ndGgsIHJlZCwgZ3JlZW4sIGJsdWUpOwotCQl9CQkKLQkJQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoY29sb3JNb2RlbCwgY29sb3JNb2RlbC5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQpLCBmYWxzZSwgbnVsbCk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzFdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJaW50IHBpeGVsID0gZGF0YS5nZXRQaXhlbCh4LCB5KTsKLQkJCQlwaXhlbEFycmF5WzBdID0gcGl4ZWw7Ci0JCQkJcmFzdGVyLnNldFBpeGVsKHgsIHksIHBpeGVsQXJyYXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXJlZEltYWdlOwotCX0KLX0KLQotc3RhdGljIEltYWdlRGF0YSBjb252ZXJ0VG9TV1QoQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlKSB7Ci0JaWYgKGJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpIGluc3RhbmNlb2YgRGlyZWN0Q29sb3JNb2RlbCkgewotCQlEaXJlY3RDb2xvck1vZGVsIGNvbG9yTW9kZWwgPSAoRGlyZWN0Q29sb3JNb2RlbClidWZmZXJlZEltYWdlLmdldENvbG9yTW9kZWwoKTsKLQkJUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShjb2xvck1vZGVsLmdldFJlZE1hc2soKSwgY29sb3JNb2RlbC5nZXRHcmVlbk1hc2soKSwgY29sb3JNb2RlbC5nZXRCbHVlTWFzaygpKTsKLQkJSW1hZ2VEYXRhIGRhdGEgPSBuZXcgSW1hZ2VEYXRhKGJ1ZmZlcmVkSW1hZ2UuZ2V0V2lkdGgoKSwgYnVmZmVyZWRJbWFnZS5nZXRIZWlnaHQoKSwgY29sb3JNb2RlbC5nZXRQaXhlbFNpemUoKSwgcGFsZXR0ZSk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzNdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJcmFzdGVyLmdldFBpeGVsKHgsIHksIHBpeGVsQXJyYXkpOwotCQkJCWludCBwaXhlbCA9IHBhbGV0dGUuZ2V0UGl4ZWwobmV3IFJHQihwaXhlbEFycmF5WzBdLCBwaXhlbEFycmF5WzFdLCBwaXhlbEFycmF5WzJdKSk7Ci0JCQkJZGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbCk7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gZGF0YTsJCQotCX0gZWxzZSBpZiAoYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCkgaW5zdGFuY2VvZiBJbmRleENvbG9yTW9kZWwpIHsKLQkJSW5kZXhDb2xvck1vZGVsIGNvbG9yTW9kZWwgPSAoSW5kZXhDb2xvck1vZGVsKWJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpOwotCQlpbnQgc2l6ZSA9IGNvbG9yTW9kZWwuZ2V0TWFwU2l6ZSgpOwotCQlieXRlW10gcmVkcyA9IG5ldyBieXRlW3NpemVdOwotCQlieXRlW10gZ3JlZW5zID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCWJ5dGVbXSBibHVlcyA9IG5ldyBieXRlW3NpemVdOwotCQljb2xvck1vZGVsLmdldFJlZHMocmVkcyk7Ci0JCWNvbG9yTW9kZWwuZ2V0R3JlZW5zKGdyZWVucyk7Ci0JCWNvbG9yTW9kZWwuZ2V0Qmx1ZXMoYmx1ZXMpOwotCQlSR0JbXSByZ2JzID0gbmV3IFJHQltzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZ2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZ2JzW2ldID0gbmV3IFJHQihyZWRzW2ldICYgMHhGRiwgZ3JlZW5zW2ldICYgMHhGRiwgYmx1ZXNbaV0gJiAweEZGKTsKLQkJfQotCQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKHJnYnMpOwotCQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoYnVmZmVyZWRJbWFnZS5nZXRXaWR0aCgpLCBidWZmZXJlZEltYWdlLmdldEhlaWdodCgpLCBjb2xvck1vZGVsLmdldFBpeGVsU2l6ZSgpLCBwYWxldHRlKTsKLQkJZGF0YS50cmFuc3BhcmVudFBpeGVsID0gY29sb3JNb2RlbC5nZXRUcmFuc3BhcmVudFBpeGVsKCk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzFdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJcmFzdGVyLmdldFBpeGVsKHgsIHksIHBpeGVsQXJyYXkpOwotCQkJCWRhdGEuc2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheVswXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCXJldHVybiBudWxsOwotfQotCi1zdGF0aWMgSW1hZ2VEYXRhIGNyZWF0ZVNhbXBsZUltYWdlKERpc3BsYXkgZGlzcGxheSkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwMCwgMTAwKTsKLQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmZpbGxSZWN0YW5nbGUoYm91bmRzKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JZ2MuZmlsbE92YWwoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmRyYXdMaW5lKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JZ2MuZHJhd0xpbmUoYm91bmRzLndpZHRoLCAwLCAwLCBib3VuZHMuaGVpZ2h0KTsKLQlnYy5kaXNwb3NlKCk7Ci0JSW1hZ2VEYXRhIGRhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlNXVCBJbWFnZSIpOwotCUltYWdlRGF0YSBkYXRhOwotCWlmIChhcmdzLmxlbmd0aCA+IDApIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gYXJnc1swXTsKLQkJZGF0YSA9IG5ldyBJbWFnZURhdGEoZmlsZU5hbWUpOwotCX0gZWxzZSB7Ci0JCWRhdGEgPSBjcmVhdGVTYW1wbGVJbWFnZShkaXNwbGF5KTsKLQl9Ci0JZmluYWwgSW1hZ2Ugc3d0SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZmluYWwgQnVmZmVyZWRJbWFnZSBhd3RJbWFnZSA9IGNvbnZlcnRUb0FXVChkYXRhKTsKLQlmaW5hbCBJbWFnZSBzd3RJbWFnZTIgPSBuZXcgSW1hZ2UoZGlzcGxheSwgY29udmVydFRvU1dUKGF3dEltYWdlKSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWludCB5ID0gMTA7Ci0JCQlpZiAoc3d0SW1hZ2UgIT0gbnVsbCkgewotCQkJCWUuZ2MuZHJhd0ltYWdlKHN3dEltYWdlLCAxMCwgeSk7Ci0JCQkJeSArPSBzd3RJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQgKyAxMDsKLQkJCX0KLQkJCWlmIChzd3RJbWFnZTIgIT0gbnVsbCkgewotCQkJCWUuZ2MuZHJhd0ltYWdlKHN3dEltYWdlMiwgMTAsIHkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKLQkJCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJCWlmIChhd3RJbWFnZSAhPSBudWxsKSB7Ci0JCQkJZy5kcmF3SW1hZ2UoYXd0SW1hZ2UsIDEwICsgaW5zZXRzLmxlZnQsIDEwICsgaW5zZXRzLnRvcCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9OwotCWZyYW1lLnNldFRpdGxlKCJBV1QgSW1hZ2UiKTsKLQlzaGVsbC5zZXRMb2NhdGlvbig1MCwgNTApOwotCVJlY3RhbmdsZSBib3VuZHMgPSBzd3RJbWFnZS5nZXRCb3VuZHMoKTsKLQlzaGVsbC5zZXRTaXplKGJvdW5kcy53aWR0aCArIDUwLCBib3VuZHMuaGVpZ2h0ICogMiArIDEwMCk7Ci0JUG9pbnQgc2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLQlQb2ludCBsb2NhdGlvbiA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JSW5zZXRzIGluc2V0cyA9IGZyYW1lLmdldEluc2V0cygpOwotCWZyYW1lLnNldExvY2F0aW9uKGxvY2F0aW9uLnggKyBzaXplLnggKyAxMCwgbG9jYXRpb24ueSk7Ci0JZnJhbWUuc2V0U2l6ZShzaXplLnggLSAoaW5zZXRzLmxlZnQgKyBpbnNldHMucmlnaHQpLCBzaXplLnkgLSAoaW5zZXRzLnRvcCArIGluc2V0cy5ib3R0b20pKTsKLQlmcmFtZS5zZXRWaXNpYmxlKHRydWUpOwkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmIChzd3RJbWFnZSAhPSBudWxsKSBzd3RJbWFnZS5kaXNwb3NlKCk7Ci0JaWYgKHN3dEltYWdlMiAhPSBudWxsKSBzd3RJbWFnZS5kaXNwb3NlKCk7Ci0JZnJhbWUuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCS8qIE5vdGU6IElmIHlvdSBhcmUgdXNpbmcgSkRLIDEuMy54LCB5b3UgbmVlZCB0byB1c2UgU3lzdGVtLmV4aXQoMCkgYXQgdGhlIGVuZCBvZiB5b3VyIHByb2dyYW0gdG8gZXhpdCBBV1QuCi0JICogVGhpcyBpcyBiZWNhdXNlIGluIDEuMy54LCBBV1QgZG9lcyBub3QgZXhpdCB3aGVuIHRoZSBmcmFtZSBpcyBkaXNwb3NlZCwgYmVjYXVzZSB0aGUgQVdUIHRocmVhZCBpcyBub3QgYSBkYWVtb24uCi0JICogVGhpcyB3YXMgZml4ZWQgaW4gSkRLIDEuNC54IHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSBBV1QgU2h1dGRvd24gdGhyZWFkLgotCSAqLwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFjZGY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IEVtYmVkIFdvcmQgaW4gYW4gYXBwbGV0ICh3aW4zMiBvbmx5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCQotaW1wb3J0IGphdmEuYXBwbGV0Lio7Ci0JIAotcHVibGljIGNsYXNzIFNuaXBwZXQxNTcgZXh0ZW5kcyBBcHBsZXQgewotCQotCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkgZGlzcGxheTsKLQlvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCBzd3RQYXJlbnQ7Ci0JamF2YS5hd3QuQ2FudmFzIGF3dFBhcmVudDsKLQotcHVibGljIHZvaWQgaW5pdCAoKSB7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQgKG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlzZXRMYXlvdXQobmV3IGphdmEuYXd0LkdyaWRMYXlvdXQgKDEsIDEpKTsKLQkJCWF3dFBhcmVudCA9IG5ldyBqYXZhLmF3dC5DYW52YXMgKCk7Ci0JCQlhZGQgKGF3dFBhcmVudCk7Ci0JCQlkaXNwbGF5ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkgKCk7Ci0JCQlzd3RQYXJlbnQgPSBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1QubmV3X1NoZWxsIChkaXNwbGF5LCBhd3RQYXJlbnQpOwotCQkJc3d0UGFyZW50LnNldExheW91dCAobmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dCAoKSk7Ci0JCQlvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZyYW1lIGZyYW1lID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWUgKHN3dFBhcmVudCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT05FKTsKLQkJCW9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZSBzaXRlOwotCQkJdHJ5IHsKLQkJCQlzaXRlID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZSAoZnJhbWUsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9ORSwgIldvcmQuRG9jdW1lbnQiKTsKLQkJCX0gY2F0Y2ggKG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBzdHIgPSAiQ3JlYXRlIE9sZUNsaWVudFNpdGUgRXJyb3IiICsgZS50b1N0cmluZyAoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKHN0cik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc2V0U2l6ZSAoNTAwLCA1MDApOwotCQkJdmFsaWRhdGUgKCk7Ci0JCQlzaXRlLmRvVmVyYiAob3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEUuT0xFSVZFUkJfU0hPVyk7Ci0JCQkKLQkJCXdoaWxlIChzd3RQYXJlbnQgIT0gbnVsbCAmJiAhc3d0UGFyZW50LmlzRGlzcG9zZWQgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwkJCi0JCQl9CQotCQl9Ci0JfSk7Ci0JdGhyZWFkLnN0YXJ0ICgpOwotfQotIHB1YmxpYyB2b2lkIHN0b3AgKCl7Ci0gCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCAoKSl7Ci0gCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSAoKSB7Ci0gCQkJcHVibGljIHZvaWQgcnVuICgpIHsKLSAJCQkJaWYgKHN3dFBhcmVudCAhPSBudWxsICYmICFzd3RQYXJlbnQuaXNEaXNwb3NlZCAoKSkgc3d0UGFyZW50LmRpc3Bvc2UgKCk7Ci0gCQkJCXN3dFBhcmVudCA9IG51bGw7Ci0gCQkJCWRpc3BsYXkuZGlzcG9zZSAoKTsKLSAJCQkJZGlzcGxheSA9IG51bGw7Ci0gCQkJfQotIAkJfSk7Ci0gCQlyZW1vdmUgKGF3dFBhcmVudCk7Ci0gCQlhd3RQYXJlbnQgPSBudWxsOwotIAl9Ci0gfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3OWZkZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGV0ZXJtaW5lIG5hdGl2ZSBkYXRhIHR5cGVzIGF2YWlsYWJsZSAobW90aWYgb25seSkKLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTggZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLXByaXZhdGUgc3RhdGljIFNuaXBwZXQxNTggX2luc3RhbmNlID0gbmV3IFNuaXBwZXQxNTgoKTsKLXByaXZhdGUgaW50W10gaWRzOwotcHJpdmF0ZSBTdHJpbmdbXSBuYW1lczsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSBjb250cm9sID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQoIkRyYWcgZGF0YSBvdmVyIHRoaXMgc2l0ZSB0byBzZWUgdGhlIG5hdGl2ZSB0cmFuc2ZlciB0eXBlLiIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoY29udHJvbCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LIHwgRE5ELkRST1BfTU9WRSk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtTbmlwcGV0MTU4LmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewkJCQotCQkJU3RyaW5nIG9wcyA9ICIiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgb3BzICs9ICJDb3B5OyI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSBvcHMgKz0gIk1vdmU7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIG9wcyArPSAiTGluazsiOwotCQkJY29udHJvbC5yZW1vdmVBbGwoKTsKLQkJCVRhYmxlSXRlbSBpdGVtMSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQlpdGVtMS5zZXRUZXh0KCJBbGxvd2VkIE9wZXJhdGlvbnMgYXJlICIrb3BzKTsKLQkJCQotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCX0gZWxzZSBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9MSU5LKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0xJTks7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVRyYW5zZmVyRGF0YVtdIGRhdGEgPSBldmVudC5kYXRhVHlwZXM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaWQgPSBkYXRhW2ldLnR5cGU7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lRnJvbUlkKGlkKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsU1dULk5PTkUpOwotCQkJCWl0ZW0yLnNldFRleHQoIkRhdGEgdHlwZSBpcyAiK2lkKyIgIituYW1lKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFNuaXBwZXQxNTggZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci1TbmlwcGV0MTU4KCkgewotfQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsKLQlyZXR1cm4gIkhlbGxvIFdvcmxkIjsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmFtZXM7Ci19Ci1zdGF0aWMgaW50IHNoZWxsSGFuZGxlOwotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlpZiAoaWRzID09IG51bGwpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWludCB3aWRnZXRDbGFzcyA9IE9TLnRvcExldmVsU2hlbGxXaWRnZXRDbGFzcyAoKTsKLQkJc2hlbGxIYW5kbGUgPSBPUy5YdEFwcENyZWF0ZVNoZWxsIChudWxsLCBudWxsLCB3aWRnZXRDbGFzcywgZGlzcGxheS54RGlzcGxheSwgbnVsbCwgMCk7Ci0JCU9TLlh0U2V0TWFwcGVkV2hlbk1hbmFnZWQgKHNoZWxsSGFuZGxlLCBmYWxzZSk7Ci0JCU9TLlh0UmVhbGl6ZVdpZGdldCAoc2hlbGxIYW5kbGUpOwotCQkKLQkJaWRzID0gbmV3IGludFs4NDBdOwotCQluYW1lcyA9IG5ldyBTdHJpbmdbODQwXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCWlkc1tpXSA9IGkraTsKLQkJCW5hbWVzW2ldID0gZ2V0TmFtZUZyb21JZChpKzEpOwotCQl9Ci0JfQotCXJldHVybiBpZHM7Ci19Ci1zdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tSWQoaW50IGlkKSB7Ci0JaW50IHhEaXNwbGF5ID0gT1MuWHREaXNwbGF5IChzaGVsbEhhbmRsZSk7Ci0JaW50IHB0ciA9IDA7Ci0JdHJ5IHsKLQkJcHRyID0gT1MuWG1HZXRBdG9tTmFtZSh4RGlzcGxheSwgaWQpOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JfQotCWlmIChwdHIgPT0gMCkgcmV0dXJuICJpbnZhbGlkICIraWQ7Ci0JaW50IGxlbmd0aCA9IE9TLnN0cmxlbihwdHIpOwotCWJ5dGVbXSBuYW1lQnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLQlPUy5tZW1tb3ZlKG5hbWVCdWYsIHB0ciwgbGVuZ3RoKTsKLQlPUy5YRnJlZShwdHIpOwotCXJldHVybiBuZXcgU3RyaW5nKENvbnZlcnRlci5tYmNzVG9XY3MobnVsbCwgbmFtZUJ1ZikpLnRvTG93ZXJDYXNlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTMyYmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBtb2RpZnkgSFRNTCB0aXRsZSB0YWcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1OSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIG5ld1RpdGxlID0gIk5ldyBWYWx1ZSBmb3IgVGl0bGUiOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGxlRXZlbnQ6ICIrZXZlbnQudGl0bGUpOwotCQkJCXNoZWxsLnNldFRleHQoZXZlbnQudGl0bGUpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCS8qIFNldCBIVE1MIHRpdGxlIHRhZyB1c2luZyBKYXZhU2NyaXB0IGFuZCBET00gd2hlbiBwYWdlIGhhcyBiZWVuIGxvYWRlZCAqLwotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKCJkb2N1bWVudC50aXRsZT0nIituZXdUaXRsZSsiJyIpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCS8qIFNjcmlwdCBtYXkgZmFpbCBvciBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4gKi8KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY3JpcHQgd2FzIG5vdCBleGVjdXRlZC4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkvKiBMb2FkIGFuIEhUTUwgZG9jdW1lbnQgKi8KLQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2Y2EzMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRGlzcGxheSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBvbmUgcmVwZWF0aW5nIHRpbWVyIChldmVyeSA1MDAgbXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgaW50IHRpbWUgPSA1MDA7Ci0JUnVubmFibGUgdGltZXIgPSBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJUG9pbnQgcG9pbnQgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uICgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRCb3VuZHMgKCk7Ci0JCQlpZiAocmVjdC5jb250YWlucyAocG9pbnQpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgiSW4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgiT3V0Iik7Ci0JCQl9Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyAodGltZSwgdGhpcyk7Ci0JCX0KLQl9OwotCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aW1lcik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwkKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNWJhMmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBxdWVyeSBET00gbm9kZSB2YWx1ZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYwIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBTdHJpbmcgaHRtbCA9ICI8aHRtbD48dGl0bGU+U25pcHBldDwvdGl0bGU+PGJvZHk+PHAgaWQ9J215aWQnPkJlc3QgRnJpZW5kczwvcD48cCBpZD0nbXlpZDInPkNhdCBhbmQgRG9nPC9wPjwvYm9keT48L2h0bWw+IjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJYnJvd3Nlci5zZXREYXRhKCJxdWVyeSIsIGV2ZW50LnRleHQpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCS8qIAotCQkJCSAqIFVzZSBKYXZhU2NyaXB0IHRvIHF1ZXJ5IHRoZSBkZXNpcmVkIG5vZGUgY29udGVudCB0aHJvdWdoIHRoZSBEb2N1bWVudCBPYmplY3QgTW9kZWwKLQkJCQkgKiAKLQkJCQkgKiBBc3NpZ24gcmVzdWx0IHRvIHRoZSB3aW5kb3cgcHJvcGVydHkgc3RhdHVzIHRvIHBhc3MgdGhlIHJlc3VsdCB0byB0aGUgU3RhdHVzVGV4dExpc3RlbmVyCi0JCQkJICogVGhpcyB0cmljayBpcyByZXF1aXJlZCBzaW5jZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBkb2VzIG5vdCByZXR1cm4gdGhlIDxjb2RlPlN0cmluZzwvY29kZT4KLQkJCQkgKiBkaXJlY3RseS4KLQkJCQkgKi8KLQkJCQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuZXhlY3V0ZSgid2luZG93LnN0YXR1cz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlpZCcpLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOyIpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCS8qIFNjcmlwdCBtYXkgZmFpbCBvciBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4gKi8KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY3JpcHQgd2FzIG5vdCBleGVjdXRlZC4iKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWJyb3dzZXIuZ2V0RGF0YSgicXVlcnkiKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgdmFsdWU6ICIrdmFsdWUpOwotCQkJfQotCQl9KTsKLQkJLyogTG9hZCBhbiBIVE1MIGRvY3VtZW50ICovCi0JCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQzZDg5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogbW9kaWZ5IERPTSAoZXhlY3V0aW5nIGphdmFzY3JpcHQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjEgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIFN0cmluZyBodG1sID0gIjxodG1sPjx0aXRsZT5TbmlwcGV0PC90aXRsZT48Ym9keT48cCBpZD0nbXlpZCc+QmVzdCBGcmllbmRzPC9wPjxwIGlkPSdteWlkMic+Q2F0IGFuZCBEb2c8L3A+PC9ib2R5PjwvaHRtbD4iOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5CT1JERVIpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULk1VTFRJKTsKLQkJdGV4dC5zZXRUZXh0KCJ2YXIgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1AnKTsgXHJcbiIrCi0JCQkJInZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0F0IGxlYXN0IHdoZW4gSSBhbSBhcm91bmQnKTtcclxuIisKLQkJCQkibmV3Tm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuIisKLQkJCQkiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuIisKLQkJCQkiXHJcbiIrCi0JCQkJImRvY3VtZW50LmJnQ29sb3I9J3llbGxvdyc7Iik7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkV4ZWN1dGUgU2NyaXB0Iik7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIXJlc3VsdCkgewotCQkJCQkvKiBTY3JpcHQgbWF5IGZhaWwgb3IgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgb24gY2VydGFpbiBwbGF0Zm9ybXMuICovCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2NyaXB0IHdhcyBub3QgZXhlY3V0ZWQuIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDI4NmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBBZGRpbmcgYW4gYWNjZXNzaWJsZSBsaXN0ZW5lciB0byBwcm92aWRlIHN0YXRlIGluZm9ybWF0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYyIHsKLQotZmluYWwgc3RhdGljIFN0cmluZyBTVEFURSA9ICJDaGVja2VkSW5kaWNlcyI7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCUltYWdlIGNoZWNrZWRJbWFnZSA9IGdldENoZWNrZWRJbWFnZSAoZGlzcGxheSk7Ci0JSW1hZ2UgdW5jaGVja2VkSW1hZ2UgPSBnZXRVbmNoZWNrZWRJbWFnZSAoZGlzcGxheSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQlpdGVtMS5zZXRUZXh0IChuZXcgU3RyaW5nIFtdIHsiZmlyc3QgaXRlbSIsICJhIiwgImIifSk7Ci0JaXRlbTEuc2V0SW1hZ2UgKDEsIHVuY2hlY2tlZEltYWdlKTsKLQlpdGVtMS5zZXRJbWFnZSAoMiwgdW5jaGVja2VkSW1hZ2UpOwotCWl0ZW0xLnNldERhdGEgKFNUQVRFLCBudWxsKTsKLQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0yLnNldFRleHQgKG5ldyBTdHJpbmcgW10geyJzZWNvbmQgaXRlbSIsICJjIiwgImQifSk7Ci0JaXRlbTIuc2V0SW1hZ2UgKDEsIHVuY2hlY2tlZEltYWdlKTsKLQlpdGVtMi5zZXRJbWFnZSAoMiwgY2hlY2tlZEltYWdlKTsKLQlpdGVtMi5zZXREYXRhIChTVEFURSwgbmV3IGludCBbXSB7Mn0pOwotCVRhYmxlSXRlbSBpdGVtMyA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbTMuc2V0VGV4dCAobmV3IFN0cmluZyBbXSB7InRoaXJkIiwgImUiLCAiZiJ9KTsKLQlpdGVtMy5zZXRJbWFnZSAoMSwgY2hlY2tlZEltYWdlKTsKLQlpdGVtMy5zZXRJbWFnZSAoMiwgY2hlY2tlZEltYWdlKTsKLQlpdGVtMy5zZXREYXRhIChTVEFURSwgbmV3IGludCBbXSB7MSwgMn0pOwotCWNvbHVtbjEucGFjayAoKTsKLQljb2x1bW4yLnBhY2sgKCk7Ci0JY29sdW1uMy5wYWNrICgpOwotCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IHRhYmxlLmdldEFjY2Vzc2libGUgKCk7Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldE5hbWUgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQlzdXBlci5nZXROYW1lIChlKTsKLQkJCWlmIChlLmNoaWxkSUQgPj0gMCAmJiBlLmNoaWxkSUQgPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGUuY2hpbGRJRCk7Ci0JCQkJUG9pbnQgcHQgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uICgpOwotCQkJCXB0ID0gZGlzcGxheS5tYXAgKG51bGwsIHRhYmxlLCBwdCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0JCQkJCWlmIChpdGVtLmdldEJvdW5kcyAoaSkuY29udGFpbnMgKHB0KSkgewotCQkJCQkJaW50IFtdIGRhdGEgPSAoaW50IFtdKSBpdGVtLmdldERhdGEgKFNUQVRFKTsKLQkJCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGZhbHNlOwotCQkJCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5sZW5ndGg7IGorKykgewotCQkJCQkJCQlpZiAoZGF0YSBbal0gPT0gaSkgewotCQkJCQkJCQkJY2hlY2tlZCA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWUucmVzdWx0ID0gaXRlbS5nZXRUZXh0IChpKSArICIgIiArIChjaGVja2VkID8gImNoZWNrZWQiIDogInVuY2hlY2tlZCIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQlzdXBlci5nZXRTdGF0ZSAoZSk7Ci0JCQlpZiAoZS5jaGlsZElEID49IDAgJiYgZS5jaGlsZElEIDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChlLmNoaWxkSUQpOwotCQkJCWludCBbXSBkYXRhID0gKGludCBbXSkgaXRlbS5nZXREYXRhIChTVEFURSk7Ci0JCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCQlQb2ludCBwdCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQkJCXB0ID0gZGlzcGxheS5tYXAgKG51bGwsIHRhYmxlLCBwdCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzIChkYXRhIFtpXSkuY29udGFpbnMgKHB0KSkgewotCQkJCQkJCWUuZGV0YWlsIHw9IEFDQy5TVEFURV9DSEVDS0VEOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY2hlY2tlZEltYWdlLmRpc3Bvc2UgKCk7Ci0JdW5jaGVja2VkSW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXN0YXRpYyBJbWFnZSBnZXRDaGVja2VkSW1hZ2UgKERpc3BsYXkgZGlzcGxheSkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1lFTExPVykpOwotCWdjLmZpbGxPdmFsICgwLCAwLCAxNiwgMTYpOwotCWdjLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9EQVJLX0dSRUVOKSk7Ci0JZ2MuZHJhd0xpbmUgKDAsIDAsIDE2LCAxNik7Ci0JZ2MuZHJhd0xpbmUgKDE2LCAwLCAwLCAxNik7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLXN0YXRpYyBJbWFnZSBnZXRVbmNoZWNrZWRJbWFnZSAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZmlsbE92YWwgKDAsIDAsIDE2LCAxNik7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTdmZDRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTZXR0aW5nIHRoZSBmb250IHN0eWxlLCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycyBvZiBTdHlsZWRUZXh0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkgQUJDREVGR0hJSktMTSBOT1BRUlNUVVZXWFlaIik7Ci0JLy8gbWFrZSAwMTIzNDU2Nzg5IGFwcGVhciBib2xkCi0JU3R5bGVSYW5nZSBzdHlsZTEgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMS5zdGFydCA9IDA7Ci0Jc3R5bGUxLmxlbmd0aCA9IDEwOwotCXN0eWxlMS5mb250U3R5bGUgPSBTV1QuQk9MRDsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUxKTsKLQkvLyBtYWtlIEFCQ0RFRkdISUpLTE0gaGF2ZSBhIHJlZCBmb250Ci0JU3R5bGVSYW5nZSBzdHlsZTIgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMi5zdGFydCA9IDExOwotCXN0eWxlMi5sZW5ndGggPSAxMzsKLQlzdHlsZTIuZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMik7Ci0JLy8gbWFrZSBOT1BRUlNUVVZXWFlaIGhhdmUgYSBibHVlIGJhY2tncm91bmQKLQlTdHlsZVJhbmdlIHN0eWxlMyA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUzLnN0YXJ0ID0gMjU7Ci0Jc3R5bGUzLmxlbmd0aCA9IDEzOwotCXN0eWxlMy5iYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMyk7Ci0JCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5NDVmNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogT3ZlcnJpZGUgdGhlIHRleHQgdGhhdCBpcyBzcG9rZW4gZm9yIGEgbmF0aXZlIEJ1dHRvbi4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjAwKTsKLQotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQoIiZUeXBpY2FsIGJ1dHRvbiIpOwotCWJ1dHRvbjEuc2V0Qm91bmRzKDEwLDEwLDE4MCwzMCk7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCgiJk92ZXJpZGRlbiBidXR0b24iKTsKLQlidXR0b24yLnNldEJvdW5kcygxMCw1MCwxODAsMzApOwotCWJ1dHRvbjIuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gIlNwZWFrIHRoaXMgaW5zdGVhZCBvZiB0aGUgYnV0dG9uIHRleHQiOwotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjYjE4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgQ1RhYkZvbGRlciB3aXRoIG1pbiBhbmQgbWF4IGJ1dHRvbnMsIGFzIHdlbGwgYXMgY2xvc2UgYnV0dG9uIGFuZCAKLSAqIGltYWdlIG9ubHkgb24gc2VsZWN0ZWQgdGFiLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDE2LCAxNik7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDMsIDMsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgQ1RhYkZvbGRlciBmb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQlmb2xkZXIuc2V0U2ltcGxlKGZhbHNlKTsKLQlmb2xkZXIuc2V0VW5zZWxlY3RlZEltYWdlVmlzaWJsZShmYWxzZSk7Ci0JZm9sZGVyLnNldFVuc2VsZWN0ZWRDbG9zZVZpc2libGUoZmFsc2UpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuQ0xPU0UpOwotCQlpdGVtLnNldFRleHQoIkl0ZW0gIitpKTsKLQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdGV4dC5zZXRUZXh0KCJUZXh0IGZvciBpdGVtICIraSsiXG5cbm9uZSwgdHdvLCB0aHJlZVxuXG5hYmNkZWZnaGlqa2xtbm9wIik7Ci0JCWl0ZW0uc2V0Q29udHJvbCh0ZXh0KTsKLQl9Ci0JZm9sZGVyLnNldE1pbmltaXplVmlzaWJsZSh0cnVlKTsKLQlmb2xkZXIuc2V0TWF4aW1pemVWaXNpYmxlKHRydWUpOwotCWZvbGRlci5hZGRDVGFiRm9sZGVyMkxpc3RlbmVyKG5ldyBDVGFiRm9sZGVyMkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1pbmltaXplKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1pbmltaXplZCh0cnVlKTsKLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtYXhpbWl6ZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWZvbGRlci5zZXRNYXhpbWl6ZWQodHJ1ZSk7Ci0JCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVzdG9yZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWZvbGRlci5zZXRNaW5pbWl6ZWQoZmFsc2UpOwotCQkJZm9sZGVyLnNldE1heGltaXplZChmYWxzZSk7Ci0JCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3MjdmMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgU2Nyb2xsZWRDb21wb3NpdGUgd2l0aCB3cmFwcGluZyBjb250ZW50LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaW1hZ2UxID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XT1JLSU5HKTsKLQlJbWFnZSBpbWFnZTIgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKTsKLQlJbWFnZSBpbWFnZTMgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsQ29tcG9zaXRlID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQotCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNjcm9sbENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWZvcihpbnQgaSA9IDA7IGkgPD0gNTA7IGkrKykgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJaWYgKGkgJSAzID09IDApIGxhYmVsLnNldEltYWdlKGltYWdlMSk7Ci0JCWlmIChpICUgMyA9PSAxKSBsYWJlbC5zZXRJbWFnZShpbWFnZTIpOwotCQlpZiAoaSAlIDMgPT0gMikgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UzKTsKLQl9Ci0JUm93TGF5b3V0IGxheW91dCA9IG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpOwotCWxheW91dC53cmFwID0gdHJ1ZTsKLQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0Jc2Nyb2xsQ29tcG9zaXRlLnNldENvbnRlbnQocGFyZW50KTsKLQlzY3JvbGxDb21wb3NpdGUuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0Jc2Nyb2xsQ29tcG9zaXRlLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0Jc2Nyb2xsQ29tcG9zaXRlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgciA9IHNjcm9sbENvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlzY3JvbGxDb21wb3NpdGUuc2V0TWluU2l6ZShwYXJlbnQuY29tcHV0ZVNpemUoci53aWR0aCwgU1dULkRFRkFVTFQpKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyMTFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgdHdvIFNjcm9sbGVkQ29tcG9zaXRlcyB0aGF0IHNjcm9sbCBpbiB0YW5kZW0uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzYzEsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJCdXR0b24gMSIpOwotCWJ1dHRvbjEuc2V0U2l6ZSAoNDAwLCAzMDApOwotCXNjMS5zZXRDb250ZW50IChidXR0b24xKTsKLQotCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMiA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzYzIsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQgKCJCdXR0b24gMiIpOwotCWJ1dHRvbjIuc2V0U2l6ZSAoMzAwLCA0MDApOwotCXNjMi5zZXRDb250ZW50IChidXR0b24yKTsKLQotCWZpbmFsIFNjcm9sbEJhciB2QmFyMSA9IHNjMS5nZXRWZXJ0aWNhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgdkJhcjIgPSBzYzIuZ2V0VmVydGljYWxCYXIgKCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIxID0gc2MxLmdldEhvcml6b250YWxCYXIgKCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIyID0gc2MyLmdldEhvcml6b250YWxCYXIgKCk7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IHggPSAgaEJhcjEuZ2V0U2VsZWN0aW9uKCkgKiAoaEJhcjIuZ2V0TWF4aW11bSgpIC0gaEJhcjIuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCBoQmFyMS5nZXRNYXhpbXVtKCkgLSBoQmFyMS5nZXRUaHVtYigpKTsKLQkJCWludCB5ID0gIHZCYXIxLmdldFNlbGVjdGlvbigpICogKHZCYXIyLmdldE1heGltdW0oKSAtIHZCYXIyLmdldFRodW1iKCkpIC8gTWF0aC5tYXgoMSwgdkJhcjEuZ2V0TWF4aW11bSgpIC0gdkJhcjEuZ2V0VGh1bWIoKSk7Ci0JCQlzYzIuc2V0T3JpZ2luICh4LCB5KTsKLQkJfQotCX07Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IHggPSAgaEJhcjIuZ2V0U2VsZWN0aW9uKCkgKiAoaEJhcjEuZ2V0TWF4aW11bSgpIC0gaEJhcjEuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCBoQmFyMi5nZXRNYXhpbXVtKCkgLSBoQmFyMi5nZXRUaHVtYigpKTsKLQkJCWludCB5ID0gIHZCYXIyLmdldFNlbGVjdGlvbigpICogKHZCYXIxLmdldE1heGltdW0oKSAtIHZCYXIxLmdldFRodW1iKCkpIC8gTWF0aC5tYXgoMSwgdkJhcjIuZ2V0TWF4aW11bSgpIC0gdkJhcjIuZ2V0VGh1bWIoKSk7Ci0JCQlzYzEuc2V0T3JpZ2luICh4LCB5KTsKLQkJfQotCX07Ci0JdkJhcjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMSk7Ci0JaEJhcjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMSk7Ci0JdkJhcjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMik7Ci0JaEJhcjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMik7Ci0KLQlzaGVsbC5zZXRTaXplICg0MDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQyNDVlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmF3IGxpbmVzIGFuZCBwb2x5Z29ucyB3aXRoIGRpZmZlcmVudCBjYXAgYW5kIGpvaW4gc3R5bGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaW50IHggPSAyMCwgeSA9IDIwLCB3ID0gMTIwLCBoID0gNjA7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCQlnYy5zZXRMaW5lV2lkdGgoMTApOwotCQkJaW50W10gY2FwcyA9IHtTV1QuQ0FQX0ZMQVQsIFNXVC5DQVBfUk9VTkQsIFNXVC5DQVBfU1FVQVJFfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2Fwcy5sZW5ndGg7IGkrKykgewotCQkJCWdjLnNldExpbmVDYXAoY2Fwc1tpXSk7Ci0JCQkJZ2MuZHJhd0xpbmUoeCwgeSwgeCArIHcsIHkpOwotCQkJCXkgKz0gMjA7Ci0JCQl9Ci0JCQlpbnRbXSBqb2lucyA9IHtTV1QuSk9JTl9CRVZFTCwgU1dULkpPSU5fTUlURVIsIFNXVC5KT0lOX1JPVU5EfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9pbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlnYy5zZXRMaW5lSm9pbihqb2luc1tpXSk7Ci0JCQkJZ2MuZHJhd1BvbHlnb24obmV3IGludFtdIHt4LCB5LCB4ICsgdy8yLCB5ICsgaCwgeCArIHcsIHl9KTsKLQkJCQl5ICs9IGggKyAyMDsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZGEzMjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIE1ha2UgYSB0b2dnbGUgYnV0dG9uIGhhdmUgcmFkaW8gYmVoYXZpb3IKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjkgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBzaGVsbC5nZXRDaGlsZHJlbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbiBbaV07Ci0JCQkJaWYgKGUud2lkZ2V0ICE9IGNoaWxkICYmIGNoaWxkIGluc3RhbmNlb2YgQnV0dG9uICYmIChjaGlsZC5nZXRTdHlsZSAoKSAmIFNXVC5UT0dHTEUpICE9IDApIHsKLQkJCQkJKChCdXR0b24pIGNoaWxkKS5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkoKEJ1dHRvbikgZS53aWRnZXQpLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCX0KLQl9OwotCWZvciAoaW50IGk9MDsgaTwyMDsgaSsrKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlRPR0dMRSk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiQiIgKyBpKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWlmIChpID09IDApIGJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCX0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGZmODNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNsaWRlciBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHNjcm9sbCBldmVudCBkZXRhaWxzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JU2xpZGVyIHNsaWRlciA9IG5ldyBTbGlkZXIgKHNoZWxsLCBTV1QuSE9SSVpPTlRBTCk7Ci0Jc2xpZGVyLnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDMyKTsKLQlzbGlkZXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHN0cmluZyA9ICJTV1QuTk9ORSI7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJCWNhc2UgU1dULkRSQUc6IHN0cmluZyA9ICJTV1QuRFJBRyI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkhPTUU6IHN0cmluZyA9ICJTV1QuSE9NRSI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkVORDogc3RyaW5nID0gIlNXVC5FTkQiOyBicmVhazsKLQkJCQljYXNlIFNXVC5BUlJPV19ET1dOOiBzdHJpbmcgPSAiU1dULkFSUk9XX0RPV04iOyBicmVhazsKLQkJCQljYXNlIFNXVC5BUlJPV19VUDogc3RyaW5nID0gIlNXVC5BUlJPV19VUCI7IGJyZWFrOwotCQkJCWNhc2UgU1dULlBBR0VfRE9XTjogc3RyaW5nID0gIlNXVC5QQUdFX0RPV04iOyBicmVhazsKLQkJCQljYXNlIFNXVC5QQUdFX1VQOiBzdHJpbmcgPSAiU1dULlBBR0VfVVAiOyBicmVhazsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNjcm9sbCBkZXRhaWwgLT4gIiArIHN0cmluZyk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGMzYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBDcmVhdGUgYSBUcmVlIHdpdGggY29sdW1ucwotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3MCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQljb2x1bW4xLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbjIuc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQkJY29sdW1uMi5zZXRXaWR0aCgyMDApOwotCQlUcmVlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQpOwotCQljb2x1bW4zLnNldFRleHQoIkNvbHVtbiAzIik7Ci0JCWNvbHVtbjMuc2V0V2lkdGgoMjAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ICJpdGVtICIgKyBpLCAiYWJjIiwgImRlZmdoaSIgfSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgewotCQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCXN1Ykl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyAic3ViaXRlbSAiICsgaiwgImprbG1ub3AiLCAicXJzIiB9KTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykgewotCQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ICJzdWJzdWJpdGVtICIgKyBrLCAidHV2IiwgInd4eXoiIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTdiYWVjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRlZmluZSBkYXRhIHRyYW5zZmVyIHR5cGVzIHRoYXQgc3ViY2xhc3MgZWFjaAotICogb3RoZXIKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3MSB7Ci0KLS8qCi0gKiBUaGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBpcyBhbiA8Ym9sZD5hcnJheSBvZiB0eXBlIE15VHlwZTwvYm9sZD4gd2hlcmUKLSAqIE15VHlwZSBpcyBkZWZpbmUgYXM6Ci0gKi8KLXN0YXRpYyBjbGFzcyBNeVR5cGUgewotCVN0cmluZyBmaWxlTmFtZTsKLQlsb25nIGZpbGVMZW5ndGg7Ci0JbG9uZyBsYXN0TW9kaWZpZWQ7Ci19Ci0KLXN0YXRpYyBjbGFzcyBNeVRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZVFlQRU5BTUUgPSAiTXl0eXBlVHJhbnNmZXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNWVRZUEVJRCA9IHJlZ2lzdGVyVHlwZShNWVRZUEVOQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBNeVRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBNeVRyYW5zZmVyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zZmVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCWJ5dGVbXSBqYXZhVG9CeXRlQXJyYXkoT2JqZWN0IG9iamVjdCkgewotCQlNeVR5cGUgZGF0YSA9IChNeVR5cGUpIG9iamVjdDsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBkYXRhLmZpbGVOYW1lLmdldEJ5dGVzKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlKGJ1ZmZlcik7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcoZGF0YS5maWxlTGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyhkYXRhLmxhc3RNb2RpZmllZCk7Ci0JCQlidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQkJCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCQlyZXR1cm4gYnVmZmVyOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JT2JqZWN0IGJ5dGVBcnJheVRvSmF2YShieXRlW10gYnl0ZXMpIHsKLQkJTXlUeXBlIGRhdGEgPSBuZXcgTXlUeXBlKCk7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0JCQlEYXRhSW5wdXRTdHJlYW0gcmVhZEluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbik7Ci0JCQlpbnQgc2l6ZSA9IHJlYWRJbi5yZWFkSW50KCk7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlyZWFkSW4ucmVhZChidWZmZXIpOwotCQkJZGF0YS5maWxlTmFtZSA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJCWRhdGEuZmlsZUxlbmd0aCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJZGF0YS5sYXN0TW9kaWZpZWQgPSByZWFkSW4ucmVhZExvbmcoKTsKLQkJCXJlYWRJbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCFjaGVja015VHlwZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCQl9Ci0JCWJ5dGVbXSBidWZmZXIgPSBqYXZhVG9CeXRlQXJyYXkob2JqZWN0KTsKLQkJc3VwZXIuamF2YVRvTmF0aXZlKGJ1ZmZlciwgdHJhbnNmZXJEYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmIChpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQkJYnl0ZVtdIGJ1ZmZlciA9IChieXRlW10pIHN1cGVyLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlckRhdGEpOwotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGJ5dGVBcnJheVRvSmF2YShidWZmZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBNWVRZUEVOQU1FIH07Ci0JfQotCi0JcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyBNWVRZUEVJRCB9OwotCX0KLQotCWJvb2xlYW4gY2hlY2tNeVR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgTXlUeXBlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNoZWNrTXlUeXBlKG9iamVjdCk7Ci0JfQotfQotCi0vKgotICogVGhlIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQgaXMgYW4gPGJvbGQ+YXJyYXkgb2YgdHlwZSBNeVR5cGUyPC9ib2xkPgotICogd2hlcmUgTXlUeXBlMiBpcyBkZWZpbmUgYXM6Ci0gKi8KLXN0YXRpYyBjbGFzcyBNeVR5cGUyIGV4dGVuZHMgTXlUeXBlIHsKLQlTdHJpbmcgdmVyc2lvbjsKLX0KLQotc3RhdGljIGNsYXNzIE15VHJhbnNmZXIyIGV4dGVuZHMgTXlUcmFuc2ZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlUWVBFMk5BTUUgPSAiTXl0eXBlMlRyYW5zZmVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFMklEID0gcmVnaXN0ZXJUeXBlKE1ZVFlQRTJOQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBNeVRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBNeVRyYW5zZmVyMigpOwotCi0JcHVibGljIHN0YXRpYyBUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgTVlUWVBFMk5BTUUgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IE1ZVFlQRTJJRCB9OwotCX0KLQotCWJ5dGVbXSBqYXZhVG9CeXRlQXJyYXkoT2JqZWN0IG9iamVjdCkgewotCQlNeVR5cGUyIGRhdGEgPSAoTXlUeXBlMikgb2JqZWN0OwotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IGRhdGEuZmlsZU5hbWUuZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyhkYXRhLmZpbGVMZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEubGFzdE1vZGlmaWVkKTsKLQkJCWJ1ZmZlciA9IGRhdGEudmVyc2lvbi5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCQl3cml0ZU91dC5jbG9zZSgpOwotCQkJcmV0dXJuIGJ1ZmZlcjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCU9iamVjdCBieXRlQXJyYXlUb0phdmEoYnl0ZVtdIGJ5dGVzKSB7Ci0JCU15VHlwZTIgZGF0YSA9IG5ldyBNeVR5cGUyKCk7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0JCQlEYXRhSW5wdXRTdHJlYW0gcmVhZEluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbik7Ci0JCQlpbnQgc2l6ZSA9IHJlYWRJbi5yZWFkSW50KCk7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlyZWFkSW4ucmVhZChidWZmZXIpOwotCQkJZGF0YS5maWxlTmFtZSA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJCWRhdGEuZmlsZUxlbmd0aCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJZGF0YS5sYXN0TW9kaWZpZWQgPSByZWFkSW4ucmVhZExvbmcoKTsKLQkJCXNpemUgPSByZWFkSW4ucmVhZEludCgpOwotCQkJYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlyZWFkSW4ucmVhZChidWZmZXIpOwotCQkJZGF0YS52ZXJzaW9uID0gbmV3IFN0cmluZyhidWZmZXIpOwotCQkJcmVhZEluLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoIWNoZWNrTXlUeXBlMihvYmplY3QpKSB7Ci0JCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JCX0KLQkJc3VwZXIuamF2YVRvTmF0aXZlKG9iamVjdCwgdHJhbnNmZXJEYXRhKTsKLQl9Ci0KLQlib29sZWFuIGNoZWNrTXlUeXBlMihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghY2hlY2tNeVR5cGUob2JqZWN0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIE15VHlwZTI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tNeVR5cGUyKG9iamVjdCk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMS5zZXRUZXh0KCJEcmFnIFNvdXJjZSBmb3IgTXlEYXRhIGFuZCBNeURhdGEyIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMi5zZXRUZXh0KCJEcm9wIFRhcmdldCBmb3IgTXlEYXRhIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMy5zZXRUZXh0KCJEcm9wIFRhcmdldCBmb3IgTXlEYXRhMiIpOwotCi0JRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShsYWJlbDEsIERORC5EUk9QX0NPUFkpOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IE15VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJCU15VHJhbnNmZXIyLmdldEluc3RhbmNlKCkgfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJTXlUeXBlMiBteVR5cGUgPSBuZXcgTXlUeXBlMigpOwotCQkJbXlUeXBlLmZpbGVOYW1lID0gIkM6XFxhYmMudHh0IjsKLQkJCW15VHlwZS5maWxlTGVuZ3RoID0gMTAwMDsKLQkJCW15VHlwZS5sYXN0TW9kaWZpZWQgPSAxMjMxMjMxMzsKLQkJCW15VHlwZS52ZXJzaW9uID0gInZlcnNpb24gMiI7Ci0JCQlldmVudC5kYXRhID0gbXlUeXBlOwotCQl9Ci0JfSk7Ci0JRHJvcFRhcmdldCB0YXJnZXRNeVR5cGUgPSBuZXcgRHJvcFRhcmdldChsYWJlbDIsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9ERUZBVUxUKTsKLQl0YXJnZXRNeVR5cGUuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10geyBNeVRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0JdGFyZ2V0TXlUeXBlLmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSAhPSBudWxsKSB7Ci0JCQkJTXlUeXBlIG15VHlwZSA9IChNeVR5cGUpIGV2ZW50LmRhdGE7Ci0JCQkJaWYgKG15VHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAiTXlUeXBlOiAiICsgbXlUeXBlLmZpbGVOYW1lOwotCQkJCQlsYWJlbDIuc2V0VGV4dChzdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfSk7Ci0JRHJvcFRhcmdldCB0YXJnZXRNeVR5cGUyID0gbmV3IERyb3BUYXJnZXQobGFiZWwzLCBETkQuRFJPUF9DT1BZCXwgRE5ELkRST1BfREVGQVVMVCk7Ci0JdGFyZ2V0TXlUeXBlMi5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IE15VHJhbnNmZXIyLmdldEluc3RhbmNlKCkgfSk7Ci0JdGFyZ2V0TXlUeXBlMi5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCkgewotCQkJCU15VHlwZTIgbXlUeXBlID0gKE15VHlwZTIpIGV2ZW50LmRhdGE7Ci0JCQkJaWYgKG15VHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAiTXlUeXBlMjogIiArIG15VHlwZS5maWxlTmFtZSArICI6IgotCQkJCQkJCSsgbXlUeXBlLnZlcnNpb247Ci0JCQkJCWxhYmVsMy5zZXRUZXh0KHN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MWVmZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdyaWRMYXlvdXQgc25pcHBldDogYWxpZ24gd2lkZ2V0cyBpbiBhIEdyaWRMYXlvdXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTEVGVCwgVE9QIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJMRUZULCBDRU5URVIiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5CT1RUT00sIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTEVGVCwgRklMTCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNFTlRFUiwgVE9QIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuVE9QLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNFTlRFUiwgQ0VOVEVSIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNFTlRFUiwgQk9UVE9NIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQk9UVE9NLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkNFTlRFUiwgRklMTCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUklHSFQsIFRPUCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuVE9QLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBDRU5URVIiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJSSUdIVCwgQk9UVE9NIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5CT1RUT00sIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUklHSFQsIEZJTEwiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiRklMTCwgVE9QIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJGSUxMLCBDRU5URVIiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIEJPVFRPTSIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CT1RUT00sIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiRklMTCwgRklMTCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JCi0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmN2VlNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTczLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBzbmlwcGV0OiBicmluZyB1cCBhIGJyb3dzZXIgd2l0aCBwb3AtdXAgYmxvY2tlcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIk1haW4gV2luZG93Iik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQl0cnkgewotCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCXJldHVybjsKLQl9Ci0JaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQlzaGVsbC5vcGVuKCk7Ci0JLyogYW55IHdlYnNpdGUgd2l0aCBwb3B1cHMgKi8KLQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5jbm4uY29tIik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotLyogcmVnaXN0ZXIgV2luZG93RXZlbnQgbGlzdGVuZXJzICovCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgQnJvd3NlciBicm93c2VyKSB7Ci0JYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCQlzaGVsbC5zZXRUZXh0KCJOZXcgV2luZG93Iik7Ci0JCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQkJCWV2ZW50LmJyb3dzZXIgPSBicm93c2VyOwotCQl9Ci0JfSk7Ci0JYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCS8qIHBvcHVwIGJsb2NrZXIgLSBpZ25vcmUgd2luZG93cyB3aXRoIG5vIHN0eWxlICovCi0JCQlpZiAoIWV2ZW50LmFkZHJlc3NCYXIgJiYgIWV2ZW50Lm1lbnVCYXIgJiYgIWV2ZW50LnN0YXR1c0JhciAmJiAhZXZlbnQudG9vbEJhcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUG9wdXAgYmxvY2tlZC4iKTsKLQkJCQlldmVudC5kaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoZXZlbnQubG9jYXRpb24gIT0gbnVsbCkgc2hlbGwuc2V0TG9jYXRpb24oZXZlbnQubG9jYXRpb24pOwotCQkJaWYgKGV2ZW50LnNpemUgIT0gbnVsbCkgewotCQkJCVBvaW50IHNpemUgPSBldmVudC5zaXplOwotCQkJCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJfQotCX0pOwotCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2xvc2UoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJc2hlbGwuY2xvc2UoKTsKLQkJfQotCX0pOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlZDJmNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNlYmFzdGlhbiBEYXZpZHMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIE9wZW5HTCBzbmlwcGV0OiBkcmF3IGEgc3F1YXJlCi0gKiAKLSAqIFRoaXMgc25pcHBldCByZXF1aXJlcyB0aGUgZXhwZXJpbWVudGFsIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wgcGx1Z2luLCB3aGljaAotICogaXMgbm90IGluY2x1ZGVkIGluIFNXVCBieSBkZWZhdWx0IGFuZCBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggdmVyc2lvbnMgb2YKLSAqIFNXVCBwcmlvciB0byAzLjIuICBGb3IgaW5mb3JtYXRpb24gb24gdXNpbmcgT3BlbkdMIGluIFNXVCBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L29wZW5nbC8gLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0VGV4dCgiT3BlbkdMIGluIFNXVCIpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICBHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEoKTsKLSAgICBkYXRhLmRvdWJsZUJ1ZmZlciA9IHRydWU7Ci0gICAgZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKHNoZWxsLCBTV1QuTk9fQkFDS0dST1VORCwgZGF0YSk7Ci0gICAgY2FudmFzLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICByZXNpemUoY2FudmFzKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIGluaXQoY2FudmFzKTsKLSAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChjYW52YXMuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0gICAgICAgICAgICByZW5kZXIoKTsKLSAgICAgICAgICAgIGNhbnZhcy5zd2FwQnVmZmVycygpOwotICAgICAgICAgICAgY2FudmFzLmdldERpc3BsYXkoKS50aW1lckV4ZWMoNTAsIHRoaXMpOwotICAgICAgICB9Ci0gICAgfS5ydW4oKTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBpbml0KEdMQ2FudmFzIGNhbnZhcykgewotICAgIGNhbnZhcy5zZXRDdXJyZW50KCk7Ci0gICAgcmVzaXplKGNhbnZhcyk7Ci0gICAgR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotICAgIEdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAwLjBmKTsKLSAgICBHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0gICAgR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0gICAgR0wuZ2xIaW50KEdMLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wuR0xfTklDRVNUKTsKLX0KLQotc3RhdGljIHZvaWQgcmVuZGVyKCkgewotICAgIEdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotICAgIEdMLmdsTG9hZElkZW50aXR5KCk7Ci0gICAgR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC02LjBmKTsKLSAgICBHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLSAgICBHTC5nbFZlcnRleDNmKC0xLjBmLCAxLjBmLCAwLjBmKTsKLSAgICBHTC5nbFZlcnRleDNmKDEuMGYsIDEuMGYsIDAuMGYpOwotICAgIEdMLmdsVmVydGV4M2YoMS4wZiwgLTEuMGYsIDAuMGYpOwotICAgIEdMLmdsVmVydGV4M2YoLTEuMGYsIC0xLjBmLCAwLjBmKTsKLSAgICBHTC5nbEVuZCgpOwotfQotCi1zdGF0aWMgdm9pZCByZXNpemUoR0xDYW52YXMgY2FudmFzKSB7Ci0gICAgY2FudmFzLnNldEN1cnJlbnQoKTsKLSAgICBSZWN0YW5nbGUgcmVjdCA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0gICAgaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLSAgICBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgocmVjdC5oZWlnaHQsIDEpOwotICAgIEdMLmdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX1BST0pFQ1RJT04pOwotICAgIEdMLmdsTG9hZElkZW50aXR5KCk7Ci0gICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0OwotICAgIEdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgYXNwZWN0LCAwLjVmLCA0MDAuMGYpOwotICAgIEdMLmdsTWF0cml4TW9kZShHTC5HTF9NT0RFTFZJRVcpOwotICAgIEdMLmdsTG9hZElkZW50aXR5KCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZmM5NzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogRXhjbHVkZSBhIHdpZGdldCBmcm9tIGEgR3JpZExheW91dAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMCIpOwotCi0JZmluYWwgQnV0dG9uIGJIaWRkZW4gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYkhpZGRlbi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlkYXRhLmV4Y2x1ZGUgPSB0cnVlOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCWJIaWRkZW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMiIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMyIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gNCIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJoaWRlIik7Ci0JYi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0JCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBiSGlkZGVuLmdldExheW91dERhdGEoKTsKLQkJCWRhdGEuZXhjbHVkZSA9IGIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQliSGlkZGVuLnNldFZpc2libGUoIWRhdGEuZXhjbHVkZSk7Ci0JCQlzaGVsbC5sYXlvdXQoZmFsc2UpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYWY3NTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFJvd0xheW91dCBzbmlwcGV0OiBhbGlnbiB3aWRnZXRzIGluIGEgcm93Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCWxheW91dC5maWxsID0gZmFsc2U7Ci0JbGF5b3V0Lmp1c3RpZnkgPSB0cnVlOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0KLQliLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDMiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJOb3Qgc2hvd24iKTsKLQliLnNldFZpc2libGUoZmFsc2UpOwotCVJvd0RhdGEgZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5leGNsdWRlID0gdHJ1ZTsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIwMCBoaWdoIik7Ci0JZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5oZWlnaHQgPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgd2lkZSIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEud2lkdGggPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE4ZWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBSb3dMYXlvdXQgc25pcHBldDogYWxpZ24gd2lkZ2V0cyBpbiBhIGNvbHVtbgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpOwotCWxheW91dC53cmFwID0gdHJ1ZTsKLQlsYXlvdXQuZmlsbCA9IHRydWU7Ci0JbGF5b3V0Lmp1c3RpZnkgPSBmYWxzZTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDEiKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCi0JYi5zZXRUZXh0KCJCdXR0b24gMiIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAzIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTm90IHNob3duIik7Ci0JYi5zZXRWaXNpYmxlKGZhbHNlKTsKLQlSb3dEYXRhIGRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuZXhjbHVkZSA9IHRydWU7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgaGlnaCIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuaGVpZ2h0ID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMjAwIHdpZGUiKTsKLQlkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLndpZHRoID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NTRiYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEhvdyB0byBhY2Nlc3MgQWJvdXQsIFByZWZlcmVuY2VzIGFuZCBRdWl0IG1lbnVzIG9uIGNhcmJvbi4KLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc4IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrSElDb21tYW5kUHJlZmVyZW5jZXMgPSAoJ3AnIDw8IDI0KSArICgncicgPDwgMTYpCi0JCQkrICgnZScgPDwgOCkgKyAnZic7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0hJQ29tbWFuZEFib3V0ID0gKCdhJyA8PCAyNCkgKyAoJ2InIDw8IDE2KQotCQkJKyAoJ28nIDw8IDgpICsgJ3UnOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtISUNvbW1hbmRTZXJ2aWNlcyA9ICgncycgPDwgMjQpICsgKCdlJyA8PCAxNikKLQkJCSsgKCdyJyA8PCA4KSArICd2JzsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJnKSB7Ci0JRGlzcGxheS5zZXRBcHBOYW1lKCJBcHBNZW51Iik7IC8vIHNldHMgbmFtZSBpbiBEb2NrCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlob29rQXBwbGljYXRpb25NZW51KGRpc3BsYXksICJBYm91dCBBcHBNZW51Iik7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiBXaW5kb3ciKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBob29rQXBwbGljYXRpb25NZW51KERpc3BsYXkgZGlzcGxheSwgZmluYWwgU3RyaW5nIGFib3V0TmFtZSkgewotCS8vIENhbGxiYWNrIHRhcmdldAotCU9iamVjdCB0YXJnZXQgPSBuZXcgT2JqZWN0KCkgewotCQlpbnQgY29tbWFuZFByb2MoaW50IG5leHRIYW5kbGVyLCBpbnQgdGhlRXZlbnQsIGludCB1c2VyRGF0YSkgewotCQkJaWYgKE9TLkdldEV2ZW50S2luZCh0aGVFdmVudCkgPT0gT1Mua0V2ZW50UHJvY2Vzc0NvbW1hbmQpIHsKLQkJCQlISUNvbW1hbmQgY29tbWFuZCA9IG5ldyBISUNvbW1hbmQoKTsKLQkJCQlPUy5HZXRFdmVudFBhcmFtZXRlcih0aGVFdmVudCwgT1Mua0V2ZW50UGFyYW1EaXJlY3RPYmplY3QsCi0JCQkJCQlPUy50eXBlSElDb21tYW5kLCBudWxsLCBISUNvbW1hbmQuc2l6ZW9mLCBudWxsLAotCQkJCQkJY29tbWFuZCk7Ci0JCQkJc3dpdGNoIChjb21tYW5kLmNvbW1hbmRJRCkgewotCQkJCWNhc2Uga0hJQ29tbWFuZFByZWZlcmVuY2VzOgotCQkJCQlyZXR1cm4gaGFuZGxlQ29tbWFuZCgiUHJlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2Uga0hJQ29tbWFuZEFib3V0OgotCQkJCQlyZXR1cm4gaGFuZGxlQ29tbWFuZChhYm91dE5hbWUpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBPUy5ldmVudE5vdEhhbmRsZWRFcnI7Ci0JCX0KLQotCQlpbnQgaGFuZGxlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCU1lc3NhZ2VCb3ggcHJlZmVyZW5jZXMgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyk7Ci0JCQlwcmVmZXJlbmNlcy5zZXRUZXh0KGNvbW1hbmQpOwotCQkJcHJlZmVyZW5jZXMub3BlbigpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJcmV0dXJuIE9TLm5vRXJyOwotCQl9Ci0JfTsKLQotCWZpbmFsIENhbGxiYWNrIGNvbW1hbmRDYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0YXJnZXQsICJjb21tYW5kUHJvYyIsIDMpOyAvLyROT04tTkxTLTEkCi0JaW50IGNvbW1hbmRQcm9jID0gY29tbWFuZENhbGxiYWNrLmdldEFkZHJlc3MoKTsKLQlpZiAoY29tbWFuZFByb2MgPT0gMCkgewotCQljb21tYW5kQ2FsbGJhY2suZGlzcG9zZSgpOwotCQlyZXR1cm47IC8vIGdpdmUgdXAKLQl9Ci0KLQkvLyBJbnN0YWxsIGV2ZW50IGhhbmRsZXIgZm9yIGNvbW1hbmRzCi0JaW50W10gbWFzayA9IG5ldyBpbnRbXSB7IE9TLmtFdmVudENsYXNzQ29tbWFuZCwgT1Mua0V2ZW50UHJvY2Vzc0NvbW1hbmQgfTsKLQlPUy5JbnN0YWxsRXZlbnRIYW5kbGVyKE9TLkdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoKSwgY29tbWFuZFByb2MsCi0JCQltYXNrLmxlbmd0aCAvIDIsIG1hc2ssIDAsIG51bGwpOwotCi0JLy8gY3JlYXRlIEFib3V0IC4uLiBtZW51IGNvbW1hbmQKLQlpbnRbXSBvdXRNZW51ID0gbmV3IGludFsxXTsKLQlzaG9ydFtdIG91dEluZGV4ID0gbmV3IHNob3J0WzFdOwotCWlmIChPUy5HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoMCwga0hJQ29tbWFuZFByZWZlcmVuY2VzLCAxLAotCQkJb3V0TWVudSwgb3V0SW5kZXgpID09IE9TLm5vRXJyCi0JCQkmJiBvdXRNZW51WzBdICE9IDApIHsKLQkJaW50IG1lbnUgPSBvdXRNZW51WzBdOwotCi0JCWludCBsID0gYWJvdXROYW1lLmxlbmd0aCgpOwotCQljaGFyIGJ1ZmZlcltdID0gbmV3IGNoYXJbbF07Ci0JCWFib3V0TmFtZS5nZXRDaGFycygwLCBsLCBidWZmZXIsIDApOwotCQlpbnQgc3RyID0gT1MuQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyhPUy5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAotCQkJCWJ1ZmZlciwgbCk7Ci0JCU9TLkluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhtZW51LCBzdHIsIChzaG9ydCkgMCwgMCwKLQkJCQlrSElDb21tYW5kQWJvdXQpOwotCQlPUy5DRlJlbGVhc2Uoc3RyKTsKLQotCQkvLyBhZGQgc2VwYXJhdG9yIGJldHdlZW4gQWJvdXQgJiBQcmVmZXJlbmNlcwotCQlPUy5JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcobWVudSwgMCwgKHNob3J0KSAxLAotCQkJCU9TLmtNZW51SXRlbUF0dHJTZXBhcmF0b3IsIDApOwotCi0JCS8vIGVuYWJsZSBwcmVmIG1lbnUKLQkJT1MuRW5hYmxlTWVudUNvbW1hbmQobWVudSwga0hJQ29tbWFuZFByZWZlcmVuY2VzKTsKLQotCQkvLyBkaXNhYmxlIHNlcnZpY2VzIG1lbnUKLQkJT1MuRGlzYWJsZU1lbnVDb21tYW5kKG1lbnUsIGtISUNvbW1hbmRTZXJ2aWNlcyk7Ci0JfQotCi0JLy8gc2NoZWR1bGUgZGlzcG9zYWwgb2YgY2FsbGJhY2sgb2JqZWN0Ci0JZGlzcGxheS5kaXNwb3NlRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWNvbW1hbmRDYWxsYmFjay5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4MDVmOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB2ZXJpZnkgaW5wdXQgKGZvcm1hdCBmb3IgZGF0ZSkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQoIllZWVkvTU0vREQiKTs7CQotCWZpbmFsIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBpZ25vcmU7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChpZ25vcmUpIHJldHVybjsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZS50ZXh0KTsKLQkJCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2J1ZmZlci5sZW5ndGgoKV07Ci0JCQlidWZmZXIuZ2V0Q2hhcnMoMCwgY2hhcnMubGVuZ3RoLCBjaGFycywgMCk7Ci0JCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgewotCQkJCWZvciAoaW50IGkgPSBlLnN0YXJ0OyBpIDwgZS5lbmQ7IGkrKykgewotCQkJCQlzd2l0Y2ggKGkpIHsKLQkJCQkJCWNhc2UgMDogLyogW1ldWVlZICovCi0JCQkJCQljYXNlIDE6IC8qIFlbWV1ZWSAqLwotCQkJCQkJY2FzZSAyOiAvKiBZWVtZXVkgKi8KLQkJCQkJCWNhc2UgMzogLyogWVlZW1ldICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdZJyk7IAlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgNTogLyogW01dTSovCi0JCQkJCQljYXNlIDY6IC8qIE1bTV0gKi97Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnTScpOyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgODogLyogW0RdRCAqLwotCQkJCQkJY2FzZSA5OiAvKiBEW0RdICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdEJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA0OiAvKiBZWVlZWy9dTU0gKi8KLQkJCQkJCWNhc2UgNzogLyogTU1bL11ERCAqLyB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnLycpOyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBidWZmZXIubGVuZ3RoKCkpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCi0JCQlpbnQgc3RhcnQgPSBlLnN0YXJ0OwotCQkJaWYgKHN0YXJ0ID4gOSkgcmV0dXJuOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA0IHx8IHN0YXJ0ICsgaW5kZXggPT0gNykgewotCQkJCQlpZiAoY2hhcnNbaV0gPT0gJy8nKSB7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmZmVyLmluc2VydChpbmRleCsrLCAnLycpOwotCQkJCX0KLQkJCQlpZiAoY2hhcnNbaV0gPCAnMCcgfHwgJzknIDwgY2hhcnNbaV0pIHJldHVybjsKLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA1ICYmICAnMScgPCBjaGFyc1tpXSkgcmV0dXJuOyAvKiBbTV1NICovCi0JCQkJaWYgKHN0YXJ0ICsgaW5kZXggPT0gOCAmJiAgJzMnIDwgY2hhcnNbaV0pIHJldHVybjsgLyogW0RdRCAqLwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3VGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50IGxlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgZGF0ZSA9IG5ldyBTdHJpbmdCdWZmZXIodGV4dC5nZXRUZXh0KCkpOwotCQkJZGF0ZS5yZXBsYWNlKGUuc3RhcnQsIGUuc3RhcnQgKyBsZW5ndGgsIG5ld1RleHQpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIDE5MDEpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1PTlRILCBDYWxlbmRhci5KQU5VQVJZKTsKLQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5EQVRFLCAxKTsKLQkJCVN0cmluZyB5eXl5ID0gZGF0ZS5zdWJzdHJpbmcoMCwgNCk7Ci0JCQlpZiAoeXl5eS5pbmRleE9mKCdZJykgPT0gLTEpIHsKLQkJCQlpbnQgeWVhciA9IEludGVnZXIucGFyc2VJbnQoeXl5eSk7Ci0JCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIHllYXIpOwotCQkJfQotCQkJU3RyaW5nIG1tID0gZGF0ZS5zdWJzdHJpbmcoNSwgNyk7Ci0JCQlpZiAobW0uaW5kZXhPZignTScpID09IC0xKSB7Ci0JCQkJaW50IG1vbnRoID0gIEludGVnZXIucGFyc2VJbnQobW0pIC0gMTsKLQkJCQlpbnQgbWF4TW9udGggPSBjYWxlbmRhci5nZXRBY3R1YWxNYXhpbXVtKENhbGVuZGFyLk1PTlRIKTsKLQkJCQlpZiAoMCA+IG1vbnRoIHx8IG1vbnRoID4gbWF4TW9udGgpIHJldHVybjsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuTU9OVEgsIG1vbnRoKTsKLQkJCX0KLQkJCVN0cmluZyBkZCA9IGRhdGUuc3Vic3RyaW5nKDgsMTApOwotCQkJaWYgKGRkLmluZGV4T2YoJ0QnKSA9PSAtMSkgewotCQkJCWludCBkYXkgPSBJbnRlZ2VyLnBhcnNlSW50KGRkKTsKLQkJCQlpbnQgbWF4RGF5ID0gY2FsZW5kYXIuZ2V0QWN0dWFsTWF4aW11bShDYWxlbmRhci5EQVRFKTsKLQkJCQlpZiAoMSA+IGRheSB8fCBkYXkgPiBtYXhEYXkpIHJldHVybjsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuREFURSwgZGF5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCkgID09IENhbGVuZGFyLkZFQlJVQVJZKSB7Ci0JCQkJCWNoYXIgZmlyc3RDaGFyID0gZGF0ZS5jaGFyQXQoOCk7Ci0JCQkJCWlmIChmaXJzdENoYXIgIT0gJ0QnICYmICcyJyA8IGZpcnN0Q2hhcikgcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBsZW5ndGgpOwotCQkJaWdub3JlID0gdHJ1ZTsKLQkJCXRleHQuaW5zZXJ0KG5ld1RleHQpOwotCQkJaWdub3JlID0gZmFsc2U7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhiZmI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0b29sIGJhciAodGV4dCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsICgpOwotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0gCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2YzMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIG5vbi1yZWN0YW5ndWxhciBzaGVsbCB0byBzaW11bGF0ZSB0cmFuc3BhcmVuY3kKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotCS8vU2hlbGwgbXVzdCBiZSBjcmVhdGVkIHdpdGggc3R5bGUgU1dULk5PX1RSSU0KLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JLy9kZWZpbmUgYSByZWdpb24gCi0JUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQlSZWN0YW5nbGUgcGl4ZWwgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpOwotCWZvciAoaW50IHkgPSAwOyB5IDwgMjAwOyB5Kz0yKSB7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IDIwMDsgeCs9MikgewotCQkJCXBpeGVsLnggPSB4OwotCQkJCXBpeGVsLnkgPSB5OwotCQkJCXJlZ2lvbi5hZGQocGl4ZWwpOwotCQkJfQotCQl9Ci0JLy9kZWZpbmUgdGhlIHNoYXBlIG9mIHRoZSBzaGVsbCB1c2luZyBzZXRSZWdpb24KLQlzaGVsbC5zZXRSZWdpb24ocmVnaW9uKTsKLQlSZWN0YW5nbGUgc2l6ZSA9IHJlZ2lvbi5nZXRCb3VuZHMoKTsKLQlzaGVsbC5zZXRTaXplKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKLQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBzaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgMTAsIDEwLCBzaXplLngtMjAsIHNpemUueS0yMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlyZWdpb24uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQxNTg4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBBbGxvdyB1c2VyIHRvIHJlb3JkZXIgY29sdW1ucyBhbmQgcmVvcmRlciBjb2x1bW5zIHByb2dyYW1tYXRpY2FsbHkuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4MSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCkpOwotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5DSEVDSyk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IFJvd0RhdGEoLTEsIDMwMCkpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAwIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAzIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gNCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCVN0cmluZ1tdIHRleHQgPSBuZXcgU3RyaW5nW117aSsiIDAiLCBpKyIgMSIsIGkrIiAyIiwgaSsiIDMiLCBpKyIgNCJ9OwotCQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW92ZSAiK2Uud2lkZ2V0KTsKLQkJCX0KLQkJfTsKLQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnNbaV0ucGFjaygpOwotCQkJY29sdW1uc1tpXS5zZXRNb3ZlYWJsZSh0cnVlKTsKLQkJCWNvbHVtbnNbaV0uYWRkTGlzdGVuZXIoU1dULk1vdmUsIGxpc3RlbmVyKTsKLQkJfQotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJpbnZlcnQgY29sdW1uIG9yZGVyIik7Ci0JCWIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWludFtdIG9yZGVyID0gdGFibGUuZ2V0Q29sdW1uT3JkZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aCAvIDI7IGkrKykgewotCQkJCQlpbnQgdGVtcCA9IG9yZGVyW2ldOwotCQkJCQlvcmRlcltpXSA9IG9yZGVyW29yZGVyLmxlbmd0aCAtIGkgLSAxXTsKLQkJCQkJb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdID0gdGVtcDsKLQkJCQl9Ci0JCQkJdGFibGUuc2V0Q29sdW1uT3JkZXIob3JkZXIpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxMGYyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGluayBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxpbmsgd2lkZ2V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgyIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCUxpbmsgbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJbGluay5zZXRUZXh0KCJUaGlzIGEgdmVyeSBzaW1wbGUgPEE+bGluazwvQT4gd2lkZ2V0LiIpOwotCQlsaW5rLnNldFNpemUoMTQwLCA0MCk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjNWExZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGluayBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBzZWxlY3Rpb24gZXZlbnRzIGluIGEgbGluayB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4MyB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJTGluayBsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5OT05FKTsKLQkJU3RyaW5nIHRleHQgPSAiVGhlIFNXVCBjb21wb25lbnQgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSA8YT5lZmZpY2llbnQ8L2E+LCA8YT5wb3J0YWJsZTwvYT4gPGEgaHJlZj1cIm5hdGl2ZVwiPmFjY2VzcyB0byB0aGUgdXNlci1pbnRlcmZhY2UgZmFjaWxpdGllcyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbXM8L2E+IG9uIHdoaWNoIGl0IGlzIGltcGxlbWVudGVkLiI7Ci0JCWxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJbGluay5zZXRTaXplKDQwMCwgNDAwKTsKLQkJbGluay5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWxlY3Rpb246ICIgKyBldmVudC50ZXh0KTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxODk1YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU3Bpbm5lciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNwaW5uZXIgd2lkZ2V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCXNwaW5uZXIuc2V0TWluaW11bSgwKTsKLQkJc3Bpbm5lci5zZXRNYXhpbXVtKDEwMDApOwotCQlzcGlubmVyLnNldFNlbGVjdGlvbig1MDApOwotCQlzcGlubmVyLnNldEluY3JlbWVudCgxKTsKLQkJc3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50KDEwMCk7Ci0JCXNwaW5uZXIucGFjaygpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0ZDdjNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIE1ha2UgYSBkcm9wcGVkIGRhdGEgdHlwZSBkZXBlbmQgb24gYSB0YXJnZXQgaXRlbSBpbiB0YWJsZQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbDEuc2V0VGV4dCgiRHJhZyBTb3VyY2UiKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWlmIChpICUgMiA9PSAwKSBpdGVtLnNldFRleHQoIkRyb3AgYSBmaWxlIik7Ci0JCWlmIChpICUgMiA9PSAxKSBpdGVtLnNldFRleHQoIkRyb3AgdGV4dCIpOwotCX0KLQlEcmFnU291cmNlIGRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShsYWJlbDEsIERORC5EUk9QX0NPUFkpOwotCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCWRyYWdTb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJ0ZW1wIik7Ci0JCQkJZXZlbnQuZGF0YSA9IG5ldyBTdHJpbmdbXSB7ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX07Ci0JCQl9Ci0JCQlpZiAoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCWV2ZW50LmRhdGEgPSAib25jZSB1cG9uIGEgdGltZSI7Ci0JCQl9Ci0JCX0gCi0JfSk7Ci0JRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGFibGUsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9ERUZBVUxUKTsKLQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlkcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCUZpbGVUcmFuc2ZlciBmaWxlVHJhbnNmZXIgPSBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJVGV4dFRyYW5zZmVyIHRleHRUcmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgaXRlbUluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCWlmIChpdGVtSW5kZXggJSAyID09IDApIHsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCXdoaWxlIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJaWYgKGZpbGVUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2luZGV4XSkpIGJyZWFrOwotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCQlpZiAoaW5kZXggPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWV2ZW50LmN1cnJlbnREYXRhVHlwZSA9IGV2ZW50LmRhdGFUeXBlc1tpbmRleF07Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJd2hpbGUgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlpZiAodGV4dFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZXNbaW5kZXhdKSkgYnJlYWs7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCWlmIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2luZGV4XTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChmaWxlVHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCQlTdHJpbmdbXSBmaWxlcyA9IChTdHJpbmdbXSlldmVudC5kYXRhOwotCQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJaXRlbS5zZXRUZXh0KGZpbGVzWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGV4dFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKWV2ZW50LmRhdGE7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAxNTApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5Zjg4MDMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPEhUTUw+Ci0gIDxIRUFEPgotICAgIDxUSVRMRT5Qb3N0PC9USVRMRT4KLQk8cD5UZXN0IGZvciBQb3N0aW5nIERhdGEgaW4gSUU8L3A+Ci0KLSAgPC9IRUFEPgotCi0gIDxCT0RZPgotICAgIDxGT1JNIE1FVEhPRD0icG9zdCIKLSAgICAgICBBQ1RJT049Imh0dHA6Ly9ob3N0L2NnaS1iaW4vbWFzX2Zvcm0iPgotICAgIDxJTlBVVCBUWVBFPSJ0ZXh0IiBOQU1FPSJuYW1lIgotICAgICAgIFNJWkU9MjAgVkFMVUU9IlRyeSBpdCAocG9zdCkiPgotIDwvRk9STT4KLSAKLSAgPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjAyYzJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUmVhZGluZyBhbmQgd3JpdGluZyB0byBhIFNBRkVBUlJBWQotICogCi0gKiBUaGlzIGV4YW1wbGUgcmVhZHMgZnJvbSBhIFBvc3REYXRhIG9iamVjdCBpbiBhIEJlZm9yZU5hdmlnYXRlMiBldmVudCBhbmQKLSAqIGNyZWF0ZXMgYSBQb3N0RGF0YSBvYmplY3QgaW4gYSBjYWxsIHRvIE5hdmlnYXRlICgzMi1iaXQgd2luMzIgb25seSkuCi0gKiBOT1RFOiBUaGlzIHNuaXBwZXQgdXNlcyBpbnRlcm5hbCBTV1QgcGFja2FnZXMgdGhhdCBhcmUKLSAqIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4NiB7Ci0KLXN0YXRpYyBpbnQgQ29kZVBhZ2UgPSBPUy5HZXRBQ1AoKTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMSwgMSkpOwotCUJ1dHRvbiBnbyA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlnby5zZXRUZXh0KCJHbyIpOwotCU9sZUZyYW1lIG9sZUZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0Jb2xlRnJhbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JT2xlQXV0b21hdGlvbiBhdXRvbWF0aW9uOwotCXRyeSB7Ci0JCWNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCWF1dG9tYXRpb24gPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0JCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuOwotCX0KLQkKLQlmaW5hbCBPbGVBdXRvbWF0aW9uIGF1dG8gPSBhdXRvbWF0aW9uOwotCWdvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJU3RyaW5nIHVybCA9IHRleHQuZ2V0VGV4dCgpOwotCQkJaW50W10gcmdkaXNwaWQgPSBhdXRvLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwifSk7IAotCQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzFdOwotCQkJcmd2YXJnWzBdID0gbmV3IFZhcmlhbnQodXJsKTsKLQkJCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFsxXTsKLQkJCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07Ci0JCQlhdXRvLmludm9rZShkaXNwSWRNZW1iZXIsIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQl9Ci0JfSk7Ci0JCi0JCi0JLy8gUmVhZCBQb3N0RGF0YSB3aGVuZXZlciB3ZSBuYXZpZ2F0ZSB0byBhIHNpdGUgdGhhdCB1c2VzIGl0Ci0JaW50IEJlZm9yZU5hdmlnYXRlMiA9IDB4ZmE7Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihCZWZvcmVOYXZpZ2F0ZTIsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCVZhcmlhbnQgdXJsID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCQkJVmFyaWFudCBwb3N0RGF0YSA9IGV2ZW50LmFyZ3VtZW50c1s0XTsKLQkJCWlmIChwb3N0RGF0YSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQb3N0RGF0YSA9ICIrcmVhZFNhZmVBcnJheShwb3N0RGF0YSkrIiwgVVJMID0gIit1cmwuZ2V0U3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy8gTmF2aWdhdGUgdG8gdGhpcyB3ZWIgc2l0ZSB3aGljaCB1c2VzIHBvc3QgZGF0YSB0byBmaWxsIGluIHRoZSB0ZXh0IGZpZWxkCi0JLy8gYW5kIHB1dCB0aGUgc3RyaW5nICJoZWxsbyB3b3JsZCIgaW50byB0aGUgdGV4dCBib3gKLQl0ZXh0LnNldFRleHQoImZpbGU6Ly8iK1NuaXBwZXQxODYuY2xhc3MuZ2V0UmVzb3VyY2UoIlNuaXBwZXQxODYuaHRtbCIpLmdldEZpbGUoKSk7Ci0JaW50W10gcmdkaXNwaWQgPSBhdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJOYXZpZ2F0ZSIsICJVUkwiLCAiUG9zdERhdGEifSk7IAotCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsJCi0JVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzJdOwotCXJndmFyZ1swXSA9IG5ldyBWYXJpYW50KHRleHQuZ2V0VGV4dCgpKTsKLQlyZ3ZhcmdbMV0gPSB3cml0ZVNhZmVBcnJheSgiaGVsbG8gd29ybGQiKTsKLQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMl07Ci0JcmdkaXNwaWROYW1lZEFyZ3NbMF0gPSByZ2Rpc3BpZFsxXTsKLQlyZ2Rpc3BpZE5hbWVkQXJnc1sxXSA9IHJnZGlzcGlkWzJdOwotCWF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlciwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0JCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotLy8gVGhlIGZvbGxvd2luZyBzdHJ1Y3RzIGFyZSBhY2Nlc3NlZCBpbiB0aGUgcmVhZFNhZmVBcnJheSBhbmQgd3JpdGVTYWZlQXJyYXkKLS8vIGZ1bmN0aW9uczoKLS8vCi0vLyBWQVJJQU5UOgotLy8gCQlzaG9ydCB2dAotLy8gCQlzaG9ydCB3UmVzZXJ2ZWQxCi0vLyAJCXNob3J0IHdSZXNlcnZlZDIKLS8vIAkJc2hvcnQgd1Jlc2VydmVkMwotLy8gCQlpbnQgcGFycmF5Ci0vLwotLy8gU0FGRUFSUkFZOgotLy8gICAgICBzaG9ydCBjRGltcyAgICAgIC8vIENvdW50IG9mIGRpbWVuc2lvbnMgaW4gdGhpcyBhcnJheQotLy8gICAgICBzaG9ydCBmRmVhdHVyZXMgIC8vIEZsYWdzIHVzZWQgYnkgdGhlIFNhZmVBcnJheQotLy8gICAgICBpbnQgY2JFbGVtZW50cyAgIC8vIFNpemUgb2YgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkKLS8vICAgICAgaW50IGNMb2NrcyAgICAgICAvLyBOdW1iZXIgb2YgdGltZXMgdGhlIGFycmF5IGhhcyBiZWVuIGxvY2tlZCB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdW5sb2NrCi0vLyAgICAgIGludCBwdkRhdGEgICAgICAgLy8gUG9pbnRlciB0byB0aGUgZGF0YQotLy8gICAgICBTQUZFQVJSQVlCT1VORFtdIHJnc2Fib3VuZCAvLyBPbmUgYm91bmQgZm9yIGVhY2ggZGltZW5zaW9uCi0vLwotLy8gU0FGRUFSUkFZQk9VTkQ6Ci0vLyAgICAgIGludCBjRWxlbWVudHMgICAgLy8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZGltZW5zaW9uCi0vLyAgICAgIGludCBsTGJvdW5kICAgICAgLy8gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBkaW1lbnNpb24gCi0KLXN0YXRpYyBTdHJpbmcgcmVhZFNhZmVBcnJheShWYXJpYW50IHZhcmlhbnRCeVJlZikgewotCS8vIFJlYWQgYSBzYWZlYXJyYXkgdGhhdCBjb250YWlucyBkYXRhIG9mIAotCS8vIHR5cGUgVlRfVUkxICh1bnNpZ25lZCBzaG9ydHMpIHdoaWNoIGNvbnRhaW5zCi0JLy8gYSB0ZXh0IHN0cmVhbS4KLSAgICBpbnQgcFBvc3REYXRhID0gdmFyaWFudEJ5UmVmLmdldEJ5UmVmKCk7Ci0gICAgc2hvcnRbXSB2dF90eXBlID0gbmV3IHNob3J0WzFdOwotICAgIE9TLk1vdmVNZW1vcnkodnRfdHlwZSwgcFBvc3REYXRhLCAyKTsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAodnRfdHlwZVswXSA9PSAoc2hvcnQpKE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9WQVJJQU5UKSkgewotICAgICAgICBpbnRbXSBwVmFyaWFudCA9IG5ldyBpbnRbMV07Ci0gICAgICAgIE9TLk1vdmVNZW1vcnkocFZhcmlhbnQsIHBQb3N0RGF0YSArIDgsIDQpOwotICAgICAgICB2dF90eXBlID0gbmV3IHNob3J0WzFdOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KHZ0X3R5cGUsIHBWYXJpYW50WzBdLCAyKTsKLSAgICAgICAgaWYgKHZ0X3R5cGVbMF0gPT0gKHNob3J0KShPTEUuVlRfQVJSQVkgfCBPTEUuVlRfVUkxKSkgewotICAgICAgICAgICAgaW50W10gcFNhZmVhcnJheSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBTYWZlYXJyYXksIHBWYXJpYW50WzBdICsgOCwgNCk7Ci0gICAgICAgICAgICBzaG9ydFtdIGNEaW1zID0gbmV3IHNob3J0WzFdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShjRGltcywgcFNhZmVhcnJheVswXSwgMik7Ci0gICAgICAgICAgICBpbnRbXSBwdkRhdGEgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwdkRhdGEsIHBTYWZlYXJyYXlbMF0gKyAxMiwgNCk7Ci0gICAgICAgICAgICBpbnQgc2FmZWFycmF5Ym91bmRPZmZzZXQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjRGltc1swXTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50W10gY0VsZW1lbnRzID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KGNFbGVtZW50cywgcFNhZmVhcnJheVswXSArIDE2ICsgc2FmZWFycmF5Ym91bmRPZmZzZXQsIDQpOwotICAgICAgICAgICAgICAgIHNhZmVhcnJheWJvdW5kT2Zmc2V0ICs9IDg7Ci0gICAgICAgICAgICAgICAgaW50IGNjaFdpZGVDaGFyID0gT1MuTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ29kZVBhZ2UsIE9TLk1CX1BSRUNPTVBPU0VELCAgcHZEYXRhWzBdLCAtMSwgbnVsbCwgMCk7Ci0JCQkJaWYgKGNjaFdpZGVDaGFyID09IDApIHJldHVybiBudWxsOwotCQkJCWNoYXJbXSBscFdpZGVDaGFyU3RyID0gbmV3IGNoYXIgW2NjaFdpZGVDaGFyIC0gMV07Ci0JCQkJT1MuTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ29kZVBhZ2UsIE9TLk1CX1BSRUNPTVBPU0VELCAgcHZEYXRhWzBdLCAtMSwgbHBXaWRlQ2hhclN0ciwgbHBXaWRlQ2hhclN0ci5sZW5ndGgpOwotCQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcobHBXaWRlQ2hhclN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIFZhcmlhbnQgd3JpdGVTYWZlQXJyYXkgKFN0cmluZyBzdHJpbmcpIHsKLQkvLyBDcmVhdGUgYSBvbmUgZGltZW5zaW9uYWwgc2FmZWFycmF5IGNvbnRhaW5pbmcgdHdvIFZUX1VJMSB2YWx1ZXMKLQkvLyB3aGVyZSBWVF9VSTEgaXMgYW4gdW5zaWduZWQgY2hhcgotCQotCS8vIERlZmluZSBjRGltcywgZkZlYXR1cmVzIGFuZCBjYkVsZW1lbnRzCi0Jc2hvcnQgY0RpbXMgPSAxOwotCXNob3J0IEZBREZfRklYRURTSVpFID0gMHgxMDsKLQlzaG9ydCBGQURGX0hBVkVWQVJUWVBFID0gMHg4MDsKLQlzaG9ydCBmRmVhdHVyZXMgPSAoc2hvcnQpKEZBREZfRklYRURTSVpFIHwgRkFERl9IQVZFVkFSVFlQRSk7Ci0JaW50IGNiRWxlbWVudHMgPSAxOwotCS8vIENyZWF0ZSBhIHBvaW50ZXIgYW5kIGNvcHkgdGhlIGRhdGEgaW50byBpdAotCWludCBjb3VudCA9IHN0cmluZy5sZW5ndGgoKTsKLQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltjb3VudCArIDFdOwotCXN0cmluZy5nZXRDaGFycygwLCBjb3VudCwgY2hhcnMsIDApOwotCWludCBjY2hNdWx0aUJ5dGUgPSBPUy5XaWRlQ2hhclRvTXVsdGlCeXRlKENvZGVQYWdlLCAwLCBjaGFycywgLTEsIG51bGwsIDAsIG51bGwsIG51bGwpOwotCWlmIChjY2hNdWx0aUJ5dGUgPT0gMCkgcmV0dXJuIG51bGw7Ci0JaW50IHB2RGF0YSA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBjY2hNdWx0aUJ5dGUpOwotCU9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoQ29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgcHZEYXRhLCBjY2hNdWx0aUJ5dGUsIG51bGwsIG51bGwpOwotCWludCBjRWxlbWVudHMxID0gY2NoTXVsdGlCeXRlOwotCWludCBsTGJvdW5kMSA9IDA7Ci0JLy8gQ3JlYXRlIGEgc2FmZWFycmF5IGluIG1lbW9yeQotCS8vIDEyIGJ5dGVzIGZvciBjRGltcywgZkZlYXR1cmVzIGFuZCBjYkVsZW1lbnRzICsgNCBieXRlcyBmb3IgcHZEYXRhICsgbnVtYmVyIG9mIGRpbWVuc2lvbnMgKiAoc2l6ZSBvZiBzYWZlYXJyYXlib3VuZCkKLQlpbnQgc2l6ZW9mU2FmZUFycmF5ID0gMTIgKyA0ICsgMSo4OwotCWludCBwU2FmZUFycmF5ID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIHNpemVvZlNhZmVBcnJheSk7Ci0JLy8gQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBzYWZlIGFycmF5Ci0JaW50IG9mZnNldCA9IDA7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgc2hvcnRbXSB7Y0RpbXN9LCAyKTsgb2Zmc2V0ICs9IDI7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgc2hvcnRbXSB7ZkZlYXR1cmVzfSwgMik7IG9mZnNldCArPSAyOwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtjYkVsZW1lbnRzfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHswfSwgNCk7IG9mZnNldCArPSA0OwotCU9TLk1vdmVNZW1vcnkocFNhZmVBcnJheSArIG9mZnNldCwgbmV3IGludFtdIHtwdkRhdGF9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge2NFbGVtZW50czF9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge2xMYm91bmQxfSwgNCk7IG9mZnNldCArPSA0OwotCS8vIENyZWF0ZSBhIHZhcmlhbnQgaW4gbWVtb3J5IHRvIGhvbGQgdGhlIHNhZmVhcnJheQotCWludCBwVmFyaWFudCA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBWYXJpYW50LnNpemVvZik7Ci0Jc2hvcnQgdnQgPSAoc2hvcnQpKE9MRS5WVF9BUlJBWSB8IE9MRS5WVF9VSTEpOwotCU9TLk1vdmVNZW1vcnkocFZhcmlhbnQsIG5ldyBzaG9ydFtdIHt2dH0sIDIpOwotCU9TLk1vdmVNZW1vcnkocFZhcmlhbnQgKyA4LCBuZXcgaW50W117cFNhZmVBcnJheX0sIDQpOwotCS8vIENyZWF0ZSBhIGJ5IHJlZiB2YXJpYW50Ci0JVmFyaWFudCB2YXJpYW50QnlSZWYgPSBuZXcgVmFyaWFudChwVmFyaWFudCwgKHNob3J0KShPTEUuVlRfQllSRUYgfCBPTEUuVlRfVkFSSUFOVCkpOwotCXJldHVybiB2YXJpYW50QnlSZWY7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjI3NjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPEhUTUw+Ci0gIDxIRUFEPgotICAgIDxUSVRMRT5FdmFsdWF0ZTwvVElUTEU+Ci0JPHA+VGVzdCBmb3IgSUUgU2NyaXB0PC9wPgotICAgIDxTQ1JJUFQ+Ci0gICAgICBmdW5jdGlvbiBldmFsdWF0ZSh4KQotICAgICAgewotICAgICAgICAgYWxlcnQoImhlbGxvIikKLSAgICAgICAgIHJldHVybiBldmFsKHgpCi0gICAgICB9Ci0gICA8L1NDUklQVD4KLSAgPC9IRUFEPgotCi0gIDxCT0RZPgotICA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYjAxNjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBSdW5uaW5nIGEgc2NyaXB0IHdpdGhpbiBJRS4gKHdpbjMyIG9ubHkpCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODcgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCU9sZUNvbnRyb2xTaXRlIGNvbnRyb2xTaXRlOwotCXRyeSB7Ci0JCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gSVdlYkJyb3dzZXIKLQlmaW5hbCBPbGVBdXRvbWF0aW9uIHdlYkJyb3dzZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0KLQkvLyBXaGVuIHRoZSBkb2N1bWVudCBpcyBsb2FkZWQsIGFjY2VzcyB0aGUgZG9jdW1lbnQgb2JqZWN0IGZvciB0aGUgbmV3IHBhZ2UKLQkvLyBhbmQgZXZhbHV0ZSBleHByZXNzaW9uIHVzaW5nIFNjcmlwdC4KLQlpbnQgRG93bmxvYWRDb21wbGV0ZSA9IDEwNDsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKERvd25sb2FkQ29tcGxldGUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCWludFtdIGh0bWxEb2N1bWVudElEID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiRG9jdW1lbnQifSk7IAotCQkJaWYgKGh0bWxEb2N1bWVudElEID09IG51bGwpIHJldHVybjsKLQkJCVZhcmlhbnQgcFZhclJlc3VsdCA9IHdlYkJyb3dzZXIuZ2V0UHJvcGVydHkoaHRtbERvY3VtZW50SURbMF0pOwotCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkvL0lIVE1MRG9jdW1lbnQyCi0JCQlPbGVBdXRvbWF0aW9uIGh0bWxEb2N1bWVudCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWh0bWxEb2N1bWVudCA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCQkJCXBWYXJSZXN1bHQuZGlzcG9zZSgpOwotCQotCQkJCWludFtdIHNjcmlwdElEID0gaHRtbERvY3VtZW50LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJTY3JpcHQifSk7IAotCQkJCWlmIChzY3JpcHRJRCA9PSBudWxsKSByZXR1cm47Ci0JCQkJcFZhclJlc3VsdCA9IGh0bWxEb2N1bWVudC5nZXRQcm9wZXJ0eShzY3JpcHRJRFswXSk7Ci0JCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkJT2xlQXV0b21hdGlvbiBodG1sV2luZG93ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvL0lIVE1MV2luZG93MgotCQkJCQlodG1sV2luZG93ID0gcFZhclJlc3VsdC5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJCXBWYXJSZXN1bHQuZGlzcG9zZSgpOwotCQkJCQlpbnRbXSBldmFsdWF0ZUlEID0gaHRtbFdpbmRvdy5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ImV2YWx1YXRlIn0pOwotCQkJCQlpZiAoZXZhbHVhdGVJRCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCVN0cmluZyBleHByZXNzaW9uID0gIjUrTWF0aC5zaW4oOSkiOwotCQkJCQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoZXhwcmVzc2lvbil9OwotCQkJCQlwVmFyUmVzdWx0ID0gaHRtbFdpbmRvdy5pbnZva2UoZXZhbHVhdGVJRFswXSwgcmd2YXJnLCBudWxsKTsKLQkJCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihleHByZXNzaW9uKyIgPSIrcFZhclJlc3VsdC5nZXRTdHJpbmcoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaHRtbFdpbmRvdy5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlodG1sRG9jdW1lbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JLy8gTmF2aWdhdGUgdG8gYSB3ZWIgc2l0ZQotCWludFtdIGlkcyA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50W10ge25ldyBWYXJpYW50KCJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuaHRtbCIpfTsKLQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbXXtpZHNbMV19OwotCXdlYkJyb3dzZXIuaW52b2tlKGlkc1swXSwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQkvL1JlbWVtYmVyIHRvIHJlbGVhc2UgT2xlQXV0b21hdGlvbiBPYmplY3QKLQl3ZWJCcm93c2VyLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDQ0YzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFNjcm9sbCBhIHdpZGdldCBpbnRvIHZpZXcgb24gZm9jdXMgaW4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg4IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXNjLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOwotCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEwLCB0cnVlKSk7Ci0JZm9yIChpbnQgaSA9IDAgOyBpIDwgMzAwOyBpKyspIHsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJCdXR0b24gIitpKTsKLQl9Ci0Jc2Muc2V0Q29udGVudChjKTsKLQlzYy5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCXNjLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCXNjLnNldE1pblNpemUoYy5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlDb250cm9sIGNoaWxkID0gKENvbnRyb2wpZS53aWRnZXQ7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gY2hpbGQuZ2V0Qm91bmRzKCk7Ci0JCQlSZWN0YW5nbGUgYXJlYSA9IHNjLmdldENsaWVudEFyZWEoKTsKLQkJCVBvaW50IG9yaWdpbiA9IHNjLmdldE9yaWdpbigpOwotCQkJaWYgKG9yaWdpbi54ID4gYm91bmRzLngpIG9yaWdpbi54ID0gTWF0aC5tYXgoMCwgYm91bmRzLngpOwotCQkJaWYgKG9yaWdpbi55ID4gYm91bmRzLnkpIG9yaWdpbi55ID0gTWF0aC5tYXgoMCwgYm91bmRzLnkpOwotCQkJaWYgKG9yaWdpbi54ICsgYXJlYS53aWR0aCA8IGJvdW5kcy54ICsgYm91bmRzLndpZHRoKSBvcmlnaW4ueCA9IE1hdGgubWF4KDAsIGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gYXJlYS53aWR0aCk7Ci0JCQlpZiAob3JpZ2luLnkgKyBhcmVhLmhlaWdodCA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCkgb3JpZ2luLnkgPSBNYXRoLm1heCgwLCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLSBhcmVhLmhlaWdodCk7Ci0JCQlzYy5zZXRPcmlnaW4ob3JpZ2luKTsKLQkJfQotCX07Ci0JQ29udHJvbFtdIGNvbnRyb2xzID0gYy5nZXRDaGlsZHJlbigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJY29udHJvbHNbaV0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0JfQotCi0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDUwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMzBiMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogVGV4dCB3aXRoIHVuZGVybGluZSBhbmQgc3RyaWtlIHRocm91Z2gKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg5IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTdHlsZWRUZXh0IHdpdGggdW5kZXJsaW5lIGFuZCBzdHJpa2UgdGhyb3VnaCIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSBBQkNERUZHSElKS0xNIE5PUFFSU1RVVldYWVoiKTsKLQkvLyBtYWtlIDAxMjM0NTY3ODkgYXBwZWFyIHVuZGVybGluZWQKLQlTdHlsZVJhbmdlIHN0eWxlMSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUxLnN0YXJ0ID0gMDsKLQlzdHlsZTEubGVuZ3RoID0gMTA7Ci0Jc3R5bGUxLnVuZGVybGluZSA9IHRydWU7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMSk7Ci0JLy8gbWFrZSBBQkNERUZHSElKS0xNIGhhdmUgYSBzdHJpa2UgdGhyb3VnaAotCVN0eWxlUmFuZ2Ugc3R5bGUyID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTIuc3RhcnQgPSAxMTsKLQlzdHlsZTIubGVuZ3RoID0gMTM7Ci0Jc3R5bGUyLnN0cmlrZW91dCA9IHRydWU7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMik7Ci0JLy8gbWFrZSBOT1BRUlNUVVZXWFlaIGFwcGVhciB1bmRlcmxpbmVkIGFuZCBoYXZlIGEgc3RyaWtlIHRocm91Z2gKLQlTdHlsZVJhbmdlIHN0eWxlMyA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUzLnN0YXJ0ID0gMjU7Ci0Jc3R5bGUzLmxlbmd0aCA9IDEzOwotCXN0eWxlMy51bmRlcmxpbmUgPSB0cnVlOwotCXN0eWxlMy5zdHJpa2VvdXQgPSB0cnVlOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTMpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTY5MTY5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB2ZXJpZnkgaW5wdXQgKG9ubHkgYWxsb3cgZGlnaXRzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGV4dC5zZXRCb3VuZHMgKDEwLCAxMCwgMjAwLCAyMDApOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZS50ZXh0OwotCQkJY2hhciBbXSBjaGFycyA9IG5ldyBjaGFyIFtzdHJpbmcubGVuZ3RoICgpXTsKLQkJCXN0cmluZy5nZXRDaGFycyAoMCwgY2hhcnMubGVuZ3RoLCBjaGFycywgMCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoISgnMCcgPD0gY2hhcnMgW2ldICYmIGNoYXJzIFtpXSA8PSAnOScpKSB7Ci0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQ3MWM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBGbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gU3Bpbm5lcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTAgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlNwaW5uZXIgd2l0aCBmbG9hdCB2YWx1ZXMiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkvLyBhbGxvdyAzIGRlY2ltYWwgcGxhY2VzCi0Jc3Bpbm5lci5zZXREaWdpdHMoMyk7Ci0JLy8gc2V0IHRoZSBtaW5pbXVtIHZhbHVlIHRvIDAuMDAxCi0Jc3Bpbm5lci5zZXRNaW5pbXVtKDEpOwotCS8vIHNldCB0aGUgbWF4aW11bSB2YWx1ZSB0byAyMAotCXNwaW5uZXIuc2V0TWF4aW11bSgyMDAwMCk7Ci0JLy8gc2V0IHRoZSBpbmNyZW1lbnQgdmFsdWUgdG8gMC4wMTAKLQlzcGlubmVyLnNldEluY3JlbWVudCgxMCk7Ci0JLy8gc2V0IHRoZSBzZWxldGlvbiB0byAzLjQ1NgotCXNwaW5uZXIuc2V0U2VsZWN0aW9uKDM0NTYpOwotCXNwaW5uZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWludCBzZWxlY3Rpb24gPSBzcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJaW50IGRpZ2l0cyA9IHNwaW5uZXIuZ2V0RGlnaXRzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlbGVjdGlvbiBpcyAiKyhzZWxlY3Rpb24gLyBNYXRoLnBvdygxMCwgZGlnaXRzKSkpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmFjMWE2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIERldGVjdCB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgYSB0ZXh0IGNvbnRyb2wKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5MSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDMyOyBpKyspIHsKLQkJdGV4dC5hcHBlbmQgKGkgKyAiLVRoaXMgaXMgYSBsaW5lIG9mIHRleHQgaW4gYSB3aWRnZXQtIiArIGkgKyAiXG4iKTsKLQl9Ci0JdGV4dC5zZXRTZWxlY3Rpb24gKDApOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJaW50IGxhc3RJbmRleCA9IHRleHQuZ2V0VG9wSW5kZXggKCk7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlpbnQgaW5kZXggPSB0ZXh0LmdldFRvcEluZGV4ICgpOwotCQkJaWYgKGluZGV4ICE9IGxhc3RJbmRleCkgewotCQkJCWxhc3RJbmRleCA9IGluZGV4OwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNjcm9sbGVkLCB0b3BJbmRleD0iICsgaW5kZXgpOwotCQkJfQotCQl9Ci0JfTsKLQkvKiBOT1RFOiBPbmx5IGRldGVjdHMgc2Nyb2xsaW5nIGJ5IHRoZSB1c2VyICovCi0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5LZXlEb3duLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULktleVVwLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCVNjcm9sbEJhciBoQmFyID0gdGV4dC5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JaWYgKGhCYXIgIT0gbnVsbCkgewotCQloQmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JfQotCVNjcm9sbEJhciB2QmFyID0gdGV4dC5nZXRWZXJ0aWNhbEJhcigpOwotCWlmICh2QmFyICE9IG51bGwpIHsKLQkJdkJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCX0KLQlzaGVsbC5wYWNrICgpOwotCVBvaW50IHNpemUgPSBzaGVsbC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlzaGVsbC5zZXRTaXplIChzaXplLiB4IC0gMzIsIHNpemUueSAvIDIpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOGQ2ZDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogU2hvdyBhIHNvcnQgaW5kaWNhdG9yIGluIHRoZSBjb2x1bW4gaGVhZGVyCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5MiB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JLy8gaW5pdGlhbGl6ZSBkYXRhIHdpdGgga2V5cyBhbmQgcmFuZG9tIHZhbHVlcwotCWludCBzaXplID0gMTAwOwotCVJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0JZmluYWwgaW50W11bXSBkYXRhID0gbmV3IGludFtzaXplXVtdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQlkYXRhW2ldID0gbmV3IGludFtdIHtpLCByYW5kb20ubmV4dEludCgpfTsKLQl9Ci0JLy8gY3JlYXRlIGEgdmlydHVhbCB0YWJsZSB0byBkaXNwbGF5IGRhdGEKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZJUlRVQUwpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldEl0ZW1Db3VudChzaXplKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRUZXh0KCJLZXkiKTsKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjIuc2V0VGV4dCgiVmFsdWUiKTsKLQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBlLml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJaW50W10gZGF0dW0gPSBkYXRhW2luZGV4XTsKLQkJCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10ge0ludGVnZXIudG9TdHJpbmcoZGF0dW1bMF0pLAotCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGRhdHVtWzFdKSB9KTsKLQkJfQotCX0pOwotCS8vIEFkZCBzb3J0IGluZGljYXRvciBhbmQgc29ydCBkYXRhIHdoZW4gY29sdW1uIHNlbGVjdGVkCi0JTGlzdGVuZXIgc29ydExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkvLyBkZXRlcm1pbmUgbmV3IHNvcnQgY29sdW1uIGFuZCBkaXJlY3Rpb24KLQkJCVRhYmxlQ29sdW1uIHNvcnRDb2x1bW4gPSB0YWJsZS5nZXRTb3J0Q29sdW1uKCk7Ci0JCQlUYWJsZUNvbHVtbiBjdXJyZW50Q29sdW1uID0gKFRhYmxlQ29sdW1uKSBlLndpZGdldDsKLQkJCWludCBkaXIgPSB0YWJsZS5nZXRTb3J0RGlyZWN0aW9uKCk7Ci0JCQlpZiAoc29ydENvbHVtbiA9PSBjdXJyZW50Q29sdW1uKSB7Ci0JCQkJZGlyID0gZGlyID09IFNXVC5VUCA/IFNXVC5ET1dOIDogU1dULlVQOwotCQkJfSBlbHNlIHsKLQkJCQl0YWJsZS5zZXRTb3J0Q29sdW1uKGN1cnJlbnRDb2x1bW4pOwotCQkJCWRpciA9IFNXVC5VUDsKLQkJCX0KLQkJCS8vIHNvcnQgdGhlIGRhdGEgYmFzZWQgb24gY29sdW1uIGFuZCBkaXJlY3Rpb24KLQkJCWZpbmFsIGludCBpbmRleCA9IGN1cnJlbnRDb2x1bW4gPT0gY29sdW1uMSA/IDAgOiAxOwotCQkJZmluYWwgaW50IGRpcmVjdGlvbiA9IGRpcjsKLQkJCUFycmF5cy5zb3J0KGRhdGEsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJaW50W10gYSA9IChpbnRbXSkgYXJnMDsKLQkJCQkJaW50W10gYiA9IChpbnRbXSkgYXJnMTsKLQkJCQkJaWYgKGFbaW5kZXhdID09IGJbaW5kZXhdKSByZXR1cm4gMDsKLQkJCQkJaWYgKGRpcmVjdGlvbiA9PSBTV1QuVVApIHsKLQkJCQkJCXJldHVybiBhW2luZGV4XSA8IGJbaW5kZXhdID8gLTEgOiAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBhW2luZGV4XSA8IGJbaW5kZXhdID8gMSA6IC0xOwotCQkJCX0KLQkJCX0pOwotCQkJLy8gdXBkYXRlIGRhdGEgZGlzcGxheWVkIGluIHRhYmxlCi0JCQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKGRpcik7Ci0JCQl0YWJsZS5jbGVhckFsbCgpOwotCQl9Ci0JfTsKLQljb2x1bW4xLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNvcnRMaXN0ZW5lcik7Ci0JY29sdW1uMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzb3J0TGlzdGVuZXIpOwotCXRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1uMSk7Ci0JdGFibGUuc2V0U29ydERpcmVjdGlvbihTV1QuVVApOwotCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54LCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwYjY1YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGFsbG93IHVzZXIgdG8gcmVvcmRlciBjb2x1bW5zIGJ5IGRyYWdnaW5nIGFuZCBwcm9ncmFtbWF0aWNhbGx5LgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTMgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKLQkJZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuQ0hFQ0spOwotCQl0cmVlLnNldExheW91dERhdGEobmV3IFJvd0RhdGEoLTEsIDMwMCkpOwotCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDAiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuUklHSFQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gNCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQlTdHJpbmdbXSB0ZXh0ID0gbmV3IFN0cmluZ1tde2krIjowIiwgaSsiOjEiLCBpKyI6MiIsIGkrIjozIiwgaSsiOjQifTsKLQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIsIitqKyI6MCIsIGkrIiwiK2orIjoxIiwgaSsiLCIraisiOjIiLCBpKyIsIitqKyI6MyIsIGkrIiwiK2orIjo0In07Ci0JCQkJc3ViSXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNTsgaysrKSB7Ci0JCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCQl0ZXh0ID0gbmV3IFN0cmluZ1tde2krIiwiK2orIiwiK2srIjowIiwgaSsiLCIraisiLCIraysiOjEiLCBpKyIsIitqKyIsIitrKyI6MiIsIGkrIiwiK2orIiwiK2srIjozIiwgaSsiLCIraisiLCIraysiOjQifTsKLQkJCQkJc3Vic3ViSXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdmUgIitlLndpZGdldCk7Ci0JCQl9Ci0JCX07Ci0JCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uc1tpXS5zZXRXaWR0aCgxMDApOwotCQkJY29sdW1uc1tpXS5zZXRNb3ZlYWJsZSh0cnVlKTsKLQkJCWNvbHVtbnNbaV0uYWRkTGlzdGVuZXIoU1dULk1vdmUsIGxpc3RlbmVyKTsKLQkJfQotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJpbnZlcnQgY29sdW1uIG9yZGVyIik7Ci0JCWIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWludFtdIG9yZGVyID0gdHJlZS5nZXRDb2x1bW5PcmRlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoIC8gMjsgaSsrKSB7Ci0JCQkJCWludCB0ZW1wID0gb3JkZXJbaV07Ci0JCQkJCW9yZGVyW2ldID0gb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdOwotCQkJCQlvcmRlcltvcmRlci5sZW5ndGggLSBpIC0gMV0gPSB0ZW1wOwotCQkJCX0KLQkJCQl0cmVlLnNldENvbHVtbk9yZGVyKG9yZGVyKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NjI1M2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFdyaXRlIGFuIGFuaW1hdGVkIEdJRiB0byBhIGZpbGUuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5NCB7Ci0JRGlzcGxheSBkaXNwbGF5OwotCUNvbG9yIHdoaXRlLCByZWQsIGdyZWVuLCBibHVlOwotCVBhbGV0dGVEYXRhIHBhbGV0dGU7Ci0JRm9udCBmb250OwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgU25pcHBldDE5NCgpLnJ1bigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlSR0Igd2hpdGVSR0IgPSBuZXcgUkdCKDB4ZmYsIDB4ZmYsIDB4ZmYpOwotCQlSR0IgcmVkUkdCID0gbmV3IFJHQigweGZmLCAwLCAwKTsKLQkJUkdCIGdyZWVuUkdCID0gbmV3IFJHQigwLCAweGZmLCAwKTsKLQkJUkdCIGJsdWVSR0IgPSBuZXcgUkdCKDAsIDAsIDB4ZmYpOwotCQlwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7Ci0JCQkJd2hpdGVSR0IsCS8vIDAKLQkJCQlyZWRSR0IsCQkvLyAxCi0JCQkJZ3JlZW5SR0IsCS8vIDIKLQkJCQlibHVlUkdCIH0pOwkvLyAzCi0JCXdoaXRlID0gbmV3IENvbG9yKGRpc3BsYXksIHdoaXRlUkdCKTsKLQkJcmVkID0gbmV3IENvbG9yKGRpc3BsYXksIHJlZFJHQik7Ci0JCWdyZWVuID0gbmV3IENvbG9yKGRpc3BsYXksIGdyZWVuUkdCKTsKLQkJYmx1ZSA9IG5ldyBDb2xvcihkaXNwbGF5LCBibHVlUkdCKTsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJDb21pYyBTYW5zIE1TIiwgMjQsIFNXVC5CT0xEKTsKLQkJCi0JCUltYWdlRGF0YVtdIGRhdGEgPSBuZXcgSW1hZ2VEYXRhWzRdOwotCQlkYXRhWzBdID0gbmV3RnJhbWUoIiIsICB3aGl0ZSwgZmFsc2UsIDAsIDAsIDEwMSwgNTUsIFNXVC5ETV9GSUxMX05PTkUsIDQwKTsKLQkJZGF0YVsxXSA9IG5ld0ZyYW1lKCJTIiwgcmVkLCAgIHRydWUsICAwLCAwLCAgMzAsIDU1LCBTV1QuRE1fRklMTF9OT05FLCA0MCk7Ci0JCWRhdGFbMl0gPSBuZXdGcmFtZSgiVyIsIGdyZWVuLCB0cnVlLCAyOCwgMCwgIDM5LCA1NSwgU1dULkRNX0ZJTExfTk9ORSwgNDApOwotCQlkYXRhWzNdID0gbmV3RnJhbWUoIlQiLCBibHVlLCAgdHJ1ZSwgNjksIDAsICAzMiwgNTUsIFNXVC5ETV9GSUxMX0JBQ0tHUk9VTkQsIDIwMCk7Ci0JCQotCQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQkJbG9hZGVyLmRhdGEgPSBkYXRhOwotCQlsb2FkZXIuYmFja2dyb3VuZFBpeGVsID0gMDsKLQkJbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQgPSBkYXRhWzBdLmhlaWdodDsKLQkJbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCA9IGRhdGFbMF0ud2lkdGg7Ci0JCWxvYWRlci5yZXBlYXRDb3VudCA9IDA7IC8vIHJ1biBmb3JldmVyCi0JCWxvYWRlci5zYXZlKCJzd3QuZ2lmIiwgU1dULklNQUdFX0dJRik7Ci0KLQkJd2hpdGUuZGlzcG9zZSgpOwotCQlyZWQuZGlzcG9zZSgpOwotCQlncmVlbi5kaXNwb3NlKCk7Ci0JCWJsdWUuZGlzcG9zZSgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0JSW1hZ2VEYXRhIG5ld0ZyYW1lKFN0cmluZyBsZXR0ZXIsIENvbG9yIGNvbG9yLCBib29sZWFuIHRyYW5zcGFyZW50LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRpc3Bvc2FsTWV0aG9kLCBpbnQgZGVsYXlUaW1lKSB7Ci0JCUltYWdlRGF0YSB0ZW1wID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0LCAyLCBwYWxldHRlKTsgLy8gNC1jb2xvciBwYWxldHRlIGhhcyBkZXB0aCAyCi0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHRlbXApOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJZ2MuZHJhd1N0cmluZyhsZXR0ZXIsIDUsIDUpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCUltYWdlRGF0YSBmcmFtZSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCQlpZiAodHJhbnNwYXJlbnQpIGZyYW1lLnRyYW5zcGFyZW50UGl4ZWwgPSAwOyAvLyB3aGl0ZQotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZyYW1lLnggPSB4OwotCQlmcmFtZS55ID0geTsKLQkJZnJhbWUuZGlzcG9zYWxNZXRob2QgPSBkaXNwb3NhbE1ldGhvZDsKLQkJZnJhbWUuZGVsYXlUaW1lID0gZGVsYXlUaW1lOwotCQlyZXR1cm4gZnJhbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmZjZmM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIE9wZW5HTCBzbmlwcGV0OiB1c2UgTFdKR0wgdG8gZHJhdyB0byBhbiBTV1QgR0xDYW52YXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xEYXRhOwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuR0wxMTsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLkdMQ29udGV4dDsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLmdsdS5HTFU7Ci1pbXBvcnQgb3JnLmx3amdsLkxXSkdMRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE5NSB7Ci0Jc3RhdGljIHZvaWQgZHJhd1RvcnVzKGZsb2F0IHIsIGZsb2F0IFIsIGludCBuc2lkZXMsIGludCByaW5ncykgewotCQlmbG9hdCByaW5nRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gcmluZ3M7Ci0JCWZsb2F0IHNpZGVEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBuc2lkZXM7Ci0JCWZsb2F0IHRoZXRhID0gMC4wZiwgY29zVGhldGEgPSAxLjBmLCBzaW5UaGV0YSA9IDAuMGY7Ci0JCWZvciAoaW50IGkgPSByaW5ncyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlmbG9hdCB0aGV0YTEgPSB0aGV0YSArIHJpbmdEZWx0YTsKLQkJCWZsb2F0IGNvc1RoZXRhMSA9IChmbG9hdCkgTWF0aC5jb3ModGhldGExKTsKLQkJCWZsb2F0IHNpblRoZXRhMSA9IChmbG9hdCkgTWF0aC5zaW4odGhldGExKTsKLQkJCUdMMTEuZ2xCZWdpbihHTDExLkdMX1FVQURfU1RSSVApOwotCQkJZmxvYXQgcGhpID0gMC4wZjsKLQkJCWZvciAoaW50IGogPSBuc2lkZXM7IGogPj0gMDsgai0tKSB7Ci0JCQkJcGhpICs9IHNpZGVEZWx0YTsKLQkJCQlmbG9hdCBjb3NQaGkgPSAoZmxvYXQpIE1hdGguY29zKHBoaSk7Ci0JCQkJZmxvYXQgc2luUGhpID0gKGZsb2F0KSBNYXRoLnNpbihwaGkpOwotCQkJCWZsb2F0IGRpc3QgPSBSICsgciAqIGNvc1BoaTsKLQkJCQlHTDExLmdsTm9ybWFsM2YoY29zVGhldGExICogY29zUGhpLCAtc2luVGhldGExICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMMTEuZ2xWZXJ0ZXgzZihjb3NUaGV0YTEgKiBkaXN0LCAtc2luVGhldGExICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQkJR0wxMS5nbE5vcm1hbDNmKGNvc1RoZXRhICogY29zUGhpLCAtc2luVGhldGEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJR0wxMS5nbFZlcnRleDNmKGNvc1RoZXRhICogZGlzdCwgLXNpblRoZXRhICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQl9Ci0JCQlHTDExLmdsRW5kKCk7Ci0JCQl0aGV0YSA9IHRoZXRhMTsKLQkJCWNvc1RoZXRhID0gY29zVGhldGExOwotCQkJc2luVGhldGEgPSBzaW5UaGV0YTE7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29tcC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQkJZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotCQlmaW5hbCBHTENhbnZhcyBjYW52YXMgPSBuZXcgR0xDYW52YXMoY29tcCwgU1dULk5PTkUsIGRhdGEpOwotCi0JCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCXRyeSB7Ci0JCQlHTENvbnRleHQudXNlQ29udGV4dChjYW52YXMpOwotCQl9IGNhdGNoKExXSkdMRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotCi0JCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCQkJZmxvYXQgZkFzcGVjdCA9IChmbG9hdCkgYm91bmRzLndpZHRoIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJCQl9IGNhdGNoKExXSkdMRXhjZXB0aW9uIGUpIHsgZS5wcmludFN0YWNrVHJhY2UoKTsgfQotCQkJCUdMMTEuZ2xWaWV3cG9ydCgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkJCUdMMTEuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7Ci0JCQkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotCQkJCUdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLQkJCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX01PREVMVklFVyk7Ci0JCQkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotCQkJfQotCQl9KTsKLQotCQlHTDExLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wxMS5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMMTEuZ2xIaW50KEdMMTEuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTDExLkdMX05JQ0VTVCk7Ci0JCUdMMTEuZ2xDbGVhckRlcHRoKDEuMCk7Ci0JCUdMMTEuZ2xMaW5lV2lkdGgoMik7Ci0JCUdMMTEuZ2xFbmFibGUoR0wxMS5HTF9ERVBUSF9URVNUKTsKLQotCQlzaGVsbC5zZXRUZXh0KCJTV1QvTFdKR0wgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRTaXplKDY0MCwgNDgwKTsKLQkJc2hlbGwub3BlbigpOwotCi0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCWludCByb3QgPSAwOwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghY2FudmFzLmlzRGlzcG9zZWQoKSkgewotCQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCQl0cnkgewotCQkJCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJCQkJfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQkJCQkJR0wxMS5nbENsZWFyKEdMMTEuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMMTEuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCQkJCUdMMTEuZ2xDbGVhckNvbG9yKC4zZiwgLjVmLCAuOGYsIDEuMGYpOwotCQkJCQlHTDExLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJCUdMMTEuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0xMC4wZik7Ci0JCQkJCWZsb2F0IGZyb3QgPSByb3Q7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuMTVmICogcm90LCAyLjBmICogZnJvdCwgMTAuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJR0wxMS5nbFJvdGF0ZWYoMC4zZiAqIHJvdCwgMy4wZiAqIGZyb3QsIDEuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJcm90Kys7Ci0JCQkJCUdMMTEuZ2xQb2x5Z29uTW9kZShHTDExLkdMX0ZST05UX0FORF9CQUNLLCBHTDExLkdMX0xJTkUpOwotCQkJCQlHTDExLmdsQ29sb3IzZigwLjlmLCAwLjlmLCAwLjlmKTsKLQkJCQkJZHJhd1RvcnVzKDEsIDEuOWYgKyAoKGZsb2F0KSBNYXRoLnNpbigoMC4wMDRmICogZnJvdCkpKSwgMTUsIDE1KTsKLQkJCQkJY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA4MWQ0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB2ZXJpZnkgaW5wdXQKLSAqIEluIHRoaXMgY2FzZSBhIHBob25lIG51bWJlciBpcyB1c2VkLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTYgewotCS8qCi0JICogUGhvbmUgbnVtYmVycyBmb2xsb3cgdGhlIHJ1bGUgWyhdWzEtOV1bMS05XVsxLTldWyldWzEtOV1bMS05XVsxLTldWy1dWzEtOV1bMS05XVsxLTldWzEtOV0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVggPSAiWyhdXFxkezN9WyldXFxkezN9Wy1dXFxkezR9IjsgIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVtcGxhdGUgPSAiKCMjIykjIyMtIyMjIyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFRleHQgPSAiKDAwMCkwMDAtMDAwMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUik7Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIkNvdXJpZXIgTmV3IiwgMTAsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCXRleHQuc2V0Rm9udChmb250KTsKLQl0ZXh0LnNldFRleHQodGVtcGxhdGUpOwkKLQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lcigpIHsKLQkJLy9jcmVhdGUgdGhlIHBhdHRlcm4gZm9yIHZlcmlmaWNhdGlvbgotCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoUkVHRVgpOwkKLQkJLy9pZ25vcmUgZXZlbnQgd2hlbiBjYXVzZWQgYnkgaW5zZXJ0aW5nIHRleHQgaW5zaWRlIGV2ZW50IGhhbmRsZXIKLQkJYm9vbGVhbiBpZ25vcmU7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChpZ25vcmUpIHJldHVybjsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJaWYgKGUuc3RhcnQgPiAxMyB8fCBlLmVuZCA+IDE0KSByZXR1cm47Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihlLnRleHQpOwotCQkJCi0JCQkvL2hhbmRsZSBiYWNrc3BhY2UKLQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXGInKSB7Ci0JCQkJZm9yIChpbnQgaSA9IGUuc3RhcnQ7IGkgPCBlLmVuZDsgaSsrKSB7Ci0JCQkJCS8vIHNraXAgb3ZlciBzZXBhcmF0b3JzCi0JCQkJCXN3aXRjaCAoaSkgewotCQkJCQkJY2FzZSAwOiAKLQkJCQkJCQlpZiAoZS5zdGFydCArIDEgPT0gZS5lbmQpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJaWYgKGUuc3RhcnQgKyAxID09IGUuZW5kKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQobmV3IGNoYXIgW10geycjJywnKSd9KTsKLQkJCQkJCQkJZS5zdGFydC0tOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDg6Ci0JCQkJCQkJaWYgKGUuc3RhcnQgKyAxID09IGUuZW5kKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQobmV3IGNoYXIgW10geycjJywnLSd9KTsKLQkJCQkJCQkJZS5zdGFydC0tOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoJy0nKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OiBidWZmZXIuYXBwZW5kKCcjJyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCArIGJ1ZmZlci5sZW5ndGgoKSk7Ci0JCQkJaWdub3JlID0gdHJ1ZTsKLQkJCQl0ZXh0Lmluc2VydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQkJLy8gbW92ZSBjdXJzb3IgYmFja3dhcmRzIG92ZXIgc2VwYXJhdG9ycwotCQkJCWlmIChlLnN0YXJ0ID09IDUgfHwgZS5zdGFydCA9PSA5KSBlLnN0YXJ0LS07Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oZS5zdGFydCwgZS5zdGFydCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlTdHJpbmdCdWZmZXIgbmV3VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoZGVmYXVsdFRleHQpOwotCQkJY2hhcltdIGNoYXJzID0gZS50ZXh0LnRvQ2hhckFycmF5KCk7Ci0JCQlpbnQgaW5kZXggPSBlLnN0YXJ0IC0gMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZS50ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpbmRleCsrOwotCQkJCXN3aXRjaCAoaW5kZXgpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJaWYgKGNoYXJzW2ldID09ICcoJykgY29udGludWU7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNDoKLQkJCQkJCWlmIChjaGFyc1tpXSA9PSAnKScpIGNvbnRpbnVlOwotCQkJCQkJaW5kZXgrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDg6Ci0JCQkJCQlpZiAoY2hhcnNbaV0gPT0gJy0nKSBjb250aW51ZTsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGluZGV4ID49IG5ld1RleHQubGVuZ3RoKCkpIHJldHVybjsKLQkJCQluZXdUZXh0LnNldENoYXJBdChpbmRleCwgY2hhcnNbaV0pOwotCQkJfQotCQkJLy8gaWYgdGV4dCBpcyBzZWxlY3RlZCwgZG8gbm90IHBhc3RlIGJleW9uZCByYW5nZSBvZiBzZWxlY3Rpb24KLQkJCWlmIChlLnN0YXJ0IDwgZS5lbmQgJiYgaW5kZXggKyAxICE9IGUuZW5kKSByZXR1cm47Ci0JCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmV3VGV4dCk7Ci0JCQlpZiAobWF0Y2hlci5sb29raW5nQXQoKSkgewotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGluZGV4ICsgMSk7Ci0JCQkJaWdub3JlID0gdHJ1ZTsKLQkJCQl0ZXh0Lmluc2VydChuZXdUZXh0LnN1YnN0cmluZyhlLnN0YXJ0LCBpbmRleCArIDEpKTsKLQkJCQlpZ25vcmUgPSBmYWxzZTsKLQkJCX0JCQkKLQkJfQotCX0pOwotCQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNjA5YmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYXcgd3JhcHBlZCB0ZXh0IHVzaW5nIFRleHRMYXlvdXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTcgewotCWZpbmFsIHN0YXRpYyBTdHJpbmcgbG9uZ1N0cmluZyA9ICJUaGUgcHJlZmVycmVkIHNpemUgb2YgYSB3aWRnZXQgaXMgdGhlIG1pbmltdW0gc2l6ZSBuZWVkZWQgdG8gc2hvdyBpdHMgY29udGVudC4gSW4gdGhlIGNhc2Ugb2YgYSBDb21wb3NpdGUsIHRoZSBwcmVmZXJyZWQgc2l6ZSBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgYWxsIG9mIGl0cyBjaGlsZHJlbi4gSWYgY2hpbGRyZW4gaGF2ZSBiZWVuIHBvc2l0aW9uZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCB0aGUgQ29tcG9zaXRlIGNvbXB1dGVzIGl0cyBvd24gcHJlZmVycmVkIHNpemUgYmFzZWQgb24gdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIHRoZSBjaGlsZHJlbi4gSWYgYSBDb21wb3NpdGUgaXMgdXNpbmcgYSBsYXlvdXQgY2xhc3MgdG8gcG9zaXRpb24gaXRzIGNoaWxkcmVuLCBpdCBhc2tzIHRoZSBMYXlvdXQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBpdHMgY2xpZW50QXJlYSwgYW5kIHRoZW4gaXQgYWRkcyBpbiB0aGUgdHJpbSB0byBkZXRlcm1pbmUgaXRzIHByZWZlcnJlZCBzaXplLiI7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dC5zZXRUZXh0KGxvbmdTdHJpbmcpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuUGFpbnQ6Ci0JCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIDEwLCAxMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5SZXNpemU6Ci0JCQkJbGF5b3V0LnNldFdpZHRoKHNoZWxsLmdldFNpemUoKS54IC0gMjApOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjIxZmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIHBhdGggZnJvbSBzb21lIHRleHQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTggewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JRm9udERhdGEgZGF0YSA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDk2LCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCWZpbmFsIENvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pOwotCWZpbmFsIENvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlmaW5hbCBQYXRoIHBhdGg7Ci0JdHJ5IHsKLQkJcGF0aCA9IG5ldyBQYXRoKGRpc3BsYXkpOwotCQlwYXRoLmFkZFN0cmluZygiU1dUIiwgMCwgMCwgZm9udCk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJLy9BZHZhbmNlZCBHcmFwaGljcyBub3Qgc3VwcG9ydGVkLiAgCi0JCS8vVGhpcyBuZXcgQVBJIHJlcXVpcmVzIHRoZSBDYWlybyBWZWN0b3IgZW5naW5lIG9uIEdUSyBhbmQgTW90aWYgYW5kIEdESSsgb24gV2luZG93cy4KLQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewkJCQotCQkJR0MgZ2MgPSBlLmdjOwotCQkJZ2Muc2V0QmFja2dyb3VuZChncmVlbik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGJsdWUpOwotCQkJZ2MuZmlsbFBhdGgocGF0aCk7Ci0JCQlnYy5kcmF3UGF0aChwYXRoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCXBhdGguZGlzcG9zZSgpOwotCWZvbnQuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjZmODMxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaXN0ZW4gZm9yIGV2ZW50cyBpbiBFeGNlbCAod2luMzIgb25seSkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTkgewotCXN0YXRpYyBTdHJpbmcgSUlEX0FwcEV2ZW50cyA9ICJ7MDAwMjQ0MTMtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fSI7Ci0JLy8gRXZlbnQgSUQKLQlzdGF0aWMgaW50IE5ld1dvcmtib29rICAgICAgICAgICAgPSAweDAwMDAwNjFkOwotCXN0YXRpYyBpbnQgU2hlZXRTZWxlY3Rpb25DaGFuZ2UgICA9IDB4MDAwMDA2MTY7Ci0Jc3RhdGljIGludCBTaGVldEJlZm9yZURvdWJsZUNsaWNrID0gMHgwMDAwMDYxNzsKLQlzdGF0aWMgaW50IFNoZWV0QmVmb3JlUmlnaHRDbGljayAgPSAweDAwMDAwNjE4OwotCXN0YXRpYyBpbnQgU2hlZXRBY3RpdmF0ZSAgICAgICAgICA9IDB4MDAwMDA2MTk7Ci0Jc3RhdGljIGludCBTaGVldERlYWN0aXZhdGUgICAgICAgID0gMHgwMDAwMDYxYTsKLQlzdGF0aWMgaW50IFNoZWV0Q2FsY3VsYXRlICAgICAgICAgPSAweDAwMDAwNjFiOwotCXN0YXRpYyBpbnQgU2hlZXRDaGFuZ2UgICAgICAgICAgICA9IDB4MDAwMDA2MWM7Ci0Jc3RhdGljIGludCBXb3JrYm9va09wZW4gICAgICAgICAgID0gMHgwMDAwMDYxZjsKLQlzdGF0aWMgaW50IFdvcmtib29rQWN0aXZhdGUgICAgICAgPSAweDAwMDAwNjIwOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tEZWFjdGl2YXRlICAgICA9IDB4MDAwMDA2MjE7Ci0Jc3RhdGljIGludCBXb3JrYm9va0JlZm9yZUNsb3NlICAgID0gMHgwMDAwMDYyMjsKLQlzdGF0aWMgaW50IFdvcmtib29rQmVmb3JlU2F2ZSAgICAgPSAweDAwMDAwNjIzOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tCZWZvcmVQcmludCAgICA9IDB4MDAwMDA2MjQ7Ci0Jc3RhdGljIGludCBXb3JrYm9va05ld1NoZWV0ICAgICAgID0gMHgwMDAwMDYyNTsKLQlzdGF0aWMgaW50IFdvcmtib29rQWRkaW5JbnN0YWxsICAgPSAweDAwMDAwNjI2OwotCXN0YXRpYyBpbnQgV29ya2Jvb2tBZGRpblVuaW5zdGFsbCA9IDB4MDAwMDA2Mjc7Ci0Jc3RhdGljIGludCBXaW5kb3dSZXNpemUgICAgICAgICAgID0gMHgwMDAwMDYxMjsKLQlzdGF0aWMgaW50IFdpbmRvd0FjdGl2YXRlICAgICAgICAgPSAweDAwMDAwNjE0OwotCXN0YXRpYyBpbnQgV2luZG93RGVhY3RpdmF0ZSAgICAgICA9IDB4MDAwMDA2MTU7Ci0Jc3RhdGljIGludCBTaGVldEZvbGxvd0h5cGVybGluayAgID0gMHgwMDAwMDczZTsKLQotIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiRXhjZWwuU2hlZXQiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQlzaGVsbC5vcGVuKCk7Ci0KLQlPbGVBdXRvbWF0aW9uIGV4Y2VsU2hlZXQgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0JaW50W10gZGlzcElEcyA9IGV4Y2VsU2hlZXQuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyJBcHBsaWNhdGlvbiJ9KTsKLQlWYXJpYW50IHBWYXJSZXN1bHQgPSBleGNlbFNoZWV0LmdldFByb3BlcnR5KGRpc3BJRHNbMF0pOwotCU9sZUF1dG9tYXRpb24gYXBwbGljYXRpb24gPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQlwVmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQlleGNlbFNoZWV0LmRpc3Bvc2UoKTsKLQkKLQlpbnQgZXZlbnRJRCA9IFNoZWV0U2VsZWN0aW9uQ2hhbmdlOwotCU9sZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoT2xlRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gaGFzIGNoYW5nZWQiKTsKLQkJCS8vIHR3byBhcmd1bWVudHMgd2hpY2ggbXVzdCBiZSByZWxlYXNlZCAocm93IGFuZCBjb2x1bW4pCi0JCQlWYXJpYW50W10gYXJncyA9IGUuYXJndW1lbnRzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGFyZ3NbaV0pOwotCQkJCWFyZ3MgW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX07Ci0JY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihhcHBsaWNhdGlvbiwgSUlEX0FwcEV2ZW50cywgZXZlbnRJRCwgbGlzdGVuZXIpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlhcHBsaWNhdGlvbi5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU1YmQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBzb3J0IGEgdGFibGUgYnkgY29sdW1uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotICAgIGNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLSAgICBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgIGl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJhIiwgIjMifSk7Ci0gICAgaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiYiIsICIyIn0pOwotICAgIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImMiLCAiMSJ9KTsKLSAgICBjb2x1bW4xLnNldFdpZHRoKDEwMCk7Ci0gICAgY29sdW1uMi5zZXRXaWR0aCgxMDApOwotICAgIExpc3RlbmVyIHNvcnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IChUYWJsZUNvbHVtbillLndpZGdldDsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGNvbHVtbiA9PSBjb2x1bW4xID8gMCA6IDE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlMSA9IGl0ZW1zW2ldLmdldFRleHQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKXsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlMiA9IGl0ZW1zW2pdLmdldFRleHQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGF0b3IuY29tcGFyZSh2YWx1ZTEsIHZhbHVlMikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSB7aXRlbXNbaV0uZ2V0VGV4dCgwKSwgaXRlbXNbaV0uZ2V0VGV4dCgxKX07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGV4dCh2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIGNvbHVtbjEuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLSAgICBjb2x1bW4yLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNvcnRMaXN0ZW5lcik7Ci0gICAgdGFibGUuc2V0U29ydENvbHVtbihjb2x1bW4xKTsKLSAgICB0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7Ci0gICAgc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLngsIDMwMCk7Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZjBiZDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNvb2wgYmFyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29vbEJhciBiYXIgPSBuZXcgQ29vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTwyOyBpKyspIHsKLQkJQ29vbEl0ZW0gaXRlbSA9IG5ldyBDb29sSXRlbSAoYmFyLCBTV1QuTk9ORSk7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChiYXIsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCdXR0b24gIiArIGkpOwotCQlQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlpdGVtLnNldFByZWZlcnJlZFNpemUgKGl0ZW0uY29tcHV0ZVNpemUgKHNpemUueCwgc2l6ZS55KSk7Ci0JCWl0ZW0uc2V0Q29udHJvbCAoYnV0dG9uKTsKLQl9Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkNDNkYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRmlsbCBhIHNoYXBlIHdpdGggYSBwcmVkZWZpbmVkIHBhdHRlcm4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAwIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCS8vZGVmaW5lIGEgcGF0dGVybiBvbiBhbiBpbWFnZQotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwMDAsIDEwMDApOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlDb2xvciB5ZWxsb3cgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQlnYy5zZXRGb3JlZ3JvdW5kKHllbGxvdyk7Ci0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIDAsIDEwMDAsIDEwMDAsIHRydWUpOwotCWZvciAoaW50IGk9LTUwMDsgaTwxMDAwOyBpKz0xMCkgewotCQlnYy5zZXRGb3JlZ3JvdW5kKGJsdWUpOwotCQlnYy5kcmF3TGluZShpLCAwLCA1MDAgKyBpLCAxMDAwKTsKLQkJZ2MuZHJhd0xpbmUoNTAwICsgaSwgMCwgaSwgMTAwMCk7Ci0JfQkKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgUGF0dGVybiBwYXR0ZXJuOwotCXRyeSB7Ci0JCXBhdHRlcm4gPSBuZXcgUGF0dGVybihkaXNwbGF5LCBpbWFnZSk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJLy9BZHZhbmNlZCBHcmFwaGljcyBub3Qgc3VwcG9ydGVkLiAgCi0JCS8vVGhpcyBuZXcgQVBJIHJlcXVpcmVzIHRoZSBDYWlybyBWZWN0b3IgZW5naW5lIG9uIEdUSyBhbmQgTW90aWYgYW5kIEdESSsgb24gV2luZG93cy4KLQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQljLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIHIgPSAoKENvbXBvc2l0ZSlldmVudC53aWRnZXQpLmdldENsaWVudEFyZWEoKTsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQkJCWdjLmZpbGxPdmFsKDUsIDUsIHIud2lkdGggLSAxMCwgci5oZWlnaHQgLSAxMCk7CQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXBhdHRlcm4uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWExY2I3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBWaXJ0dWFsIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgd2l0aCAxLDAwMCwwMDAgaXRlbXMgKGxhenksIHBhZ2Ugc2l6ZSA2NCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjAxIHsKLQotc3RhdGljIGZpbmFsIGludCBQQUdFX1NJWkUgPSA2NDsKLXN0YXRpYyBmaW5hbCBpbnQgQ09VTlQgPSAxMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5WSVJUVUFMIHwgU1dULkJPUkRFUik7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YgKGl0ZW0pOwotCQkJaW50IHN0YXJ0ID0gaW5kZXggLyBQQUdFX1NJWkUgKiBQQUdFX1NJWkU7Ci0JCQlpbnQgZW5kID0gTWF0aC5taW4gKHN0YXJ0ICsgUEFHRV9TSVpFLCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpOwotCQkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKLQkJCQlpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0YWJsZS5zZXRMYXlvdXREYXRhIChuZXcgUm93RGF0YSAoMjAwLCAyMDApKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIkFkZCBJdGVtcyIpOwotCWZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMgKCk7Ci0JCQl0YWJsZS5zZXRJdGVtQ291bnQgKENPVU5UKTsKLQkJCWxvbmcgdDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMgKCk7Ci0JCQlsYWJlbC5zZXRUZXh0ICgiSXRlbXM6ICIgKyBDT1VOVCArICIsIFRpbWU6ICIgKyAodDIgLSB0MSkgKyAiIChtcykgW3BhZ2U9IiArIFBBR0VfU0laRSArICJdIik7Ci0JCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjkwNDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFZpcnR1YWwgVHJlZSBleGFtcGxlIHNuaXBwZXQ6IHBvcHVsYXRlIHRyZWUgbGF6aWx5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5WSVJUVUFMIHwgU1dULkJPUkRFUik7Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJVHJlZUl0ZW0gcGFyZW50SXRlbSA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJaWYgKHBhcmVudEl0ZW0gPT0gbnVsbCkgewotCQkJCXRleHQgPSAibm9kZSAiK3RyZWUuaW5kZXhPZihpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGV4dCA9IHBhcmVudEl0ZW0uZ2V0VGV4dCgpKyIgLSAiK3BhcmVudEl0ZW0uaW5kZXhPZihpdGVtKTsKLQkJCX0KLQkJCWl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCWl0ZW0uc2V0SXRlbUNvdW50KDEwKTsKLQkJfQotCX0pOwotCXRyZWUuc2V0SXRlbUNvdW50KDIwKTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjZkZTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2luZyBUZXh0TGF5b3V0IGp1c3RpZnksIGFsaWdubWVudCBhbmQgaW5kZW50IAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOwkKLQlzaGVsbC5zZXRUZXh0KCJJbmRlbnQsIEp1c3RpZnksIEFsaWduIik7Ci0JU3RyaW5nW10gdGV4dHMgPSB7Ci0JCSJQbGFucyBkbyBub3QgbWF0ZXJpYWxpemUgb3V0IG9mIG5vd2hlcmUsIG5vciBhcmUgdGhleSBlbnRpcmVseSBzdGF0aWMuIFRvIGVuc3VyZSB0aGUgcGxhbm5pbmcgcHJvY2VzcyBpcyB0cmFuc3BhcmVudCBhbmQgb3BlbiB0byB0aGUgZW50aXJlIEVjbGlwc2UgY29tbXVuaXR5LCB3ZSAodGhlIEVjbGlwc2UgUE1DKSBwb3N0IHBsYW5zIGluIGFuIGVtYnJ5b25pYyBmb3JtIGFuZCByZXZpc2UgdGhlbSB0aHJvdWdob3V0IHRoZSByZWxlYXNlIGN5Y2xlLiIsCi0JCSJUaGUgZmlyc3QgcGFydCBvZiB0aGUgcGxhbiBkZWFscyB3aXRoIHRoZSBpbXBvcnRhbnQgbWF0dGVycyBvZiByZWxlYXNlIGRlbGl2ZXJhYmxlcywgcmVsZWFzZSBtaWxlc3RvbmVzLCB0YXJnZXQgb3BlcmF0aW5nIGVudmlyb25tZW50cywgYW5kIHJlbGVhc2UtdG8tcmVsZWFzZSBjb21wYXRpYmlsaXR5LiBUaGVzZSBhcmUgYWxsIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgY2xlYXIgZm9yIGFueSByZWxlYXNlLCBldmVuIGlmIG5vIGZlYXR1cmVzIHdlcmUgdG8gY2hhbmdlLiIsCi0JCSJUaGUgcmVtYWluZGVyIG9mIHRoZSBwbGFuIGNvbnNpc3RzIG9mIHBsYW4gaXRlbXMgZm9yIHRoZSB2YXJpb3VzIEVjbGlwc2Ugc3VicHJvamVjdHMuIEVhY2ggcGxhbiBpdGVtIGNvdmVycyBhIGZlYXR1cmUgb3IgQVBJIHRoYXQgaXMgdG8gYmUgYWRkZWQgdG8gRWNsaXBzZSwgb3Igc29tZSBhc3BlY3Qgb2YgRWNsaXBzZSB0aGF0IGlzIHRvIGJlIGltcHJvdmVkLiBFYWNoIHBsYW4gaXRlbSBoYXMgaXRzIG93biBlbnRyeSBpbiB0aGUgRWNsaXBzZSBidWd6aWxsYSBkYXRhYmFzZSwgd2l0aCBhIHRpdGxlIGFuZCBhIGNvbmNpc2Ugc3VtbWFyeSAodXN1YWxseSBhIHNpbmdsZSBwYXJhZ3JhcGgpIHRoYXQgZXhwbGFpbnMgdGhlIHdvcmsgaXRlbSBhdCBhIHN1aXRhYmx5IGhpZ2ggZW5vdWdoIGxldmVsIHNvIHRoYXQgZXZlcnlvbmUgY2FuIHJlYWRpbHkgdW5kZXJzdGFuZCB3aGF0IHRoZSB3b3JrIGl0ZW0gaXMgd2l0aG91dCBoYXZpbmcgdG8gdW5kZXJzdGFuZCB0aGUgbml0dHktZ3JpdHR5IGRldGFpbC4iLAotCX07Ci0JaW50W10gYWxpZ25tZW50cyA9IHtTV1QuTEVGVCwgU1dULkNFTlRFUiwgU1dULlJJR0hUfTsKLQlmaW5hbCBUZXh0TGF5b3V0W10gbGF5b3V0cyA9IG5ldyBUZXh0TGF5b3V0W3RleHRzLmxlbmd0aF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXRzLmxlbmd0aDsgaSsrKSB7Ci0JCVRleHRMYXlvdXQgbGF5b3V0ID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JCWxheW91dC5zZXRUZXh0KHRleHRzW2ldKTsKLQkJbGF5b3V0LnNldEluZGVudCgzMCk7Ci0JCWxheW91dC5zZXRKdXN0aWZ5KHRydWUpOwotCQlsYXlvdXQuc2V0QWxpZ25tZW50KGFsaWdubWVudHNbaV0pOwkJCi0JCWxheW91dHNbaV0gPSBsYXlvdXQ7Ci0JfQotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQkJCWludCB3aWR0aCA9IHNoZWxsLmdldENsaWVudEFyZWEoKS53aWR0aCAtIDIgKiBwb2ludC54OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGV4dExheW91dCBsYXlvdXQgPSBsYXlvdXRzW2ldOwotCQkJCWxheW91dC5zZXRXaWR0aCh3aWR0aCk7Ci0JCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIHBvaW50LngsIHBvaW50LnkpOwotCQkJCXBvaW50LnkgKz0gbGF5b3V0LmdldEJvdW5kcygpLmhlaWdodCArIDEwOwotCQkJfQkJCQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGxheW91dHMubGVuZ3RoOyBpKyspIHsKLQkJbGF5b3V0c1tpXS5kaXNwb3NlKCk7CQkKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjYwOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0TGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNpbmcgdGhlIHJpc2UgZmllbGQgb2YgYSBUZXh0U3R5bGUuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA0IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0Jc2hlbGwuc2V0VGV4dCgiTW9kaWZ5IFJpc2UiKTsKLQlGb250RGF0YSBkYXRhID0gZGlzcGxheS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgMjQsIFNXVC5OT1JNQUwpOwotCUZvbnQgc21hbGxGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDgsIFNXVC5OT1JNQUwpOwotCUdDIGdjID0gbmV3IEdDKHNoZWxsKTsKLQlnYy5zZXRGb250KHNtYWxsRm9udCk7Ci0JRm9udE1ldHJpY3Mgc21hbGxNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmaW5hbCBpbnQgc21hbGxCYXNlbGluZSA9IHNtYWxsTWV0cmljcy5nZXRBc2NlbnQoKSArIHNtYWxsTWV0cmljcy5nZXRMZWFkaW5nKCk7Ci0JZ2Muc2V0Rm9udChmb250KTsKLQlGb250TWV0cmljcyBtZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmaW5hbCBpbnQgYmFzZWxpbmUgPSBtZXRyaWNzLmdldEFzY2VudCgpICsgbWV0cmljcy5nZXRMZWFkaW5nKCk7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCWZpbmFsIFRleHRMYXlvdXQgbGF5b3V0MCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dDAuc2V0VGV4dCgiU3Vic2NyaXB0U2NyaXB0U3VwZXJzY3JpcHQiKTsKLQlsYXlvdXQwLnNldEZvbnQoZm9udCk7Ci0JVGV4dFN0eWxlIHN1YnNjcmlwdDAgPSBuZXcgVGV4dFN0eWxlKHNtYWxsRm9udCwgbnVsbCwgbnVsbCk7Ci0JVGV4dFN0eWxlIHN1cGVyc2NyaXB0MCA9IG5ldyBUZXh0U3R5bGUoc21hbGxGb250LCBudWxsLCBudWxsKTsKLQlzdXBlcnNjcmlwdDAucmlzZSA9IGJhc2VsaW5lIC0gc21hbGxCYXNlbGluZTsKLQlsYXlvdXQwLnNldFN0eWxlKHN1YnNjcmlwdDAsIDAsIDgpOwotCWxheW91dDAuc2V0U3R5bGUoc3VwZXJzY3JpcHQwLCAxNSwgMjUpOwotCQkKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dDEgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQxLnNldFRleHQoIlN1YnNjcmlwdFNjcmlwdFN1cGVyc2NyaXB0Iik7Ci0JbGF5b3V0MS5zZXRGb250KGZvbnQpOwotCVRleHRTdHlsZSBzdWJzY3JpcHQxID0gbmV3IFRleHRTdHlsZShzbWFsbEZvbnQsIG51bGwsIG51bGwpOwotCXN1YnNjcmlwdDEucmlzZSA9IC1zbWFsbEJhc2VsaW5lOwotCVRleHRTdHlsZSBzdXBlcnNjcmlwdDEgPSBuZXcgVGV4dFN0eWxlKHNtYWxsRm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3VwZXJzY3JpcHQxLnJpc2UgPSBiYXNlbGluZTsKLQlsYXlvdXQxLnNldFN0eWxlKHN1YnNjcmlwdDEsIDAsIDgpOwotCWxheW91dDEuc2V0U3R5bGUoc3VwZXJzY3JpcHQxLCAxNSwgMjUpOwotCQotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gZXZlbnQuZGlzcGxheTsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkKLQkJCVJlY3RhbmdsZSByZWN0MCA9IGxheW91dDAuZ2V0Qm91bmRzKCk7Ci0JCQlyZWN0MC54ICs9IDEwOwotCQkJcmVjdDAueSArPSAxMDsKLQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdDApOwotCQkJbGF5b3V0MC5kcmF3KGdjLCByZWN0MC54LCByZWN0MC55KTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSkpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDAueCwgcmVjdDAueSwgcmVjdDAueCArIHJlY3QwLndpZHRoLCByZWN0MC55KTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QwLngsIHJlY3QwLnkgKyBiYXNlbGluZSwgcmVjdDAueCArIHJlY3QwLndpZHRoLCByZWN0MC55ICsgYmFzZWxpbmUpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDAueCArIHJlY3QwLndpZHRoIC8gMiwgcmVjdDAueSwgcmVjdDAueCArIHJlY3QwLndpZHRoIC8gMiwgcmVjdDAueSArIHJlY3QwLmhlaWdodCk7Ci0JCQkKLQkJCVJlY3RhbmdsZSByZWN0MSA9IGxheW91dDEuZ2V0Qm91bmRzKCk7Ci0JCQlyZWN0MS54ICs9IDEwOwotCQkJcmVjdDEueSArPSAyMCArIHJlY3QwLmhlaWdodDsKLQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdDEpOwkJCQotCQkJbGF5b3V0MS5kcmF3KGdjLCByZWN0MS54LCByZWN0MS55KTsKLQkJCQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9NQUdFTlRBKSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MS54LCByZWN0MS55ICsgc21hbGxCYXNlbGluZSwgcmVjdDEueCArIHJlY3QxLndpZHRoLCByZWN0MS55ICsgc21hbGxCYXNlbGluZSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MS54LCByZWN0MS55ICsgYmFzZWxpbmUgKyBzbWFsbEJhc2VsaW5lLCByZWN0MS54ICsgcmVjdDEud2lkdGgsIHJlY3QxLnkgKyBiYXNlbGluZSArIHNtYWxsQmFzZWxpbmUpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDEueCArIHJlY3QxLndpZHRoIC8gMiwgcmVjdDEueSwgcmVjdDEueCArIHJlY3QxLndpZHRoIC8gMiwgcmVjdDEueSArIHJlY3QxLmhlaWdodCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWxheW91dDAuZGlzcG9zZSgpOwotCWxheW91dDEuZGlzcG9zZSgpOwotCXNtYWxsRm9udC5kaXNwb3NlKCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGYxMzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiB1c2luZyB0aGUgR2x5cGhNZXRyaWNzIHRvIGVtYmVkZGVkIGltYWdlcyBpbiAKLSAqIGEgVGV4dExheW91dC4gCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDUgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQlzaGVsbC5zZXRUZXh0KCJFbWJlZGRpbmcgb2JqZWN0cyBpbiB0ZXh0Iik7Ci0JZmluYWwgSW1hZ2VbXSBpbWFnZXMgPSB7bmV3IEltYWdlKGRpc3BsYXksIDMyLCAzMiksIG5ldyBJbWFnZShkaXNwbGF5LCAyMCwgNDApLCBuZXcgSW1hZ2UoZGlzcGxheSwgNDAsIDIwKX07Ci0JaW50W10gY29sb3JzICA9IHtTV1QuQ09MT1JfQkxVRSwgU1dULkNPTE9SX01BR0VOVEEsIFNXVC5DT0xPUl9HUkVFTn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2VzW2ldKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKGNvbG9yc1tpXSkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlc1tpXS5nZXRCb3VuZHMoKSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIik7Ci0JYnV0dG9uLnBhY2soKTsKLQlTdHJpbmcgdGV4dCA9ICJIZXJlIGlzIHNvbWUgdGV4dCB3aXRoIGEgYmx1ZSBpbWFnZSBcdUZGRkMsIGEgbWFnZW50YSBpbWFnZSBcdUZGRkMsIGEgZ3JlZW4gaW1hZ2UgXHVGRkZDLCBhbmQgYSBidXR0b246IFx1RkZGQy4iOwotCWZpbmFsIGludFtdIGltYWdlT2Zmc2V0cyA9IHszNiwgNTUsIDcyfTsKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dC5zZXRUZXh0KHRleHQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBpbWFnZXNbaV0uZ2V0Qm91bmRzKCk7Ci0JCVRleHRTdHlsZSBpbWFnZVN0eWxlID0gbmV3IFRleHRTdHlsZShudWxsLCBudWxsLCBudWxsKTsKLQkJaW1hZ2VTdHlsZS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcyhib3VuZHMuaGVpZ2h0LCAwLCBib3VuZHMud2lkdGgpOyAKLQkJbGF5b3V0LnNldFN0eWxlKGltYWdlU3R5bGUsIGltYWdlT2Zmc2V0c1tpXSwgaW1hZ2VPZmZzZXRzW2ldKTsKLQl9Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IGJ1dHRvbi5nZXRCb3VuZHMoKTsKLQlUZXh0U3R5bGUgYnV0dG9uU3R5bGUgPSBuZXcgVGV4dFN0eWxlKG51bGwsIG51bGwsIG51bGwpOwotCWJ1dHRvblN0eWxlLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKGJvdW5kcy5oZWlnaHQsIDAsIGJvdW5kcy53aWR0aCk7IAotCWZpbmFsIGludCBidXR0b25PZmZzZXQgPSB0ZXh0Lmxlbmd0aCgpIC0gMjsKLQlsYXlvdXQuc2V0U3R5bGUoYnV0dG9uU3R5bGUsIGJ1dHRvbk9mZnNldCwgYnV0dG9uT2Zmc2V0KTsKLQkKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQlQb2ludCBtYXJnaW4gPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQkJCWxheW91dC5zZXRXaWR0aChzaGVsbC5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAyICogbWFyZ2luLngpOwotCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIG1hcmdpbi54LCBtYXJnaW4ueSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCWludCBvZmZzZXQgPSBpbWFnZU9mZnNldHNbaV07Ci0JCQkJaW50IGxpbmVJbmRleCA9IGxheW91dC5nZXRMaW5lSW5kZXgob2Zmc2V0KTsKLQkJCQlGb250TWV0cmljcyBsaW5lTWV0cmljcyA9IGxheW91dC5nZXRMaW5lTWV0cmljcyhsaW5lSW5kZXgpOwotCQkJCVBvaW50IHBvaW50ID0gbGF5b3V0LmdldExvY2F0aW9uKG9mZnNldCwgZmFsc2UpOwotCQkJCUdseXBoTWV0cmljcyBnbHlwaE1ldHJpY3MgPSBsYXlvdXQuZ2V0U3R5bGUob2Zmc2V0KS5tZXRyaWNzOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZXNbaV0sIHBvaW50LnggKyBtYXJnaW4ueCwgcG9pbnQueSArIG1hcmdpbi55ICsgbGluZU1ldHJpY3MuZ2V0QXNjZW50KCkgLSBnbHlwaE1ldHJpY3MuYXNjZW50KTsKLQkJCX0KLQkJCWludCBsaW5lSW5kZXggPSBsYXlvdXQuZ2V0TGluZUluZGV4KGJ1dHRvbk9mZnNldCk7Ci0JCQlGb250TWV0cmljcyBsaW5lTWV0cmljcyA9IGxheW91dC5nZXRMaW5lTWV0cmljcyhsaW5lSW5kZXgpOwotCQkJUG9pbnQgcG9pbnQgPSBsYXlvdXQuZ2V0TG9jYXRpb24oYnV0dG9uT2Zmc2V0LCBmYWxzZSk7Ci0JCQlHbHlwaE1ldHJpY3MgZ2x5cGhNZXRyaWNzID0gbGF5b3V0LmdldFN0eWxlKGJ1dHRvbk9mZnNldCkubWV0cmljczsKLQkJCWJ1dHRvbi5zZXRMb2NhdGlvbihwb2ludC54ICsgbWFyZ2luLngsIHBvaW50LnkgKyBtYXJnaW4ueSArIGxpbmVNZXRyaWNzLmdldEFzY2VudCgpIC0gZ2x5cGhNZXRyaWNzLmFzY2VudCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JbGF5b3V0LmRpc3Bvc2UoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlpbWFnZXNbaV0uZGlzcG9zZSgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYjUwMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnV0dG9uIGV4YW1wbGUgc25pcHBldDogYSBCdXR0b24gd2l0aCB0ZXh0IGFuZCBpbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24iKTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTA5MGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBVc2UgdHJhbnNmb3JtYXRpb24gbWF0cmljZXMgdG8gcmVmbGVjdCwgcm90YXRlIGFuZCBzaGVhciBpbWFnZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwNyB7CQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCi0JCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDExMCwgNjApOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJUaW1lcyIsIDMwLCBTV1QuQk9MRCk7Ci0JCWdjLnNldEZvbnQoZm9udCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTEwLCA2MCk7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJZ2MuZHJhd1RleHQoIlNXVCIsIDEwLCAxMCwgdHJ1ZSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCQotCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiTWF0cml4IFRyYW5mb3JtYXRpb25zIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5ET1VCTEVfQlVGRkVSRUQpOwotCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7CQotCQkJCUdDIGdjID0gZS5nYzsKLQkJCQlnYy5zZXRBZHZhbmNlZCh0cnVlKTsKLQkJCQlpZiAoIWdjLmdldEFkdmFuY2VkKCkpewotCQkJCQlnYy5kcmF3VGV4dCgiQWR2YW5jZWQgZ3JhcGhpY3Mgbm90IHN1cHBvcnRlZCIsIDMwLCAzMCwgdHJ1ZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gT3JpZ2luYWwgaW1hZ2UKLQkJCQlpbnQgeCA9IDMwLCB5ID0gMzA7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCB5KTsgCi0JCQkJeCArPSByZWN0LndpZHRoICsgMzA7Ci0JCQkJCi0JCQkJVHJhbnNmb3JtIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oZGlzcGxheSk7Ci0JCQkJCi0JCQkJLy8gTm90ZSB0aGF0IHRoZSB0cmFuZm9ybSBpcyBhcHBsaWVkIHRvIHRoZSB3aG9sZSBHQyB0aGVyZWZvcmUKLQkJCQkvLyB0aGUgY29vcmRpbmF0ZXMgbmVlZCB0byBiZSBhZGp1c3RlZCB0b28uCi0JCQkJCi0JCQkJLy8gUmVmbGVjdCBhcm91bmQgdGhlIHkgYXhpcy4KLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoLTEsIDAsIDAsIDEsIDAgLDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgLTEqeC1yZWN0LndpZHRoLCB5KTsKLQkJCQkKLQkJCQl4ID0gMzA7IHkgKz0gcmVjdC5oZWlnaHQgKyAzMDsKLQkJCQkKLQkJCQkvLyBSZWZsZWN0IGFyb3VuZCB0aGUgeCBheGlzLiAKLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoMSwgMCwgMCwgLTEsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgeCwgLTEqeS1yZWN0LmhlaWdodCk7Ci0JCQkJCi0JCQkJeCArPSByZWN0LndpZHRoICsgMzA7Ci0JCQkJCi0JCQkJLy8gUmVmbGVjdCBhcm91bmQgdGhlIHggYW5kIHkgYXhlcwkKLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoLTEsIDAsIDAsIC0xLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIC0xKngtcmVjdC53aWR0aCwgLTEqeS1yZWN0LmhlaWdodCk7Ci0JCQkJCi0JCQkJeCA9IDMwOyB5ICs9IHJlY3QuaGVpZ2h0ICsgMzA7Ci0JCQkJCi0JCQkJLy8gU2hlYXIgaW4gdGhlIHgtZGlyZWN0aW9uCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKDEsIDAsIC0xLCAxLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDMwMCwgeSk7Ci0JCQkJCi0JCQkJLy8gU2hlYXIgaW4geS1kaXJlY3Rpb24KLQkJCQl0cmFuc2Zvcm0uc2V0RWxlbWVudHMoMSwgLTEsIDAsIDEsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMTUwLCA0NzUpOwotCQkJCQotCQkJCS8vIFJvdGF0ZSBieSA0NSBkZWdyZWVzCQotCQkJCWZsb2F0IGNvczQ1ID0gKGZsb2F0KU1hdGguY29zKDQ1KTsKLQkJCQlmbG9hdCBzaW40NSA9IChmbG9hdClNYXRoLnNpbig0NSk7Ci0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKGNvczQ1LCBzaW40NSwgLXNpbjQ1LCBjb3M0NSwgMCwgMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAzNTAsIDEwMCk7Ci0JCQkJCi0JCQkJdHJhbnNmb3JtLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5zZXRTaXplKDM1MCwgNTUwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQkKLQotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4ODY1Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENoYW5nZSBodWUsIHNhdHVyYXRpb24gYW5kIGJyaWdodG5lc3Mgb2YgYSBjb2xvcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwOCB7CSAKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSgweGZmLCAweGZmMDAsIDB4ZmYwMDAwKTsJCi0JCi0JLy8gSW1hZ2VEYXRhIHNob3dpbmcgdmFyaWF0aW9ucyBvZiBodWUJCi0JSW1hZ2VEYXRhIGh1ZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDM2MCwgMTAwLCAyNCwgcGFsZXR0ZSk7CQotCWZsb2F0IGh1ZSA9IDA7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCBodWVEYXRhLndpZHRoOyB4KyspIHsKLQkJZm9yIChpbnQgeSA9IDA7IHkgPCBodWVEYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlpbnQgcGl4ZWwgPSBwYWxldHRlLmdldFBpeGVsKG5ldyBSR0IoaHVlLCAxZiwgMWYpKTsKLQkJCWh1ZURhdGEuc2V0UGl4ZWwoeCwgeSwgcGl4ZWwpOwotCQl9Ci0JCWh1ZSArPSAzNjBmIC8gaHVlRGF0YS53aWR0aDsKLQl9Ci0KLQkvLyBJbWFnZURhdGEgc2hvd2luZyBzYXR1cmF0aW9uIG9uIHggYXhpcyBhbmQgYnJpZ2h0bmVzcyBvbiB5IGF4aXMKLQlJbWFnZURhdGEgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhID0gbmV3IEltYWdlRGF0YSgzNjAsIDM2MCwgMjQsIHBhbGV0dGUpOwotCWZsb2F0IHNhdHVyYXRpb24gPSAwZjsKLQlmbG9hdCBicmlnaHRuZXNzID0gMWY7Ci0JZm9yIChpbnQgeCA9IDA7IHggPCBzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEud2lkdGg7IHgrKykgewotCQlicmlnaHRuZXNzID0gMWY7Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLmhlaWdodDsgeSsrKSB7Ci0JCQlpbnQgcGl4ZWwgPSBwYWxldHRlLmdldFBpeGVsKG5ldyBSR0IoMzYwZiwgc2F0dXJhdGlvbiwgYnJpZ2h0bmVzcykpOwkKLQkJCXNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbCk7Ci0JCQlicmlnaHRuZXNzIC09IDFmIC8gc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLmhlaWdodDsKLQkJfQotCQlzYXR1cmF0aW9uICs9IDFmIC8gc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLndpZHRoOwotCX0KLQkJCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBodWVJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBodWVEYXRhKTsKLQlJbWFnZSBzYXR1cmF0aW9uSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJIdWUsIFNhdHVyYXRpb24sIEJyaWdodG5lc3MiKTsKLQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAxNjsKLQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7CQkKLQkKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0SW1hZ2UoaHVlSW1hZ2UpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDIsIDEpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CQotCQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsgLy9zcGFjZXIKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCgiSHVlIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOyAvL3NwYWNlcgotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTEVGVCk7Ci0JbGFiZWwuc2V0VGV4dCgiQnJpZ2h0bmVzcyIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0SW1hZ2Uoc2F0dXJhdGlvbkltYWdlKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOyAvL3NwYWNlcgotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsKLQlsYWJlbC5zZXRUZXh0KCJTYXR1cmF0aW9uIik7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHsKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCX0KLQlodWVJbWFnZS5kaXNwb3NlKCk7Ci0Jc2F0dXJhdGlvbkltYWdlLmRpc3Bvc2UoKTsJCi0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTI1MDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgT3BlbkdMIHNuaXBwZXQ6IHVzZSBKT0dMIHRvIGRyYXcgdG8gYW4gU1dUIEdMQ2FudmFzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTENhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMRGF0YTsKLQotaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTDsKLWltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xDb250ZXh0OwotaW1wb3J0IGphdmF4Lm1lZGlhLm9wZW5nbC5HTERyYXdhYmxlRmFjdG9yeTsKLWltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuZ2x1LkdMVTsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDkgewotCXN0YXRpYyB2b2lkIGRyYXdUb3J1cyhHTCBnbCwgZmxvYXQgciwgZmxvYXQgUiwgaW50IG5zaWRlcywgaW50IHJpbmdzKSB7Ci0JCWZsb2F0IHJpbmdEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyByaW5nczsKLQkJZmxvYXQgc2lkZURlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIG5zaWRlczsKLQkJZmxvYXQgdGhldGEgPSAwLjBmLCBjb3NUaGV0YSA9IDEuMGYsIHNpblRoZXRhID0gMC4wZjsKLQkJZm9yIChpbnQgaSA9IHJpbmdzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWZsb2F0IHRoZXRhMSA9IHRoZXRhICsgcmluZ0RlbHRhOwotCQkJZmxvYXQgY29zVGhldGExID0gKGZsb2F0KSBNYXRoLmNvcyh0aGV0YTEpOwotCQkJZmxvYXQgc2luVGhldGExID0gKGZsb2F0KSBNYXRoLnNpbih0aGV0YTEpOwotCQkJZ2wuZ2xCZWdpbihHTC5HTF9RVUFEX1NUUklQKTsKLQkJCWZsb2F0IHBoaSA9IDAuMGY7Ci0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJZ2wuZ2xOb3JtYWwzZihjb3NUaGV0YTEgKiBjb3NQaGksIC1zaW5UaGV0YTEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJZ2wuZ2xWZXJ0ZXgzZihjb3NUaGV0YTEgKiBkaXN0LCAtc2luVGhldGExICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQkJZ2wuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCWdsLmdsVmVydGV4M2YoY29zVGhldGEgKiBkaXN0LCAtc2luVGhldGEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCX0KLQkJCWdsLmdsRW5kKCk7Ci0JCQl0aGV0YSA9IHRoZXRhMTsKLQkJCWNvc1RoZXRhID0gY29zVGhldGExOwotCQkJc2luVGhldGEgPSBzaW5UaGV0YTE7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29tcC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQkJZGF0YS5kb3VibGVCdWZmZXIgPSB0cnVlOwotCQlmaW5hbCBHTENhbnZhcyBjYW52YXMgPSBuZXcgR0xDYW52YXMoY29tcCwgU1dULk5PTkUsIGRhdGEpOwotCi0JCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCWZpbmFsIEdMQ29udGV4dCBjb250ZXh0ID0gR0xEcmF3YWJsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmNyZWF0ZUV4dGVybmFsR0xDb250ZXh0KCk7Ci0KLQkJY2FudmFzLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNhbnZhcy5nZXRCb3VuZHMoKTsKLQkJCQlmbG9hdCBmQXNwZWN0ID0gKGZsb2F0KSBib3VuZHMud2lkdGggLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQljb250ZXh0Lm1ha2VDdXJyZW50KCk7Ci0JCQkJR0wgZ2wgPSBjb250ZXh0LmdldEdMICgpOwotCQkJCWdsLmdsVmlld3BvcnQoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCQlnbC5nbE1hdHJpeE1vZGUoR0wuR0xfUFJPSkVDVElPTik7Ci0JCQkJZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCQlHTFUgZ2x1ID0gbmV3IEdMVSgpOwotCQkJCWdsdS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgZkFzcGVjdCwgMC41ZiwgNDAwLjBmKTsKLQkJCQlnbC5nbE1hdHJpeE1vZGUoR0wuR0xfTU9ERUxWSUVXKTsKLQkJCQlnbC5nbExvYWRJZGVudGl0eSgpOwotCQkJCWNvbnRleHQucmVsZWFzZSgpOwotCQkJfQotCQl9KTsKLQotCQljb250ZXh0Lm1ha2VDdXJyZW50KCk7Ci0JCUdMIGdsID0gY29udGV4dC5nZXRHTCAoKTsKLQkJZ2wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlnbC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCWdsLmdsSGludChHTC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCWdsLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlnbC5nbExpbmVXaWR0aCgyKTsKLQkJZ2wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCWNvbnRleHQucmVsZWFzZSgpOwotCi0JCXNoZWxsLnNldFRleHQoIlNXVC9KT0dMIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0U2l6ZSg2NDAsIDQ4MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlpbnQgcm90ID0gMDsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQkJY29udGV4dC5tYWtlQ3VycmVudCgpOwotCQkJCQlHTCBnbCA9IGNvbnRleHQuZ2V0R0wgKCk7Ci0JCQkJCWdsLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQkJCQlnbC5nbENsZWFyQ29sb3IoLjNmLCAuNWYsIC44ZiwgMS4wZik7Ci0JCQkJCWdsLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJCWdsLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTAuMGYpOwotCQkJCQlmbG9hdCBmcm90ID0gcm90OwotCQkJCQlnbC5nbFJvdGF0ZWYoMC4xNWYgKiByb3QsIDIuMGYgKiBmcm90LCAxMC4wZiAqIGZyb3QsIDEuMGYpOwotCQkJCQlnbC5nbFJvdGF0ZWYoMC4zZiAqIHJvdCwgMy4wZiAqIGZyb3QsIDEuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJcm90Kys7Ci0JCQkJCWdsLmdsUG9seWdvbk1vZGUoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0xJTkUpOwotCQkJCQlnbC5nbENvbG9yM2YoMC45ZiwgMC45ZiwgMC45Zik7Ci0JCQkJCWRyYXdUb3J1cyhnbCwgMSwgMS45ZiArICgoZmxvYXQpIE1hdGguc2luKCgwLjAwNGYgKiBmcm90KSkpLCAxNSwgMTUpOwotCQkJCQljYW52YXMuc3dhcEJ1ZmZlcnMoKTsKLQkJCQkJY29udGV4dC5yZWxlYXNlKCk7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiYTAwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDYW52YXMgZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgdGFiIHRyYXZlcnNhbCAoYmVoYXZlIGxpa2UgYSB0YWIgZ3JvdXApCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlmaW5hbCBDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlCdXR0b24gYiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRCb3VuZHMgKDEwLCAxMCwgMTAwLCAzMik7Ci0JYi5zZXRUZXh0ICgiQnV0dG9uIik7Ci0Jc2hlbGwuc2V0RGVmYXVsdEJ1dHRvbiAoYik7Ci0JZmluYWwgQ2FudmFzIGMgPSBuZXcgQ2FudmFzIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYy5zZXRCb3VuZHMgKDEwLCA1MCwgMTAwLCAzMik7Ci0JYy5hZGRMaXN0ZW5lciAoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCS8qIERvIHRhYiBncm91cCB0cmF2ZXJzYWwgKi8KLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9ORVhUOgkKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVM6Ci0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9ORVhUOgkKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTOgotCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0pOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c0luLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJYy5zZXRCYWNrZ3JvdW5kIChyZWQpOwotCQl9Ci0JfSk7Ci0JYy5hZGRMaXN0ZW5lciAoU1dULkZvY3VzT3V0LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJYy5zZXRCYWNrZ3JvdW5kIChibHVlKTsKLQkJfQotCX0pOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5LZXlEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiS0VZIik7Ci0JCQlmb3IgKGludCBpPTA7IGk8NjQ7IGkrKykgewotCQkJCUNvbG9yIGMxID0gcmVkLCBjMiA9IGJsdWU7Ci0JCQkJaWYgKGMuaXNGb2N1c0NvbnRyb2wgKCkpIHsKLQkJCQkJYzEgPSBibHVlOyAgYzIgPSByZWQ7Ci0JCQkJfQotCQkJCWMuc2V0QmFja2dyb3VuZCAoYzEpOwotCQkJCWMudXBkYXRlICgpOwotCQkJCWMuc2V0QmFja2dyb3VuZCAoYzIpOwotCQkJfQotCQl9Ci0JfSk7Ci0JVGV4dCB0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JdC5zZXRCb3VuZHMgKDEwLCA4NSwgMTAwLCAzMik7Ci0KLQlUZXh0IHIgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCXIuc2V0Qm91bmRzICgxMCwgMTIwLCAxMDAsIDMyKTsKLQkKLQljLnNldEZvY3VzICgpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTZhNjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgdGV4dCBiZXR3ZWVuIHR3byBTdHlsZWRUZXh0IHdpZGdldHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTAgewotCXN0YXRpYyBTdHJpbmcgc3RyaW5nMSA9ICJBIGRyYWcgc291cmNlIGlzIHRoZSBwcm92aWRlciBvZiBkYXRhIGluIGEgRHJhZyBhbmQgRHJvcCBkYXRhIHRyYW5zZmVyIGFzIHdlbGwgYXMgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgb3JpZ2luYXRvciBvZiB0aGUgRHJhZyBhbmQgRHJvcCBvcGVyYXRpb24uIFRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBkcmFnIHNvdXJjZSAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heSBiZSB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGxvY2F0aW9uIGluIHRoZSBzYW1lIHdpZGdldCwgdG8gYSBkaWZmZXJlbnQgd2lkZ2V0ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLCBvciB0byBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBhbHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIGRyYWcgdGV4dCBmcm9tIHlvdXIgYXBwbGljYXRpb24gYW5kIGRyb3AgaXQgb24gYW4gZW1haWwgYXBwbGljYXRpb24sIG9yIHlvdSAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIGRyYWcgYW4gaXRlbSBpbiBhIHRyZWUgYW5kIGRyb3AgaXQgYmVsb3cgYSBkaWZmZXJlbnQgbm9kZSBpbiB0aGUgc2FtZSB0cmVlLiI7Ci0KLQlzdGF0aWMgU3RyaW5nIHN0cmluZzIgPSAiQSBkcm9wIHRhcmdldCByZWNlaXZlcyBkYXRhIGluIGEgRHJhZyBhbmQgRHJvcCBvcGVyYXRpb24uIFRoZSBkYXRhIHJlY2VpdmVkIGJ5ICIrCi0JICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBkcm9wIHRhcmdldCBtYXkgaGF2ZSBjb21lIGZyb20gdGhlIHNhbWUgd2lkZ2V0LCBmcm9tIGEgZGlmZmVyZW50IHdpZGdldCB3aXRoaW4gIisKLQkgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHNhbWUgYXBwbGljYXRpb24sIG9yIGZyb20gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gYWx0b2dldGhlci4gRm9yIGV4YW1wbGUsIHlvdSAiKwotCSAgICAgICAgICAgICAgICAgICAgICAgICJjYW4gZHJhZyB0ZXh0IGZyb20gYW4gZW1haWwgYXBwbGljYXRpb24gYW5kIGRyb3AgaXQgb24geW91ciBhcHBsaWNhdGlvbiwgb3IgeW91IGNvdWxkICIrCi0JICAgICAgICAgICAgICAgICAgICAgICAgImRyYWcgYW4gaXRlbSBpbiBhIHRyZWUgYW5kIGRyb3AgaXQgYmVsb3cgYSBkaWZmZXJlbnQgbm9kZSBpbiB0aGUgc2FtZSB0cmVlLiI7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWludCBzdHlsZSA9IFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUjsKLQlmaW5hbCBTdHlsZWRUZXh0IHRleHQxID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIHN0eWxlKTsKLQl0ZXh0MS5zZXRUZXh0KHN0cmluZzEpOwotCURyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UodGV4dDEsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0JCVBvaW50IHNlbGVjdGlvbjsKLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JCQlzZWxlY3Rpb24gPSB0ZXh0MS5nZXRTZWxlY3Rpb24oKTsKLQkJCWUuZG9pdCA9IHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55OwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JCQllLmRhdGEgPSB0ZXh0MS5nZXRUZXh0KHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueS0xKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJdGV4dDEucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueCwgIiIpOwotCQkJfQotCQkJc2VsZWN0aW9uID0gbnVsbDsKLQkJfQotCX0pOwotCQotCWZpbmFsIFN0eWxlZFRleHQgdGV4dDIgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgc3R5bGUpOwotCXRleHQyLnNldFRleHQoc3RyaW5nMik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0ZXh0MiwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWUuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZS5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQkJCXRleHQyLmluc2VydCgoU3RyaW5nKWUuZGF0YSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzg1OThjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgU3R5bGVkVGV4dCBzbmlwcGV0OiB1c2UgcmlzZSBhbmQgZm9udCB3aXRoIFN0eWxlUmFuZ2UuIAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTEgewotCi0Jc3RhdGljIFN0cmluZyB0ZXh0ID0gCi0JCSJZb3UgY2FuIHNldCBhbnkgZm9udCB5b3Ugd2FudCBpbiBhIHJhbmdlLiBZb3UgY2FuIGFsc28gc2V0IGEgYmFzZWxpbmUgcmlzZSBhbmQgYWxsIG90aGVyIG9sZCBmZWF0dXJlcyIgKyAKLQkJIiBsaWtlIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQsIGFuZCBtaXggdGhlbSBhbnkgd2F5IHlvdSB3YW50LiBUb3RhbGx5IGF3ZXNvbWUuIjsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQlGb250RGF0YSBkYXRhID0gc3R5bGVkVGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJRm9udCBmb250MSA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCBkYXRhLmdldEhlaWdodCgpICogMiwgZGF0YS5nZXRTdHlsZSgpKTsKLQkJRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCBkYXRhLmdldEhlaWdodCgpICogNCAvIDUsIGRhdGEuZ2V0U3R5bGUoKSk7Ci0JCVN0eWxlUmFuZ2VbXSBzdHlsZXMgPSBuZXcgU3R5bGVSYW5nZVs4XTsKLQkJc3R5bGVzWzBdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzBdLmZvbnQgPSBmb250MTsgCi0JCXN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1sxXS5yaXNlID0gZGF0YS5nZXRIZWlnaHQoKSAvIDM7IAotCQlzdHlsZXNbMl0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbMl0uYmFja2dyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsgCi0JCXN0eWxlc1szXSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1szXS5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSk7IAotCQlzdHlsZXNbNF0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbNF0uZm9udCA9IGZvbnQyOyAKLQkJc3R5bGVzWzRdLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTs7Ci0JCXN0eWxlc1s0XS51bmRlcmxpbmUgPSB0cnVlOwotCQlzdHlsZXNbNV0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbNV0ucmlzZSA9IC1kYXRhLmdldEhlaWdodCgpIC8gMzsgCi0JCXN0eWxlc1s1XS5zdHJpa2VvdXQgPSB0cnVlOwotCQlzdHlsZXNbNV0udW5kZXJsaW5lID0gdHJ1ZTsKLQkJc3R5bGVzWzZdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzZdLmZvbnQgPSBmb250MTsgCi0JCXN0eWxlc1s2XS5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKTsKLQkJc3R5bGVzWzZdLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQkJc3R5bGVzWzddID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzddLnJpc2UgPSAgZGF0YS5nZXRIZWlnaHQoKSAvIDM7Ci0JCXN0eWxlc1s3XS51bmRlcmxpbmUgPSB0cnVlOwotCQlzdHlsZXNbN10uZm9udFN0eWxlID0gU1dULkJPTEQ7Ci0JCXN0eWxlc1s3XS5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJc3R5bGVzWzddLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCQotCQlpbnRbXSByYW5nZXMgPSBuZXcgaW50W10gezE2LCA0LCA2MSwgMTMsIDEwNywgMTAsIDEyMiwgMTAsIDEzNCwgMywgMTQzLCA2LCAxNjAsIDcsIDE2OCwgN307Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZXMocmFuZ2VzLCBzdHlsZXMpOwotCQkKLQkJc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZm9udDEuZGlzcG9zZSgpOwotCQlmb250Mi5kaXNwb3NlKCk7CQkKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmVmM2I3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotLyoqCi0gKiBTdHlsZWRUZXh0IHNuaXBwZXQ6IGVtYmVkIGltYWdlcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyMTIgewotCQotCXN0YXRpYyBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0Jc3RhdGljIFN0cmluZyB0ZXh0ID0gCi0JCSJUaGlzIHNuaXBwZXQgc2hvd3MgaG93IHRvIGVtYmVkIGltYWdlcyBpbiBhIFN0eWxlZFRleHQuXG4iKwotCQkiSGVyZSBpcyBvbmU6IFx1RkZGQywgYW5kIGhlcmUgaXMgYW5vdGhlcjogXHVGRkZDLiIrCi0JCSJVc2UgdGhlIGFkZCBidXR0b24gdG8gYWRkIGFuIGltYWdlIGZyb20geW91ciBmaWxlc3lzdGVtIHRvIHRoZSBTdHlsZWRUZXh0IGF0IHRoZSBjdXJyZW50IGNhcmV0IG9mZnNldC4iOwotCXN0YXRpYyBJbWFnZVtdIGltYWdlczsKLQlzdGF0aWMgaW50W10gb2Zmc2V0czsKLQotCXN0YXRpYyB2b2lkIGFkZEltYWdlKEltYWdlIGltYWdlLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSAoKTsKLQkJc3R5bGUuc3RhcnQgPSBvZmZzZXQ7Ci0JCXN0eWxlLmxlbmd0aCA9IDE7Ci0JCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCXN0eWxlLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKHJlY3QuaGVpZ2h0LCAwLCByZWN0LndpZHRoKTsKLQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJaW1hZ2VzID0gbmV3IEltYWdlW10gewotCQkJZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9RVUVTVElPTiksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKSwKLQkJfTsKLQkJb2Zmc2V0cyA9IG5ldyBpbnRbaW1hZ2VzLmxlbmd0aF07Ci0JCWludCBsYXN0T2Zmc2V0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBvZmZzZXQgPSB0ZXh0LmluZGV4T2YoIlx1RkZGQyIsIGxhc3RPZmZzZXQpOwotCQkJb2Zmc2V0c1tpXSA9IG9mZnNldDsKLQkJCWFkZEltYWdlKGltYWdlc1tpXSwgb2Zmc2V0KTsKLQkJCWxhc3RPZmZzZXQgPSBvZmZzZXQgKyAxOwotCQl9Ci0JCQotCQkvLyB1c2UgYSB2ZXJpZnkgbGlzdGVuZXIgdG8ga2VlcCB0aGUgb2Zmc2V0cyB1cCB0byBkYXRlCi0JCXN0eWxlZFRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobmV3IFZlcmlmeUxpc3RlbmVyKCkgIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZSkgewotCQkJCWludCBzdGFydCA9IGUuc3RhcnQ7Ci0JCQkJaW50IHJlcGxhY2VDaGFyQ291bnQgPSBlLmVuZCAtIGUuc3RhcnQ7Ci0JCQkJaW50IG5ld0NoYXJDb3VudCA9IGUudGV4dC5sZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IG9mZnNldCA9IG9mZnNldHNbaV07Ci0JCQkJCWlmIChzdGFydCA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgc3RhcnQgKyByZXBsYWNlQ2hhckNvdW50KSB7Ci0JCQkJCQkvLyB0aGlzIGltYWdlIGlzIGJlaW5nIGRlbGV0ZWQgZnJvbSB0aGUgdGV4dAotCQkJCQkJaWYgKGltYWdlc1tpXSAhPSBudWxsICYmICFpbWFnZXNbaV0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJaW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLQkJCQkJCQlpbWFnZXNbaV0gPSBudWxsOwotCQkJCQkJfQotCQkJCQkJb2Zmc2V0ID0gLTE7Ci0JCQkJCX0KLQkJCQkJaWYgKG9mZnNldCAhPSAtMSAmJiBvZmZzZXQgPj0gc3RhcnQpIG9mZnNldCArPSBuZXdDaGFyQ291bnQgLSByZXBsYWNlQ2hhckNvdW50OwotCQkJCQlvZmZzZXRzW2ldID0gb2Zmc2V0OwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXN0eWxlZFRleHQuYWRkUGFpbnRPYmplY3RMaXN0ZW5lcihuZXcgUGFpbnRPYmplY3RMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50T2JqZWN0KFBhaW50T2JqZWN0RXZlbnQgZXZlbnQpIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBldmVudC5zdHlsZTsKLQkJCQlpbnQgc3RhcnQgPSBzdHlsZS5zdGFydDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IG9mZnNldCA9IG9mZnNldHNbaV07Ci0JCQkJCWlmIChzdGFydCA9PSBvZmZzZXQpIHsKLQkJCQkJCUltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJCQkJaW50IHggPSBldmVudC54OwotCQkJCQkJaW50IHkgPSBldmVudC55ICsgZXZlbnQuYXNjZW50IC0gc3R5bGUubWV0cmljcy5hc2NlbnQ7CQkJCQkJCi0JCQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQWRkIEltYWdlIik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCQkJU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZmlsZW5hbWUpOwotCQkJCQkJaW50IG9mZnNldCA9IHN0eWxlZFRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZShvZmZzZXQsIDAsICJcdUZGRkMiKTsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQl3aGlsZSAoaW5kZXggPCBvZmZzZXRzLmxlbmd0aCkgewotCQkJCQkJCWlmIChvZmZzZXRzW2luZGV4XSA9PSAtMSAmJiBpbWFnZXNbaW5kZXhdID09IG51bGwpIGJyZWFrOwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW5kZXggPT0gb2Zmc2V0cy5sZW5ndGgpIHsKLQkJCQkJCQlpbnRbXSB0bXBPZmZzZXRzID0gbmV3IGludFtpbmRleCArIDFdOwotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkob2Zmc2V0cywgMCwgdG1wT2Zmc2V0cywgMCwgb2Zmc2V0cy5sZW5ndGgpOwotCQkJCQkJCW9mZnNldHMgPSB0bXBPZmZzZXRzOwotCQkJCQkJCUltYWdlW10gdG1wSW1hZ2VzID0gbmV3IEltYWdlW2luZGV4ICsgMV07Ci0JCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbWFnZXMsIDAsIHRtcEltYWdlcywgMCwgaW1hZ2VzLmxlbmd0aCk7Ci0JCQkJCQkJaW1hZ2VzID0gdG1wSW1hZ2VzOwotCQkJCQkJfQotCQkJCQkJb2Zmc2V0c1tpbmRleF0gPSBvZmZzZXQ7Ci0JCQkJCQlpbWFnZXNbaW5kZXhdID0gaW1hZ2U7Ci0JCQkJCQlhZGRJbWFnZShpbWFnZSwgb2Zmc2V0KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCUltYWdlIGltYWdlID0gaW1hZ2VzW2ldOwotCQkJaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRGlzcG9zZWQoKSkgewotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWI0MzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNXVCBTdHlsZWRUZXh0IHNuaXBwZXQ6IHVzZSBpbmRlbnQsIGFsaWdubWVudCBhbmQganVzdGlmeS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxMyB7Ci0KLQlzdGF0aWMgU3RyaW5nIHRleHQgPSAKLQkJIlRoZSBmaXJzdCBwYXJhZ3JhcGggaGFzIGFuIGluZGVudGF0aW9uIG9mIGZpZnR5IHBpeGVscy4gSW5kZW50YXRpb24gaXMgdGhlIGFtb3VudCBvZiB3aGl0ZSBzcGFjZSBpbiBmcm9udCBvZiB0aGUgZmlyc3QgbGluZSBvZiBhIHBhcmFncmFwaC4gSWYgdGhpcyBwYXJhZ3JhcGggd3JhcHMgdG8gc2V2ZXJhbCBsaW5lcyB5b3Ugc2hvdWxkIHNlZSB0aGUgaW5kZW50YXRpb24gb25seSBvbiB0aGUgZmlyc3QgbGluZS5cblxuIiArCi0JCSJUaGUgc2Vjb25kIHBhcmFncmFwaCBpcyBjZW50ZXIgYWxpZ25lZC4gQWxpZ25tZW50IG9ubHkgd29ya3Mgd2hlbiB0aGUgU3R5bGVkVGV4dCBpcyB1c2luZyB3b3JkIHdyYXAuIEFsaWdubWVudCwgYXMgd2l0aCBhbGwgb3RoZXIgbGluZSBhdHRyaWJ1dGVzLCBjYW4gYmUgc2V0IGZvciB0aGUgd2hvbGUgd2lkZ2V0IG9yIGp1c3QgZm9yIGEgc2V0IG9mIGxpbmVzLlxuXG4iICsKLQkJIlRoZSB0aGlyZCBwYXJhZ3JhcGggaXMganVzdGlmaWVkLiBMaWtlIGFsaWdubWVudCwganVzdGlmeSBvbmx5IHdvcmtzIHdoZW4gdGhlIFN0eWxlZFRleHQgaXMgdXNpbmcgd29yZCB3cmFwLiBJZiB0aGUgcGFyYWdyYXBoIHdyYXBzIHRvIHNldmVyYWwgbGluZXMsIHRoZSBqdXN0aWZpY2F0aW9uIGlzIHBlcmZvcm1lZCBvbiBhbGwgbGluZXMgYnV0IHRoZSBsYXN0IG9uZS5cblxuIiArCQkKLQkJIlRoZSBsYXN0IHBhcmFncmFwaCBpcyBqdXN0aWZpZWQgYW5kIHJpZ2h0IGFsaWduZWQuIEluIHRoaXMgY2FzZSwgdGhlIGFsaWdubWVudCBpcyBvbmx5IG5vdGljZWFibGUgaW4gdGhlIGZpbmFsIGxpbmUuIjsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQlzdHlsZWRUZXh0LnNldExpbmVJbmRlbnQoMCwgMSwgNTApOwotCQlzdHlsZWRUZXh0LnNldExpbmVBbGlnbm1lbnQoMiwgMSwgU1dULkNFTlRFUik7Ci0JCXN0eWxlZFRleHQuc2V0TGluZUp1c3RpZnkoNCwgMSwgdHJ1ZSk7Ci0JCXN0eWxlZFRleHQuc2V0TGluZUFsaWdubWVudCg2LCAxLCBTV1QuUklHSFQpOwotCQlzdHlsZWRUZXh0LnNldExpbmVKdXN0aWZ5KDYsIDEsIHRydWUpOwotCQkKLQkJc2hlbGwuc2V0U2l6ZSgzMDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjAwNDY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogc2V0IGEgYmFja2dyb3VuZCBpbWFnZSAoYSBkeW5hbWljIGdyYWRpZW50KQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTQgewotCXN0YXRpYyBJbWFnZSBvbGRJbWFnZTsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRCYWNrZ3JvdW5kTW9kZSAoU1dULklOSEVSSVRfREVGQVVMVCk7Ci0JCUZpbGxMYXlvdXQgbGF5b3V0MSA9IG5ldyBGaWxsTGF5b3V0IChTV1QuVkVSVElDQUwpOwotCQlsYXlvdXQxLm1hcmdpbldpZHRoID0gbGF5b3V0MS5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJc2hlbGwuc2V0TGF5b3V0IChsYXlvdXQxKTsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQgKCJHcm91cCAiKTsKLQkJUm93TGF5b3V0IGxheW91dDIgPSBuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpOwotCQlsYXlvdXQyLm1hcmdpbldpZHRoID0gbGF5b3V0Mi5tYXJnaW5IZWlnaHQgPSBsYXlvdXQyLnNwYWNpbmcgPSAxMDsKLQkJZ3JvdXAuc2V0TGF5b3V0IChsYXlvdXQyKTsKLQkJZm9yIChpbnQgaT0wOyBpPDg7IGkrKykgewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJYnV0dG9uLnNldFRleHQgKCJCdXR0b24gIiArIGkpOwotCQl9Ci0JCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJCUltYWdlIG5ld0ltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBNYXRoLm1heCAoMSwgcmVjdC53aWR0aCksIDEpOwkKLQkJCQlHQyBnYyA9IG5ldyBHQyAobmV3SW1hZ2UpOwotCQkJCWdjLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSkpOwotCQkJCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgMSwgZmFsc2UpOwotCQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQkJc2hlbGwuc2V0QmFja2dyb3VuZEltYWdlIChuZXdJbWFnZSk7Ci0JCQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UgKCk7Ci0JCQkJb2xkSW1hZ2UgPSBuZXdJbWFnZTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSAoKTsKLQkJZGlzcGxheS5kaXNwb3NlICgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3MzMxZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogdGFrZSBhIHNjcmVlbiBzaG90IHdpdGggYSBHQwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJDYXB0dXJlIik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQotCQkJLyogVGFrZSB0aGUgc2NyZWVuIHNob3QgKi8KLQkJCUdDIGdjID0gbmV3IEdDKGRpc3BsYXkpOwotCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGlzcGxheS5nZXRCb3VuZHMoKSk7Ci0JCQlnYy5jb3B5QXJlYShpbWFnZSwgMCwgMCk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCQkKLQkJCVNoZWxsIHBvcHVwID0gbmV3IFNoZWxsKHNoZWxsLCBTV1QuU0hFTExfVFJJTSk7Ci0JCQlwb3B1cC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQlwb3B1cC5zZXRUZXh0KCJJbWFnZSIpOwotCQkJcG9wdXAuc2V0Qm91bmRzKDUwLCA1MCwgMjAwLCAyMDApOwotCQkJcG9wdXAuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChwb3B1cCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNjLCBTV1QuTk9ORSk7Ci0JCQlzYy5zZXRDb250ZW50KGNhbnZhcyk7Ci0JCQljYW52YXMuc2V0Qm91bmRzKGRpc3BsYXkuZ2V0Qm91bmRzICgpKTsKLQkJCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQkJCX0KLQkJCX0pOwotCQkJcG9wdXAub3BlbigpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOGY3YzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2wgVGlwcyBleGFtcGxlIHNuaXBwZXQ6IHNob3cgYSB0b29sIHRpcCBpbnNpZGUgYSByZWN0YW5nbGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTYgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQkJZmluYWwgQ29sb3IgW10gY29sb3JzID0gewotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCksCi0JCQlkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfR1JFRU4pLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpLAotCQl9OwotCQlmaW5hbCBSZWN0YW5nbGUgW10gcmVjdHMgPSB7Ci0JCQluZXcgUmVjdGFuZ2xlICgxMCwgMTAsIDMwLCAzMCksCi0JCQluZXcgUmVjdGFuZ2xlICgyMCwgNDUsIDI1LCAzNSksCi0JCQluZXcgUmVjdGFuZ2xlICg4MCwgODAsIDEwLCAxMCksCi0JCX07Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJTGlzdGVuZXIgbW91c2VMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQkJY2FzZSBTV1QuTW91c2VFbnRlcjoKLQkJCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQkJZm9yIChpbnQgaT0wOyBpPHJlY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKHJlY3RzIFtpXS5jb250YWlucyAoZXZlbnQueCwgZXZlbnQueSkpIHsKLQkJCQkJCQkJU3RyaW5nIHRleHQgPSAiVG9vbFRpcCAiICsgaTsKLQkJCQkJCQkJaWYgKCEodGV4dC5lcXVhbHMgKHNoZWxsLmdldFRvb2xUaXBUZXh0ICgpKSkpIHsKLQkJCQkJCQkJCXNoZWxsLnNldFRvb2xUaXBUZXh0ICgiVG9vbFRpcCAiICsgaSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXNoZWxsLnNldFRvb2xUaXBUZXh0IChudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBtb3VzZUxpc3RlbmVyKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZUVudGVyLCBtb3VzZUxpc3RlbmVyKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHJlY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQgKGNvbG9ycyBbaV0pOwotCQkJCQlnYy5maWxsUmVjdGFuZ2xlIChyZWN0cyBbaV0pOwotCQkJCQlnYy5kcmF3UmVjdGFuZ2xlIChyZWN0cyBbaV0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQkJc2hlbGwub3BlbiAoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTExZTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFN0eWxlZFRleHQgc25pcHBldDogZW1iZWQgY29udHJvbHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE3IHsKLQkKLQlzdGF0aWMgU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCXN0YXRpYyBTdHJpbmcgdGV4dCA9IAotCQkiVGhpcyBzbmlwcGV0IHNob3dzIGhvdyB0byBlbWJlZCB3aWRnZXRzIGluIGEgU3R5bGVkVGV4dC5cbiIrCi0JCSJIZXJlIGlzIG9uZTogXHVGRkZDLCBhbmQgaGVyZSBpcyBhbm90aGVyOiBcdUZGRkMuIjsKLQlzdGF0aWMgaW50W10gb2Zmc2V0czsKLQlzdGF0aWMgQ29udHJvbFtdIGNvbnRyb2xzOwotCXN0YXRpYyBpbnQgTUFSR0lOID0gNTsKLQkKLQlzdGF0aWMgdm9pZCBhZGRDb250cm9sKENvbnRyb2wgY29udHJvbCwgaW50IG9mZnNldCkgewotCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UgKCk7Ci0JCXN0eWxlLnN0YXJ0ID0gb2Zmc2V0OwotCQlzdHlsZS5sZW5ndGggPSAxOwotCQljb250cm9sLnBhY2soKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBjb250cm9sLmdldEJvdW5kcygpOwotCQlpbnQgYXNjZW50ID0gMipyZWN0LmhlaWdodC8zOwotCQlpbnQgZGVzY2VudCA9IHJlY3QuaGVpZ2h0IC0gYXNjZW50OwotCQlzdHlsZS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcyhhc2NlbnQgKyBNQVJHSU4sIGRlc2NlbnQgKyBNQVJHSU4sIHJlY3Qud2lkdGggKyAyKk1BUkdJTik7Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMzIsIFNXVC5OT1JNQUwpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlZFRleHQuc2V0Rm9udChmb250KTsKLQkJc3R5bGVkVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQljb250cm9scyA9IG5ldyBDb250cm9sWzJdOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzdHlsZWRUZXh0LCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCQljb250cm9sc1swXSA9IGJ1dHRvbjsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oc3R5bGVkVGV4dCwgU1dULk5PTkUpOwotCQljb21iby5hZGQoIml0ZW0gMSIpOwotCQljb21iby5hZGQoImFub3RoZXIgaXRlbSIpOwotCQljb250cm9sc1sxXSA9IGNvbWJvOwotCQlvZmZzZXRzID0gbmV3IGludFtjb250cm9scy5sZW5ndGhdOwotCQlpbnQgbGFzdE9mZnNldCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBvZmZzZXQgPSB0ZXh0LmluZGV4T2YoIlx1RkZGQyIsIGxhc3RPZmZzZXQpOwotCQkJb2Zmc2V0c1tpXSA9IG9mZnNldDsKLQkJCWFkZENvbnRyb2woY29udHJvbHNbaV0sIG9mZnNldHNbaV0pOwotCQkJbGFzdE9mZnNldCA9IG9mZnNldCArIDE7Ci0JCX0KLQkJCi0JCS8vIHVzZSBhIHZlcmlmeSBsaXN0ZW5lciB0byBrZWVwIHRoZSBvZmZzZXRzIHVwIHRvIGRhdGUKLQkJc3R5bGVkVGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihuZXcgVmVyaWZ5TGlzdGVuZXIoKSAgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBlKSB7Ci0JCQkJaW50IHN0YXJ0ID0gZS5zdGFydDsKLQkJCQlpbnQgcmVwbGFjZUNoYXJDb3VudCA9IGUuZW5kIC0gZS5zdGFydDsKLQkJCQlpbnQgbmV3Q2hhckNvdW50ID0gZS50ZXh0Lmxlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnQgb2Zmc2V0ID0gb2Zmc2V0c1tpXTsKLQkJCQkJaWYgKHN0YXJ0IDw9IG9mZnNldCAmJiBvZmZzZXQgPCBzdGFydCArIHJlcGxhY2VDaGFyQ291bnQpIHsKLQkJCQkJCS8vIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIGRlbGV0ZWQgZnJvbSB0aGUgdGV4dAotCQkJCQkJaWYgKGNvbnRyb2xzW2ldICE9IG51bGwgJiYgIWNvbnRyb2xzW2ldLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWNvbnRyb2xzW2ldLmRpc3Bvc2UoKTsKLQkJCQkJCQljb250cm9sc1tpXSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQlvZmZzZXQgPSAtMTsKLQkJCQkJfQotCQkJCQlpZiAob2Zmc2V0ICE9IC0xICYmIG9mZnNldCA+PSBzdGFydCkgb2Zmc2V0ICs9IG5ld0NoYXJDb3VudCAtIHJlcGxhY2VDaGFyQ291bnQ7Ci0JCQkJCW9mZnNldHNbaV0gPSBvZmZzZXQ7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCS8vIHJlcG9zaXRpb24gd2lkZ2V0cyBvbiBwYWludCBldmVudAotCQlzdHlsZWRUZXh0LmFkZFBhaW50T2JqZWN0TGlzdGVuZXIobmV3IFBhaW50T2JqZWN0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludE9iamVjdChQYWludE9iamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3R5bGVSYW5nZSBzdHlsZSA9IGV2ZW50LnN0eWxlOwotCQkJCWludCBzdGFydCA9IHN0eWxlLnN0YXJ0OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnQgb2Zmc2V0ID0gb2Zmc2V0c1tpXTsKLQkJCQkJaWYgKHN0YXJ0ID09IG9mZnNldCkgewotCQkJCQkJUG9pbnQgcHQgPSBjb250cm9sc1tpXS5nZXRTaXplKCk7Ci0JCQkJCQlpbnQgeCA9IGV2ZW50LnggKyBNQVJHSU47Ci0JCQkJCQlpbnQgeSA9IGV2ZW50LnkgKyBldmVudC5hc2NlbnQgLSAyKnB0LnkvMzsKLQkJCQkJCWNvbnRyb2xzW2ldLnNldExvY2F0aW9uKHgsIHkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkJCi0JCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjRhNDAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNXVCBTdHlsZWRUZXh0IHNuaXBwZXQ6IHVzZSBncmFkaWVudCBiYWNrZ3JvdW5kLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE4IHsKLQotCXN0YXRpYyBTdHJpbmcgdGV4dCA9ICJQbGFucyBkbyBub3QgbWF0ZXJpYWxpemUgb3V0IG9mIG5vd2hlcmUsIG5vciBhcmUgdGhleSBlbnRpcmVseSBzdGF0aWMuIFRvIGVuc3VyZSB0aGUgcGxhbm5pbmcgcHJvY2VzcyBpcyAiICsKLQkJInRyYW5zcGFyZW50IGFuZCBvcGVuIHRvIHRoZSBlbnRpcmUgRWNsaXBzZSBjb21tdW5pdHksIHdlICh0aGUgRWNsaXBzZSBQTUMpIHBvc3QgcGxhbnMgaW4gYW4gZW1icnlvbmljICIrCi0JCSJmb3JtIGFuZCByZXZpc2UgdGhlbSB0aHJvdWdob3V0IHRoZSByZWxlYXNlIGN5Y2xlLiBcbiIrCi0JCSJUaGUgZmlyc3QgcGFydCBvZiB0aGUgcGxhbiBkZWFscyB3aXRoIHRoZSBpbXBvcnRhbnQgbWF0dGVycyBvZiByZWxlYXNlIGRlbGl2ZXJhYmxlcywgcmVsZWFzZSBtaWxlc3RvbmVzLCB0YXJnZXQgIisKLQkJIm9wZXJhdGluZyBlbnZpcm9ubWVudHMsIGFuZCByZWxlYXNlLXRvLXJlbGVhc2UgY29tcGF0aWJpbGl0eS4gVGhlc2UgYXJlIGFsbCB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGNsZWFyIGZvciAiKwotCQkiYW55IHJlbGVhc2UsIGV2ZW4gaWYgbm8gZmVhdHVyZXMgd2VyZSB0byBjaGFuZ2UuICBcbiI7Ci0Jc3RhdGljIEltYWdlIG9sZEltYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIFN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JCUZvbnREYXRhIGRhdGEgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgMTYsIFNXVC5CT0xEKTsKLQkJc3R5bGVkVGV4dC5zZXRGb250KGZvbnQpOwotCQlzdHlsZWRUZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpKTsKLQkJc3R5bGVkVGV4dC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gc3R5bGVkVGV4dC5nZXRDbGllbnRBcmVhICgpOwotCQkJCUltYWdlIG5ld0ltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxLCBNYXRoLm1heCAoMSwgcmVjdC5oZWlnaHQpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyAobmV3SW1hZ2UpOwotCQkJCWdjLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSkpOwotCQkJCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUgKHJlY3QueCwgcmVjdC55LCAxLCByZWN0LmhlaWdodCwgdHJ1ZSk7Ci0JCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCQlzdHlsZWRUZXh0LnNldEJhY2tncm91bmRJbWFnZSAobmV3SW1hZ2UpOwotCQkJCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlICgpOwotCQkJCW9sZEltYWdlID0gbmV3SW1hZ2U7Ci0JCQl9Ci0JCX0pOwkKLQkJc2hlbGwuc2V0U2l6ZSg3MDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UgKCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzc2MDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogUmVnaW9uIHNuaXBwZXQ6IENyZWF0ZSBub24tcmVjdGFuZ3VsYXIgc2hlbGwgZnJvbSBhbiBpbWFnZSB3aXRoIHRyYW5zcGFyZW5jeQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyMTkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0gICAgICAgIGZpbmFsIEltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gICAgICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0gICAgICAgIFJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0gICAgICAgIGZpbmFsIEltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgaWYgKGltYWdlRGF0YS5hbHBoYURhdGEgIT0gbnVsbCkgewotICAgICAgICAJUmVjdGFuZ2xlIHBpeGVsID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxLCAxKTsKLSAgICAgICAgCWZvciAoaW50IHkgPSAwOyB5IDwgaW1hZ2VEYXRhLmhlaWdodDsgeSsrKSB7Ci0JICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBpbWFnZURhdGEud2lkdGg7IHgrKykgewotCSAgICAgICAgICAgICAgICBpZiAoaW1hZ2VEYXRhLmdldEFscGhhKHgsIHkpID09IDI1NSkgewotCSAgICAgICAgICAgICAgICAJcGl4ZWwueCA9IGltYWdlRGF0YS54ICsgeDsKLSAgICAJCQkJCXBpeGVsLnkgPSBpbWFnZURhdGEueSArIHk7Ci0JICAgICAgICAgICAgICAgICAgICByZWdpb24uYWRkKHBpeGVsKTsKLQkgICAgICAgICAgICAgICAgfSAKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlJbWFnZURhdGEgbWFzayA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0gICAgICAgIAlSZWN0YW5nbGUgcGl4ZWwgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpOwotICAgIAkJZm9yIChpbnQgeSA9IDA7IHkgPCBtYXNrLmhlaWdodDsgeSsrKSB7Ci0gICAgCQkJZm9yIChpbnQgeCA9IDA7IHggPCBtYXNrLndpZHRoOyB4KyspIHsKLSAgICAJCQkJaWYgKG1hc2suZ2V0UGl4ZWwoeCwgeSkgIT0gMCkgewotICAgIAkJCQkJcGl4ZWwueCA9IGltYWdlRGF0YS54ICsgeDsKLSAgICAJCQkJCXBpeGVsLnkgPSBpbWFnZURhdGEueSArIHk7Ci0gICAgCQkJCQlyZWdpb24uYWRkKHBpeGVsKTsKLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCX0KLSAgICAgICAgfQotICAgICAgICBzaGVsbC5zZXRSZWdpb24ocmVnaW9uKTsKLQotICAgICAgICBMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAJaW50IHN0YXJ0WCwgc3RhcnRZOwotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgIHsKLSAgICAgICAgICAgIAlpZiAoZS50eXBlID09IFNXVC5LZXlEb3duICYmIGUuY2hhcmFjdGVyID09IFNXVC5FU0MpIHsKLSAgICAgICAgICAgIAkJc2hlbGwuZGlzcG9zZSgpOwotICAgICAgICAgICAgCX0KLQkJCQlpZiAoZS50eXBlID09IFNXVC5Nb3VzZURvd24gJiYgZS5idXR0b24gPT0gMSkgewotCQkJCQlzdGFydFggPSBlLng7Ci0JCQkJCXN0YXJ0WSA9IGUueTsgCi0JCQkJfQotCQkJCWlmIChlLnR5cGUgPT0gU1dULk1vdXNlTW92ZSAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMSkgIT0gMCkgewotCQkJCQlQb2ludCBwID0gc2hlbGwudG9EaXNwbGF5KGUueCwgZS55KTsKLQkJCQkJcC54IC09IHN0YXJ0WDsKLQkJCQkJcC55IC09IHN0YXJ0WTsKLQkJCQkJc2hlbGwuc2V0TG9jYXRpb24ocCk7Ci0JCQkJfQotCQkJCWlmIChlLnR5cGUgPT0gU1dULlBhaW50KSB7Ci0JCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlLCBpbWFnZURhdGEueCwgaW1hZ2VEYXRhLnkpOwotCQkJCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2hlbGwuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGwpOwotICAgICAgICBzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsKTsKLSAgICAgICAgc2hlbGwuYWRkTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbCk7Ci0gICAgICAgIHNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbCk7Ci0KLSAgICAgICAgc2hlbGwuc2V0U2l6ZShpbWFnZURhdGEueCArIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLnkgKyBpbWFnZURhdGEuaGVpZ2h0KTsKLSAgICAgICAgc2hlbGwub3BlbiAoKTsKLSAgICAgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotICAgICAgICAgICAgICAgIGRpc3BsYXkuc2xlZXAgKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVnaW9uLmRpc3Bvc2UoKTsKLSAgICAgICAgaW1hZ2UuZGlzcG9zZSAoKTsKLSAgICAgICAgZGlzcGxheS5kaXNwb3NlICgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NWI1YmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNlbGVjdCBhbGwgdGhlIHRleHQgaW4gdGhlIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIDApOwotCXRleHQuc2V0VGV4dCAoIkFTREYiKTsKLQl0ZXh0LnNldFNpemUgKDY0LCAzMik7Ci0JdGV4dC5zZWxlY3RBbGwgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODI1MTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IEltYWdlcyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgVHJlZUl0ZW0KLSAqCi0gKiBGb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGlzIHNuaXBwZXQgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtQ3VzdG9tRHJhd2luZ1RhYmxlQW5kVHJlZUl0ZW1zL2N1c3RvbURyYXcuaHRtI19leGFtcGxlNQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjAgewkKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAzNTAsIDIwMCk7Ci0JSW1hZ2UgeEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDKHhJbWFnZSk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5kcmF3TGluZSgxLCAxLCAxNCwgMTQpOwotCWdjLmRyYXdMaW5lKDEsIDE0LCAxNCwgMSk7Ci0JZ2MuZHJhd092YWwoMiwgMiwgMTEsIDExKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZmluYWwgaW50IElNQUdFX01BUkdJTiA9IDI7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZS5zZXRCb3VuZHMoMTAsIDEwLCAzMDAsIDE1MCk7Ci0JVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KCJyb290IGl0ZW0iKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJbmV3SXRlbS5zZXRUZXh0KCJkZXNjZW5kZW50ICIgKyBpKTsKLQkJaWYgKGkgJSAyID09IDApIG5ld0l0ZW0uc2V0RGF0YSh4SW1hZ2UpOwotCQlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCQlpdGVtID0gbmV3SXRlbTsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtIGFuZCBQYWludEl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LiAgVGhlcmVmb3JlIGl0IGlzCi0JICogY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZSBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCUltYWdlIHRyYWlsaW5nSW1hZ2UgPSAoSW1hZ2UpaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAodHJhaWxpbmdJbWFnZSAhPSBudWxsKSB7Ci0JCQkJZXZlbnQud2lkdGggKz0gdHJhaWxpbmdJbWFnZS5nZXRCb3VuZHMoKS53aWR0aCArIElNQUdFX01BUkdJTjsKLQkJCX0KLQkJfQotCX0pOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJSW1hZ2UgdHJhaWxpbmdJbWFnZSA9IChJbWFnZSlpdGVtLmdldERhdGEoKTsKLQkJCWlmICh0cmFpbGluZ0ltYWdlICE9IG51bGwpIHsKLQkJCQlpbnQgeCA9IGV2ZW50LnggKyBldmVudC53aWR0aCArIElNQUdFX01BUkdJTjsKLQkJCQlpbnQgaXRlbUhlaWdodCA9IHRyZWUuZ2V0SXRlbUhlaWdodCgpOwotCQkJCWludCBpbWFnZUhlaWdodCA9IHRyYWlsaW5nSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQkJCWludCB5ID0gZXZlbnQueSArIChpdGVtSGVpZ2h0IC0gaW1hZ2VIZWlnaHQpIC8gMjsKLQkJCQlldmVudC5nYy5kcmF3SW1hZ2UodHJhaWxpbmdJbWFnZSwgeCwgeSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JeEltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2MDY5Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBTY3JvbGwgdHJlZSB3aGVuIG1vdXNlIGF0IHRvcCBvciBib3R0b20KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjEgewotCXN0YXRpYyBSdW5uYWJsZSBIZWFydGJlYXQ7Ci0Jc3RhdGljIGJvb2xlYW4gVHJhY2tpbmc7Ci0Jc3RhdGljIGludCBTY3JvbGxTcGVlZCA9IDQwOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWNvbHVtbjAuc2V0VGV4dCgiQ29sdW1uIDAiKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMS5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQljb2x1bW4yLnNldFRleHQoIkNvbHVtbiAyIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlpdGVtLnNldFRleHQoMSwgImNvbHVtbiAxIC0gIitpKTsKLQkJaXRlbS5zZXRUZXh0KDIsICJjb2x1bW4gMiAtICIraSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgOTsgaisrKSB7Ci0JCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiK2krIiAiK2opOwotCQkJc3ViSXRlbS5zZXRUZXh0KDEsICJjb2x1bW4gMSAtICIraSsiICIraik7Ci0JCQlzdWJJdGVtLnNldFRleHQoMiwgImNvbHVtbiAyIC0gIitpKyIgIitqKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgOTsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KCJpdGVtICIraSsiICIraisiICIrayk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KDEsICJjb2x1bW4gMSAtICIraSsiICIraisiICIrayk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KDIsICJjb2x1bW4gMiAtICIraSsiICIraisiICIrayk7Ci0JCQl9Ci0JCX0KLQl9Ci0JY29sdW1uMC5wYWNrKCk7Ci0JY29sdW1uMS5wYWNrKCk7Ci0JY29sdW1uMi5wYWNrKCk7Ci0JCi0JSGVhcnRiZWF0ID0gbmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoIVRyYWNraW5nIHx8IHRyZWUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQlQb2ludCBjdXJzb3IgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uKCk7Ci0JCQljdXJzb3IgPSBkaXNwbGF5Lm1hcChudWxsLCB0cmVlLCBjdXJzb3IpOwotCQkJU2Nyb2xsKHRyZWUsIGN1cnNvci54LCBjdXJzb3IueSk7Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyhTY3JvbGxTcGVlZCwgSGVhcnRiZWF0KTsKLQkJfQotCX07Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCWNhc2UgU1dULk1vdXNlRW50ZXI6Ci0JCQkJVHJhY2tpbmcgPSB0cnVlOwotCQkJCWRpc3BsYXkudGltZXJFeGVjKDAsIEhlYXJ0YmVhdCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0JCQkJVHJhY2tpbmcgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VFbnRlciwgbGlzdGVuZXIpOyAKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUV4aXQsIGxpc3RlbmVyKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXN0YXRpYyB2b2lkIFNjcm9sbChUcmVlIHRyZWUsIGludCB4LCBpbnQgeSkgewotCVRyZWVJdGVtIGl0ZW0gPSB0cmVlLmdldEl0ZW0obmV3IFBvaW50KHgsIHkpKTsKLQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JUmVjdGFuZ2xlIGFyZWEgPSB0cmVlLmdldENsaWVudEFyZWEoKTsKLQlpbnQgaGVhZGVySGVpZ2h0ID0gdHJlZS5nZXRIZWFkZXJIZWlnaHQoKTsKLQlpbnQgaXRlbUhlaWdodD0gdHJlZS5nZXRJdGVtSGVpZ2h0KCk7Ci0JVHJlZUl0ZW0gbmV4dEl0ZW0gPSBudWxsOwotCWlmICh5IDwgYXJlYS55ICsgaGVhZGVySGVpZ2h0ICsgMiAqIGl0ZW1IZWlnaHQpIHsKLQkJbmV4dEl0ZW0gPSBQcmV2aW91c0l0ZW0odHJlZSwgaXRlbSk7Ci0JfQotCWlmICh5ID4gYXJlYS55ICsgYXJlYS5oZWlnaHQgLSAyICogaXRlbUhlaWdodCkgewotCQluZXh0SXRlbSA9IE5leHRJdGVtKHRyZWUsIGl0ZW0pOwotCX0KLQlpZiAobmV4dEl0ZW0gIT0gbnVsbCkgdHJlZS5zaG93SXRlbShuZXh0SXRlbSk7Ci19Ci0KLXN0YXRpYyBUcmVlSXRlbSBQcmV2aW91c0l0ZW0oVHJlZSB0cmVlLCBUcmVlSXRlbSBpdGVtKSB7Ci0JaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JVHJlZUl0ZW0gY2hpbGRJdGVtID0gaXRlbTsKLQlUcmVlSXRlbSBwYXJlbnRJdGVtID0gY2hpbGRJdGVtLmdldFBhcmVudEl0ZW0oKTsKLQlpbnQgaW5kZXggPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmluZGV4T2YoY2hpbGRJdGVtKSA6IHBhcmVudEl0ZW0uaW5kZXhPZihjaGlsZEl0ZW0pOwotCWlmIChpbmRleCA9PSAwKSB7Ci0JCXJldHVybiBwYXJlbnRJdGVtOwotCX0gZWxzZSB7Ci0JCVRyZWVJdGVtIG5leHRJdGVtID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5nZXRJdGVtKGluZGV4LTEpIDogcGFyZW50SXRlbS5nZXRJdGVtKGluZGV4LTEpOwotCQlpbnQgY291bnQgPSBuZXh0SXRlbS5nZXRJdGVtQ291bnQoKTsKLQkJd2hpbGUgKGNvdW50ID4gMCAmJiBuZXh0SXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQluZXh0SXRlbSA9IG5leHRJdGVtLmdldEl0ZW0oY291bnQgLSAxKTsKLQkJCWNvdW50ID0gbmV4dEl0ZW0uZ2V0SXRlbUNvdW50KCk7Ci0JCX0KLQkJcmV0dXJuIG5leHRJdGVtOwotCX0KLX0KLXN0YXRpYyBUcmVlSXRlbSBOZXh0SXRlbShUcmVlIHRyZWUsIFRyZWVJdGVtIGl0ZW0pIHsKLQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlpZiAoaXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCXJldHVybiBpdGVtLmdldEl0ZW0oMCk7Ci0JfSBlbHNlIHsKLQkJVHJlZUl0ZW0gY2hpbGRJdGVtID0gaXRlbTsKLQkJVHJlZUl0ZW0gcGFyZW50SXRlbSA9IGNoaWxkSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCWludCBpbmRleCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuaW5kZXhPZihjaGlsZEl0ZW0pIDogcGFyZW50SXRlbS5pbmRleE9mKGNoaWxkSXRlbSk7Ci0JCWludCBjb3VudCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbUNvdW50KCkgOiBwYXJlbnRJdGVtLmdldEl0ZW1Db3VudCgpOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGluZGV4ICsgMSA8IGNvdW50KSB7Ci0JCQkJcmV0dXJuIHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbShpbmRleCArIDEpIDogcGFyZW50SXRlbS5nZXRJdGVtKGluZGV4ICsgMSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwYXJlbnRJdGVtID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2hpbGRJdGVtID0gcGFyZW50SXRlbTsKLQkJCQkJcGFyZW50SXRlbSA9IGNoaWxkSXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJCWluZGV4ID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5pbmRleE9mKGNoaWxkSXRlbSkgOiBwYXJlbnRJdGVtLmluZGV4T2YoY2hpbGRJdGVtKTsKLQkJCQkJY291bnQgPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmdldEl0ZW1Db3VudCgpIDogcGFyZW50SXRlbS5nZXRJdGVtQ291bnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOTkzODUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBTdHlsZWRUZXh0IGJ1bGxldGVkIGxpc3QgZXhhbXBsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU3R5bGVkVGV4dCBCdWxsZXQgRXhhbXBsZSIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dCAoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0JU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JdGV4dC5hcHBlbmQoIkhlcmUgaXMgU3R5bGVkVGV4dCB3aXRoIHNvbWUgYnVsbGV0ZWQgbGlzdHM6XG5cbiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB0ZXh0LmFwcGVuZCgiUmVkIEJ1bGxldCBMaXN0IEl0ZW0gIiArIGkgKyAiXG4iKTsKLQl0ZXh0LmFwcGVuZCgiXG4iKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgdGV4dC5hcHBlbmQoIk51bWJlcmVkIExpc3QgSXRlbSAiICsgaSArICJcbiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB0ZXh0LmFwcGVuZCgiU3ViIExpc3QgSXRlbSAiICsgaSArICJcbiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB0ZXh0LmFwcGVuZCgiTnVtYmVyZWQgTGlzdCBJdGVtICIgKyAoMiArIGkpICsgIlxuIik7Ci0JdGV4dC5hcHBlbmQoIlxuIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHRleHQuYXBwZW5kKCJDdXN0b20gRHJhdyBMaXN0IEl0ZW0gIiArIGkgKyAiXG4iKTsJCi0Jc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQudG9TdHJpbmcoKSk7Ci0JCQotCVN0eWxlUmFuZ2Ugc3R5bGUwID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTAubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoMCwgMCwgNDApOwotCXN0eWxlMC5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQlCdWxsZXQgYnVsbGV0MCA9IG5ldyBCdWxsZXQgKHN0eWxlMCk7Ci0JU3R5bGVSYW5nZSBzdHlsZTEgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcygwLCAwLCA1MCk7Ci0Jc3R5bGUxLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlCdWxsZXQgYnVsbGV0MSA9IG5ldyBCdWxsZXQgKFNULkJVTExFVF9OVU1CRVIgfCBTVC5CVUxMRVRfVEVYVCwgc3R5bGUxKTsKLQlidWxsZXQxLnRleHQgPSAiLiI7Ci0JU3R5bGVSYW5nZSBzdHlsZTIgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMi5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcygwLCAwLCA4MCk7Ci0Jc3R5bGUyLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTik7Ci0JQnVsbGV0IGJ1bGxldDIgPSBuZXcgQnVsbGV0IChTVC5CVUxMRVRfVEVYVCwgc3R5bGUyKTsKLQlidWxsZXQyLnRleHQgPSAiXHUyNzEzIjsKLQlTdHlsZVJhbmdlIHN0eWxlMyA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUzLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKDAsIDAsIDUwKTsKLQlCdWxsZXQgYnVsbGV0MyA9IG5ldyBCdWxsZXQgKFNULkJVTExFVF9DVVNUT00sIHN0eWxlMik7Ci0KLQlzdHlsZWRUZXh0LnNldExpbmVCdWxsZXQoMiwgNCwgYnVsbGV0MCk7Ci0Jc3R5bGVkVGV4dC5zZXRMaW5lQnVsbGV0KDcsIDIsIGJ1bGxldDEpOwotCXN0eWxlZFRleHQuc2V0TGluZUJ1bGxldCg5LCA0LCBidWxsZXQyKTsKLQlzdHlsZWRUZXh0LnNldExpbmVCdWxsZXQoMTMsIDIsIGJ1bGxldDEpOwotCXN0eWxlZFRleHQuc2V0TGluZUJ1bGxldCgxNiwgNCwgYnVsbGV0Myk7Ci0KLQlzdHlsZWRUZXh0LmFkZFBhaW50T2JqZWN0TGlzdGVuZXIobmV3IFBhaW50T2JqZWN0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50T2JqZWN0KFBhaW50T2JqZWN0RXZlbnQgZXZlbnQpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IGV2ZW50LmRpc3BsYXk7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlID0gZXZlbnQuc3R5bGU7Ci0JCQlGb250IGZvbnQgPSBzdHlsZS5mb250OwotCQkJaWYgKGZvbnQgPT0gbnVsbCkgZm9udCA9IHN0eWxlZFRleHQuZ2V0Rm9udCgpOwotCQkJVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQkJCWxheW91dC5zZXRBc2NlbnQoZXZlbnQuYXNjZW50KTsKLQkJCWxheW91dC5zZXREZXNjZW50KGV2ZW50LmRlc2NlbnQpOwotCQkJbGF5b3V0LnNldEZvbnQoZm9udCk7Ci0JCQlsYXlvdXQuc2V0VGV4dCgiXHUyMDIzIDEuIiArIGV2ZW50LmJ1bGxldEluZGV4ICsgIikiKTsKLQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCBldmVudC54ICsgMTAsIGV2ZW50LnkpOwotCQkJbGF5b3V0LmRpc3Bvc2UoKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njg0NGQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBleGFtcGxlIHNuaXBwZXQ6IEV4cGFuZEJhciBleGFtcGxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXNoZWxsLnNldFRleHQoIkV4cGFuZEJhciBFeGFtcGxlIik7Ci0JRXhwYW5kQmFyIGJhciA9IG5ldyBFeHBhbmRCYXIgKHNoZWxsLCBTV1QuVl9TQ1JPTEwpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIFNuaXBwZXQyMjMuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZWNsaXBzZS5wbmciKSk7IAotCQotCS8vIEZpcnN0IGl0ZW0KLQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoYmFyLCBTV1QuTk9ORSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoKTsKLQlsYXlvdXQubWFyZ2luTGVmdCA9IGxheW91dC5tYXJnaW5Ub3AgPSBsYXlvdXQubWFyZ2luUmlnaHQgPSBsYXlvdXQubWFyZ2luQm90dG9tID0gMTA7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIlNXVC5QVVNIIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuUkFESU8pOwotCWJ1dHRvbi5zZXRUZXh0KCJTV1QuUkFESU8iKTsKLQlidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JYnV0dG9uLnNldFRleHQoIlNXVC5DSEVDSyIpOwotCWJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULlRPR0dMRSk7Ci0JYnV0dG9uLnNldFRleHQoIlNXVC5UT0dHTEUiKTsKLQlFeHBhbmRJdGVtIGl0ZW0wID0gbmV3IEV4cGFuZEl0ZW0gKGJhciwgU1dULk5PTkUsIDApOwotCWl0ZW0wLnNldFRleHQoIldoYXQgaXMgeW91ciBmYXZvcml0ZSBidXR0b24iKTsKLQlpdGVtMC5zZXRIZWlnaHQoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0JaXRlbTAuc2V0Q29udHJvbChjb21wb3NpdGUpOwotCWl0ZW0wLnNldEltYWdlKGltYWdlKTsKLQkKLQkvLyBTZWNvbmQgaXRlbQotCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGJhciwgU1dULk5PTkUpOwotCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgyLCBmYWxzZSk7Ci0JbGF5b3V0Lm1hcmdpbkxlZnQgPSBsYXlvdXQubWFyZ2luVG9wID0gbGF5b3V0Lm1hcmdpblJpZ2h0ID0gbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDEwOwotCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNXVC5JQ09OX0VSUk9SIik7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU1dULklDT05fSU5GT1JNQVRJT04iKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNXVC5JQ09OX1dBUk5JTkciKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9RVUVTVElPTikpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJTV1QuSUNPTl9RVUVTVElPTiIpOwotCUV4cGFuZEl0ZW0gaXRlbTEgPSBuZXcgRXhwYW5kSXRlbSAoYmFyLCBTV1QuTk9ORSwgMSk7Ci0JaXRlbTEuc2V0VGV4dCgiV2hhdCBpcyB5b3VyIGZhdm9yaXRlIGljb24iKTsKLQlpdGVtMS5zZXRIZWlnaHQoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0JaXRlbTEuc2V0Q29udHJvbChjb21wb3NpdGUpOwotCWl0ZW0xLnNldEltYWdlKGltYWdlKTsKLQkKLQkvLyBUaGlyZCBpdGVtCi0JY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoYmFyLCBTV1QuTk9ORSk7Ci0JbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKDIsIHRydWUpOwotCWxheW91dC5tYXJnaW5MZWZ0ID0gbGF5b3V0Lm1hcmdpblRvcCA9IGxheW91dC5tYXJnaW5SaWdodCA9IGxheW91dC5tYXJnaW5Cb3R0b20gPSAxMDsKLQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJTY2FsZSIpOwkKLQluZXcgU2NhbGUgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJTcGlubmVyIik7CQotCW5ldyBTcGlubmVyIChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJTbGlkZXIiKTsJCi0JbmV3IFNsaWRlciAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JRXhwYW5kSXRlbSBpdGVtMiA9IG5ldyBFeHBhbmRJdGVtIChiYXIsIFNXVC5OT05FLCAyKTsKLQlpdGVtMi5zZXRUZXh0KCJXaGF0IGlzIHlvdXIgZmF2b3JpdGUgcmFuZ2Ugd2lkZ2V0Iik7Ci0JaXRlbTIuc2V0SGVpZ2h0KGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnkpOwotCWl0ZW0yLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQlpdGVtMi5zZXRJbWFnZShpbWFnZSk7Ci0JCi0JaXRlbTEuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYmFyLnNldFNwYWNpbmcoOCk7Ci0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDM1MCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSB7Ci0JCQlkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JfQotCWltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjUwODdlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBpbXBsZW1lbnQgcmFkaW8gYmVoYXZpb3IgZm9yIHNldFNlbGVjdGlvbigpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjQgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZm9yIChpbnQgaT0wOyBpPDg7IGkrKykgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5SQURJTyk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiQiIgKyBpKTsKLQkJaWYgKGkgPT0gMCkgYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JfQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiU2V0IFNlbGVjdGlvbiB0byBCNCIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlDb250cm9sIFtdIGNoaWxkcmVuID0gc2hlbGwuZ2V0Q2hpbGRyZW4gKCk7Ci0JCQlCdXR0b24gbmV3QnV0dG9uID0gKEJ1dHRvbikgY2hpbGRyZW4gWzRdOwotCQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuIFtpXTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24gJiYgKGNoaWxkLmdldFN0eWxlICgpICYgU1dULlJBRElPKSAhPSAwKSB7Ci0JCQkJCSgoQnV0dG9uKSBjaGlsZCkuc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJbmV3QnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YjM3MDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogVG9vbHRpcCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGJhbGxvb24gdG9vbHRpcCBmb3IgYSB0cmF5IGl0ZW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQlmaW5hbCBUb29sVGlwIHRpcCA9IG5ldyBUb29sVGlwKHNoZWxsLCBTV1QuQkFMTE9PTiB8IFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLQl0aXAuc2V0TWVzc2FnZSgiSGVyZSBpcyBhIG1lc3NhZ2UgZm9yIHRoZSB1c2VyLiBXaGVuIHRoZSBtZXNzYWdlIGlzIHRvbyBsb25nIGl0IHdyYXBzLiBJIHNob3VsZCBzYXkgc29tZXRoaW5nIGNvb2wgYnV0IG5vdGhpbmcgY29tZXMgdG8gbXkgbWluZC4iKTsKLQlUcmF5IHRyYXkgPSBkaXNwbGF5LmdldFN5c3RlbVRyYXkoKTsKLQlpZiAodHJheSAhPSBudWxsKSB7Ci0JCVRyYXlJdGVtIGl0ZW0gPSBuZXcgVHJheUl0ZW0odHJheSwgU1dULk5PTkUpOwotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBTbmlwcGV0MjI1LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImVjbGlwc2UucG5nIikpOwotCQlpdGVtLnNldEltYWdlKGltYWdlKTsKLQkJdGlwLnNldFRleHQoIk5vdGlmaWNhdGlvbiBmcm9tIGEgdHJheSBpdGVtIik7Ci0JCWl0ZW0uc2V0VG9vbFRpcCh0aXApOwotCX0gZWxzZSB7Ci0JCXRpcC5zZXRUZXh0KCJOb3RpZmljYXRpb24gZnJvbSBhbnl3aGVyZSIpOwotCQl0aXAuc2V0TG9jYXRpb24oNDAwLCA0MDApOwotCX0KLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiUHJlc3MgZm9yIGJhbGxvb24gdGlwIik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXRpcC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfSk7Ci0JYnV0dG9uLnBhY2soKTsKLQlzaGVsbC5zZXRCb3VuZHMoNTAsIDUwLCAzMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODhkYmZkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBEcmF3IGEgY3VzdG9tIGdyYWRpZW50IHNlbGVjdGlvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI2IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJDdXN0b20gZ3JhZGllbnQgc2VsZWN0aW9uIGZvciBUcmVlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSAzOwotCWZvciAoaW50IGk9MDsgaTxpdGVtQ291bnQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0xLnNldFRleHQoIml0ZW0gIitpKTsKLQkJZm9yIChpbnQgYz0xOyBjIDwgY29sdW1uQ291bnQ7IGMrKykgewotCQkJaXRlbTEuc2V0VGV4dChjLCAiaXRlbSBbIitpKyItIitjKyJdIik7Ci0JCX0KLQkJZm9yIChpbnQgaj0wOyBqPGl0ZW1Db3VudDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbShpdGVtMSwgU1dULk5PTkUpOwotCQkJaXRlbTIuc2V0VGV4dCgiaXRlbSBbIitpKyIgIitqKyJdIik7Ci0JCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCWl0ZW0yLnNldFRleHQoYywgIml0ZW0gWyIraSsiICIraisiLSIrYysiXSIpOwotCQkJfQotCQkJZm9yIChpbnQgaz0wOyBrPGl0ZW1Db3VudDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTMgPSBuZXcgVHJlZUl0ZW0oaXRlbTIsIFNXVC5OT05FKTsKLQkJCQlpdGVtMy5zZXRUZXh0KCJpdGVtIFsiK2krIiAiK2orIiAiK2srIl0iKTsKLQkJCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCQlpdGVtMy5zZXRUZXh0KGMsICJpdGVtIFsiK2krIiAiK2orIiAiK2srIi0iK2MrIl0iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuSE9UOwotCQkJaWYgKChldmVudC5kZXRhaWwgJiBTV1QuU0VMRUNURUQpICE9IDApIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVJlY3RhbmdsZSBhcmVhID0gdHJlZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJLyoKLQkJCQkgKiBJZiB5b3Ugd2lzaCB0byBwYWludCB0aGUgc2VsZWN0aW9uIGJleW9uZCB0aGUgZW5kIG9mCi0JCQkJICogbGFzdCBjb2x1bW4sIHlvdSBtdXN0IGNoYW5nZSB0aGUgY2xpcHBpbmcgcmVnaW9uLgotCQkJCSAqLwotCQkJCWludCBjb2x1bW5Db3VudCA9IHRyZWUuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gY29sdW1uQ291bnQgLSAxIHx8IGNvbHVtbkNvdW50ID09IDApIHsKLQkJCQkJaW50IHdpZHRoID0gYXJlYS54ICsgYXJlYS53aWR0aCAtIGV2ZW50Lng7Ci0JCQkJCWlmICh3aWR0aCA+IDApIHsKLQkJCQkJCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JCQkJCQlnYy5nZXRDbGlwcGluZyhyZWdpb24pOwotCQkJCQkJcmVnaW9uLmFkZChldmVudC54LCBldmVudC55LCB3aWR0aCwgZXZlbnQuaGVpZ2h0KTsgCi0JCQkJCQlnYy5zZXRDbGlwcGluZyhyZWdpb24pOwotCQkJCQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlnYy5zZXRBZHZhbmNlZCh0cnVlKTsKLQkJCQlpZiAoZ2MuZ2V0QWR2YW5jZWQoKSkgZ2Muc2V0QWxwaGEoMTI3KTsJCQkJCQkJCQotCQkJCVJlY3RhbmdsZSByZWN0ID0gZXZlbnQuZ2V0Qm91bmRzKCk7Ci0JCQkJQ29sb3IgZm9yZWdyb3VuZCA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJCQlDb2xvciBiYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgcmVjdC55LCA1MDAsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQkJLy8gcmVzdG9yZSBjb2xvcnMgZm9yIHN1YnNlcXVlbnQgZHJhd2luZwotCQkJCWdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQlldmVudC5kZXRhaWwgJj0gflNXVC5TRUxFQ1RFRDsJCQkJCQotCQkJfQkJCQkJCQotCQl9Ci0JfSk7CQkKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQl0cmVlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0JfQkKLQl0cmVlLnNldFNlbGVjdGlvbih0cmVlLmdldEl0ZW0oMCkpOwotCXNoZWxsLnNldFNpemUoNTAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7CQotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExYjU4Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IE11bHRpcGxlIGxpbmVzIGluIGEgVHJlZUl0ZW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyNyB7CQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJNdWx0aXBsZSBsaW5lcyBpbiBhIFRyZWVJdGVtIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JaW50IGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7Ci0JCWNvbHVtbi5zZXRXaWR0aCgxMDApOwotCX0KLQlpbnQgaXRlbUNvdW50ID0gMzsKLQlmb3IgKGludCBpPTA7IGk8aXRlbUNvdW50OyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtMS5zZXRUZXh0KCJpdGVtICIraSk7Ci0JCWZvciAoaW50IGM9MTsgYyA8IGNvbHVtbkNvdW50OyBjKyspIHsKLQkJCWl0ZW0xLnNldFRleHQoYywgIml0ZW0gWyIraSsiLSIrYysiXSIpOwotCQl9Ci0JCWZvciAoaW50IGo9MDsgajxpdGVtQ291bnQ7IGorKykgewotCQkJVHJlZUl0ZW0gaXRlbTIgPSBuZXcgVHJlZUl0ZW0oaXRlbTEsIFNXVC5OT05FKTsKLQkJCWl0ZW0yLnNldFRleHQoIml0ZW0gWyIraSsiICIraisiXSIpOwotCQkJZm9yIChpbnQgYz0xOyBjPGNvbHVtbkNvdW50OyBjKyspIHsKLQkJCQlpdGVtMi5zZXRUZXh0KGMsICJpdGVtIFsiK2krIiAiK2orIi0iK2MrIl0iKTsKLQkJCX0KLQkJCWZvciAoaW50IGs9MDsgazxpdGVtQ291bnQ7IGsrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0zID0gbmV3IFRyZWVJdGVtKGl0ZW0yLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbTMuc2V0VGV4dCgiaXRlbSBbIitpKyIgIitqKyIgIitrKyJdIik7Ci0JCQkJZm9yIChpbnQgYz0xOyBjPGNvbHVtbkNvdW50OyBjKyspIHsKLQkJCQkJaXRlbTMuc2V0VGV4dChjLCAiaXRlbSBbIitpKyIgIitqKyIgIitrKyItIitjKyJdIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQlMaXN0ZW5lciBwYWludExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJc3dpdGNoKGV2ZW50LnR5cGUpIHsJCQotCQkJCWNhc2UgU1dULk1lYXN1cmVJdGVtOiB7Ci0JCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KGl0ZW0sIGV2ZW50LmluZGV4KTsKLQkJCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LmdjLnRleHRFeHRlbnQodGV4dCk7Ci0JCQkJCWV2ZW50LndpZHRoID0gc2l6ZS54OwotCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIHNpemUueSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoaXRlbSwgZXZlbnQuaW5kZXgpOwotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsJCQkJCQotCQkJCQlpbnQgb2Zmc2V0MiA9IGV2ZW50LmluZGV4ID09IDAgPyBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gc2l6ZS55KSAvIDIpIDogMDsKLQkJCQkJZXZlbnQuZ2MuZHJhd1RleHQodGV4dCwgZXZlbnQueCwgZXZlbnQueSArIG9mZnNldDIsIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuRXJhc2VJdGVtOiB7CQotCQkJCQlldmVudC5kZXRhaWwgJj0gflNXVC5GT1JFR1JPVU5EOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGdldFRleHQoVHJlZUl0ZW0gaXRlbSwgaW50IGNvbHVtbikgewotCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoY29sdW1uKTsKLQkJCWlmIChjb2x1bW4gIT0gMCkgewotCQkJCVRyZWVJdGVtIHBhcmVudCA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJCWludCBpbmRleCA9IHBhcmVudCA9PSBudWxsID8gdHJlZS5pbmRleE9mKGl0ZW0pIDogcGFyZW50LmluZGV4T2YoaXRlbSk7Ci0JCQkJaWYgKChpbmRleCtjb2x1bW4pICUgMyA9PSAxKXsKLQkJCQkJdGV4dCArPSJcbm5ldyBsaW5lIjsKLQkJCQl9Ci0JCQkJaWYgKChpbmRleCtjb2x1bW4pICUgMyA9PSAyKSB7Ci0JCQkJCXRleHQgKz0iXG5uZXcgbGluZVxubmV3IGxpbmUiOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JfTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCi0Jc2hlbGwuc2V0U2l6ZSg2MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Mjg3MTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IERyYXcgYSBiYXIgZ3JhcGgKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyOCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7CQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU2hvdyByZXN1bHRzIGFzIGEgYmFyIGNoYXJ0IGluIFRhYmxlIik7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4xLnNldFRleHQoIkJ1ZyBTdGF0dXMiKTsKLQljb2x1bW4xLnNldFdpZHRoKDEwMCk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjIuc2V0VGV4dCgiUGVyY2VudCIpOwotCWNvbHVtbjIuc2V0V2lkdGgoMjAwKTsKLQlTdHJpbmdbXSBsYWJlbHMgPSBuZXcgU3RyaW5nW117IlJlc29sdmVkIiwgIk5ldyIsICJXb24ndCBGaXgiLCAiSW52YWxpZCJ9OwotCWZvciAoaW50IGk9MDsgaTxsYWJlbHMubGVuZ3RoOyBpKyspIHsKLQkJIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkgaXRlbS5zZXRUZXh0KGxhYmVsc1tpXSk7Ci0JfQotCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCWludFtdIHBlcmNlbnRzID0gbmV3IGludFtdIHs1MCwgMzAsIDUsIDE1fTsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5pbmRleCA9PSAxKSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJCWludCBwZXJjZW50ID0gcGVyY2VudHNbaW5kZXhdOwotCQkJCUNvbG9yIGZvcmVncm91bmQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQkJQ29sb3IgYmFja2dyb3VuZCA9IGdjLmdldEJhY2tncm91bmQoKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JCQkJaW50IHdpZHRoID0gKGNvbHVtbjIuZ2V0V2lkdGgoKSAtIDEpICogcGVyY2VudCAvIDEwMDsKLQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoZXZlbnQueCwgZXZlbnQueSwgd2lkdGgsIGV2ZW50LmhlaWdodCwgdHJ1ZSk7CQkJCQkKLQkJCQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLTEsIGV2ZW50LmhlaWdodC0xKTsKLQkJCQlnYy5kcmF3UmVjdGFuZ2xlKHJlY3QyKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOwotCQkJCVN0cmluZyB0ZXh0ID0gcGVyY2VudCsiJSI7Ci0JCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LmdjLnRleHRFeHRlbnQodGV4dCk7CQkJCQkKLQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHNpemUueSkgLyAyKTsKLQkJCQlnYy5kcmF3VGV4dCh0ZXh0LCBldmVudC54KzIsIGV2ZW50Lnkrb2Zmc2V0LCB0cnVlKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCWdjLnNldEJhY2tncm91bmQoZm9yZWdyb3VuZCk7Ci0JCQl9Ci0JCX0KLQl9KTsJCQotCQkJCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjNTEzYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogRHJhdyBhIGN1c3RvbSBncmFkaWVudCBzZWxlY3Rpb24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyOSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiQ3VzdG9tIGdyYWRpZW50IHNlbGVjdGlvbiBmb3IgVGFibGUiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JaW50IGNvbHVtbkNvdW50ID0gMzsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gODsKLQlmb3IoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJpdGVtICIraSsiIGEiLCAiaXRlbSAiK2krIiBiIiwgIml0ZW0gIitpKyIgYyJ9KTsKLQl9CQkKLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkhPVDsJCi0JCQlpZigoZXZlbnQuZGV0YWlsICYgU1dULlNFTEVDVEVEKSAhPSAwKSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHRhYmxlLmdldENsaWVudEFyZWEoKTsKLQkJCQkvKgotCQkJCSAqIElmIHlvdSB3aXNoIHRvIHBhaW50IHRoZSBzZWxlY3Rpb24gYmV5b25kIHRoZSBlbmQgb2YKLQkJCQkgKiBsYXN0IGNvbHVtbiwgeW91IG11c3QgY2hhbmdlIHRoZSBjbGlwcGluZyByZWdpb24uCi0JCQkJICovCi0JCQkJaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gY29sdW1uQ291bnQgLSAxIHx8IGNvbHVtbkNvdW50ID09IDApIHsKLQkJCQkJaW50IHdpZHRoID0gYXJlYS54ICsgYXJlYS53aWR0aCAtIGV2ZW50Lng7Ci0JCQkJCWlmICh3aWR0aCA+IDApIHsKLQkJCQkJCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JCQkJCQlnYy5nZXRDbGlwcGluZyhyZWdpb24pOwotCQkJCQkJcmVnaW9uLmFkZChldmVudC54LCBldmVudC55LCB3aWR0aCwgZXZlbnQuaGVpZ2h0KTsgCi0JCQkJCQlnYy5zZXRDbGlwcGluZyhyZWdpb24pOwotCQkJCQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlnYy5zZXRBZHZhbmNlZCh0cnVlKTsKLQkJCQlpZiAoZ2MuZ2V0QWR2YW5jZWQoKSkgZ2Muc2V0QWxwaGEoMTI3KTsJCQkJCQkJCQotCQkJCVJlY3RhbmdsZSByZWN0ID0gZXZlbnQuZ2V0Qm91bmRzKCk7Ci0JCQkJQ29sb3IgZm9yZWdyb3VuZCA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJCQlDb2xvciBiYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgcmVjdC55LCA1MDAsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQkJLy8gcmVzdG9yZSBjb2xvcnMgZm9yIHN1YnNlcXVlbnQgZHJhd2luZwotCQkJCWdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQkJCQlldmVudC5kZXRhaWwgJj0gflNXVC5TRUxFQ1RFRDsJCQkJCQotCQkJfQkJCQkJCQotCQl9Ci0JfSk7CQkKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKHRhYmxlLmdldEl0ZW0oMCkpOwotCXNoZWxsLnNldFNpemUoNTAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7CQotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjM2OTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJhY2tlciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyYWNrZXIgKGRyYWcgb24gbW91c2UgZG93bikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJVHJhY2tlciB0cmFja2VyID0gbmV3IFRyYWNrZXIgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQl0cmFja2VyLnNldFJlY3RhbmdsZXMgKG5ldyBSZWN0YW5nbGUgW10gewotCQkJCW5ldyBSZWN0YW5nbGUgKGUueCwgZS55LCAxMDAsIDEwMCksCi0JCQl9KTsKLQkJCXRyYWNrZXIub3BlbiAoKTsKLQkJfQotCX0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDYyZGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IEltYWdlcyBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGEgVGFibGVJdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzAgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIEltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiSW1hZ2VzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBUYWJsZUl0ZW0iKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQgKCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwkJCQotCWludCBjb2x1bW5Db3VudCA9IDM7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwkKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDg7Ci0JZm9yKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaXRlbSAiK2krIiBhIiwgIml0ZW0gIitpKyIgYiIsICJpdGVtICIraSsiIGMifSk7Ci0JfQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCQotCQkJc3dpdGNoKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5NZWFzdXJlSXRlbTogewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlldmVudC53aWR0aCArPSByZWN0LndpZHRoOwotCQkJCQlldmVudC5oZWlnaHQgPSBNYXRoLm1heChldmVudC5oZWlnaHQsIHJlY3QuaGVpZ2h0ICsgMik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJaW50IHggPSBldmVudC54ICsgZXZlbnQud2lkdGg7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQpIC8gMik7Ci0JCQkJCWV2ZW50LmdjLmRyYXdJbWFnZShpbWFnZSwgeCwgZXZlbnQueSArIG9mZnNldCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07CQkKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwkJCi0KLQlmb3IoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOwotCX0JCi0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmNzhlMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBleGFtcGxlIHNuaXBwZXQ6IE11bHRpcGxlIGxpbmVzIHBlciBUYWJsZUl0ZW0KLSAqCi0gKiBGb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGlzIHNuaXBwZXQgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtQ3VzdG9tRHJhd2luZ1RhYmxlQW5kVHJlZUl0ZW1zL2N1c3RvbURyYXcuaHRtI19leGFtcGxlNgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzEgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gNDsKLQlmaW5hbCBpbnQgSVRFTV9DT1VOVCA9IDg7Ci0JZmluYWwgaW50IFRFWFRfTUFSR0lOID0gMzsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgQ09MVU1OX0NPVU5UOyBpKyspIHsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgSVRFTV9DT1VOVDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IENPTFVNTl9DT1VOVDsgaisrKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIml0ZW0gIiArIGkgKyAiIGNvbCAiICsgajsKLQkJCWlmICgoaSArIGopICUgMyA9PSAxKSB7Ci0JCQkJc3RyaW5nICs9IlxubmV3IGxpbmUxIjsKLQkJCX0KLQkJCWlmICgoaSArIGopICUgMyA9PSAyKSB7Ci0JCQkJc3RyaW5nICs9IlxubmV3IGxpbmUxXG5uZXcgbGluZTIiOwotCQkJfQotCQkJaXRlbS5zZXRUZXh0KGosIHN0cmluZyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlTdHJpbmcgdGV4dCA9IGl0ZW0uZ2V0VGV4dChldmVudC5pbmRleCk7Ci0JCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsKLQkJCWV2ZW50LndpZHRoID0gc2l6ZS54ICsgMiAqIFRFWFRfTUFSR0lOOwotCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCBzaXplLnkgKyBURVhUX01BUkdJTik7Ci0JCX0KLQl9KTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kZXRhaWwgJj0gflNXVC5GT1JFR1JPVU5EOwotCQl9Ci0JfSk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlTdHJpbmcgdGV4dCA9IGl0ZW0uZ2V0VGV4dChldmVudC5pbmRleCk7Ci0JCQkvKiBjZW50ZXIgY29sdW1uIDEgdmVydGljYWxseSAqLwotCQkJaW50IHlPZmZzZXQgPSAwOwotCQkJaWYgKGV2ZW50LmluZGV4ID09IDEpIHsKLQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsKLQkJCQl5T2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHNpemUueSkgLyAyKTsKLQkJCX0KLQkJCWV2ZW50LmdjLmRyYXdUZXh0KHRleHQsIGV2ZW50LnggKyBURVhUX01BUkdJTiwgZXZlbnQueSArIHlPZmZzZXQsIHRydWUpOwotCQl9Ci0JfSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IENPTFVNTl9DT1VOVDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0JfQotCXRhYmxlLnBhY2soKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhMmNmYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBEcmF3IGEgYmFyIGdyYXBoCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzIgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwkJCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXNoZWxsLnNldFRleHQoIlNob3cgcmVzdWx0cyBhcyBhIGJhciBjaGFydCBpbiBUcmVlIik7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRUZXh0KCJCdWcgU3RhdHVzIik7Ci0JY29sdW1uMS5zZXRXaWR0aCgxMDApOwotCWZpbmFsIFRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQljb2x1bW4yLnNldFRleHQoIlBlcmNlbnQiKTsKLQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JU3RyaW5nW10gc3RhdGVzID0gbmV3IFN0cmluZ1tdeyJSZXNvbHZlZCIsICJOZXciLCAiV29uJ3QgRml4IiwgIkludmFsaWQifTsKLQlTdHJpbmdbXSB0ZWFtcyA9IG5ldyBTdHJpbmdbXSB7IlVJIiwgIlNXVCIsICJPU0dJIn07Ci0JZm9yIChpbnQgaT0wOyBpPHRlYW1zLmxlbmd0aDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQodGVhbXNbaV0pOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHN0YXRlcy5sZW5ndGg7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoc3RhdGVzW2pdKTsJCi0JCX0KLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlpbnRbXSBwZXJjZW50cyA9IG5ldyBpbnRbXSB7NTAsIDMwLCA1LCAxNX07Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuaW5kZXggPT0gMSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlUcmVlSXRlbSBwYXJlbnQgPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQkJaW50IGluZGV4ID0gcGFyZW50LmluZGV4T2YoaXRlbSk7Ci0JCQkJCWludCBwZXJjZW50ID0gcGVyY2VudHNbaW5kZXhdOwotCQkJCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCQlDb2xvciBiYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCQkJCQlpbnQgd2lkdGggPSAoY29sdW1uMi5nZXRXaWR0aCgpIC0gMSkgKiBwZXJjZW50IC8gMTAwOwotCQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoZXZlbnQueCwgZXZlbnQueSwgd2lkdGgsIGV2ZW50LmhlaWdodCwgdHJ1ZSk7CQkJCQkKLQkJCQkJUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aC0xLCBldmVudC5oZWlnaHQtMSk7Ci0JCQkJCWdjLmRyYXdSZWN0YW5nbGUocmVjdDIpOwotCQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOwotCQkJCQlTdHJpbmcgdGV4dCA9IHBlcmNlbnQrIiUiOwotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsJCQkJCQotCQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHNpemUueSkgLyAyKTsKLQkJCQkJZ2MuZHJhd1RleHQodGV4dCwgZXZlbnQueCsyLCBldmVudC55K29mZnNldCwgdHJ1ZSk7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoYmFja2dyb3VuZCk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoZm9yZWdyb3VuZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7CQkKLQkJCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDQxMmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGRpYWxvZyBzaGVsbCBhbmQgcG9zaXRpb24gaXQKLSAqIHdpdGggdXBwZXIgbGVmdCBjb3JuZXIgYXQgY3Vyc29yIHBvc2l0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzMyB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQgKCJQYXJlbnQgU2hlbGwiKTsKLQkJc2hlbGwuYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93biAoTW91c2VFdmVudCBlKSB7Ci0JCQkJU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsIChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCQlQb2ludCBwdCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQkJZGlhbG9nLnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCQlkaWFsb2cuc2V0VGV4dCAoIkRpYWxvZyBTaGVsbCIpOwotCQkJCWRpYWxvZy5zZXRTaXplICgxMDAsIDEwMCk7Ci0JCQkJZGlhbG9nLm9wZW4gKCk7IAotCQkJfX0pOwotCQlzaGVsbC5zZXRTaXplICg0MDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUzOWFkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IEZpeGVkIGZpcnN0IGNvbHVtbiBhbmQgaG9yaXpvbnRhbCBzY3JvbGwgcmVtYWluaW5nIGNvbHVtbnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzNCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlpbnQgcm93Q291bnQgPSA0MDsKLQlpbnQgY29sdW1uQ291bnQgPSAxNTsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQotCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JZmluYWwgVGFibGUgbGVmdFRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQlsZWZ0VGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5GSUxMLCBmYWxzZSwgdHJ1ZSkpOwotCWxlZnRUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWZpbmFsIFRhYmxlIHJpZ2h0VGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXJpZ2h0VGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlHcmlkRGF0YSB0YWJsZTJEYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMik7Ci0JcmlnaHRUYWJsZS5zZXRMYXlvdXREYXRhKHRhYmxlMkRhdGEpOwotCS8vIENyZWF0ZSBjb2x1bW5zCi0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbihsZWZ0VGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4xLnNldFRleHQoIk5hbWUiKTsKLQljb2x1bW4xLnNldFdpZHRoKDE1MCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihyaWdodFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJWYWx1ZSAiK2kpOwotCQljb2x1bW4uc2V0V2lkdGgoMjAwKTsKLQl9Ci0JLy8gQ3JlYXRlIHJvd3MKLQlmb3IgKGludCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGxlZnRUYWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIml0ZW0gIitpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0ocmlnaHRUYWJsZSwgU1dULk5PTkUpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dChqLCAiSXRlbSAiK2krIiB2YWx1ZSBAICIraik7Ci0JCX0KLQl9Ci0JLy8gTWFrZSBzZWxlY3Rpb24gdGhlIHNhbWUgaW4gYm90aCB0YWJsZXMKLQlsZWZ0VGFibGUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJcmlnaHRUYWJsZS5zZXRTZWxlY3Rpb24obGVmdFRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCX0KLQl9KTsKLQlyaWdodFRhYmxlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWxlZnRUYWJsZS5zZXRTZWxlY3Rpb24ocmlnaHRUYWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQl9Ci0JfSk7Ci0JLy8gT24gV2luZG93cywgdGhlIHNlbGVjdGlvbiBpcyBncmF5IGlmIHRoZSB0YWJsZSBkb2VzIG5vdCBoYXZlIGZvY3VzLgotCS8vIFRvIG1ha2UgYm90aCB0YWJsZXMgYXBwZWFyIGluIGZvY3VzLCBkcmF3IHRoZSBzZWxlY3Rpb24gYmFja2dyb3VuZCBoZXJlLgotCS8vIFRoaXMgcGFydCBvbmx5IHdvcmtzIG9uIHZlcnNpb24gMy4yIG9yIGxhdGVyLgotCUxpc3RlbmVyIGVyYXNlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kZXRhaWwgJj0gflNXVC5IT1Q7Ci0JCQlpZigoZXZlbnQuZGV0YWlsICYgU1dULlNFTEVDVEVEKSAhPSAwKSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGV2ZW50LmdldEJvdW5kcygpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT05fVEVYVCkpOwotCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QpOwotCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULlNFTEVDVEVEOwkJCQkJCi0JCQl9Ci0JCX0KLQl9OwotCQotCWxlZnRUYWJsZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBlcmFzZUxpc3RlbmVyKTsKLQlyaWdodFRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIGVyYXNlTGlzdGVuZXIpOwotCS8vIE1ha2UgdmVydGljYWwgc2Nyb2xsYmFycyBzY3JvbGwgdG9nZXRoZXIKLQlTY3JvbGxCYXIgdkJhckxlZnQgPSBsZWZ0VGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLQl2QmFyTGVmdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlyaWdodFRhYmxlLnNldFRvcEluZGV4KGxlZnRUYWJsZS5nZXRUb3BJbmRleCgpKTsKLQkJfQotCX0pOwotCVNjcm9sbEJhciB2QmFyUmlnaHQgPSByaWdodFRhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci0JdkJhclJpZ2h0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWxlZnRUYWJsZS5zZXRUb3BJbmRleChyaWdodFRhYmxlLmdldFRvcEluZGV4KCkpOwotCQl9Ci0JfSk7Ci0JLy8gSG9yaXpvbnRhbCBiYXIgb24gc2Vjb25kIHRhYmxlIHRha2VzIHVwIGEgbGl0dGxlIGV4dHJhIHNwYWNlLgotCS8vIFRvIGtlZXAgdmVydGljYWwgc2Nyb2xsIGJhcnMgaW4gc2luaywgZm9yY2UgdGFibGUxIHRvIGVuZCBhYm92ZQotCS8vIGhvcml6b250YWwgc2Nyb2xsYmFyCi0JU2Nyb2xsQmFyIGhCYXJSaWdodCA9IHJpZ2h0VGFibGUuZ2V0SG9yaXpvbnRhbEJhcigpOwotCUxhYmVsIHNwYWNlciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkRGF0YSBzcGFjZXJEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0Jc3BhY2VyRGF0YS5oZWlnaHRIaW50ID0gaEJhclJpZ2h0LmdldFNpemUoKS55OwotCXNwYWNlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQlwYXJlbnQuc2V0QmFja2dyb3VuZChsZWZ0VGFibGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkKLQlzaGVsbC5zZXRTaXplKDYwMCwgNDAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1N2E1OWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IGEgc3lzdGVtIHNldHRpbmdzIGNoYW5nZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjM1IHsKLQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGhlIFNXVC5TZXR0aW5ncyBFdmVudCIpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULldSQVApOwotCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCWxhYmVsLnNldFRleHQoIkNoYW5nZSBhIHN5c3RlbSBzZXR0aW5nIGFuZCB0aGUgdGFibGUgYmVsb3cgd2lsbCBiZSB1cGRhdGVkLiIpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4uc2V0V2lkdGgoMTUwKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbG9ySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoY29sb3JJZHNbaV0pOwotCQlpdGVtLnNldFRleHQoMCwgY29sb3JOYW1lc1tpXSk7Ci0JCWl0ZW0uc2V0QmFja2dyb3VuZCgxLCBjb2xvcik7Ci0JCWl0ZW0uc2V0VGV4dCgyLCBjb2xvci50b1N0cmluZygpKTsKLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWNvbHVtbnNbMF0ucGFjaygpOwotCWNvbHVtbnNbMl0ucGFjaygpOwotCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULlNldHRpbmdzLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbG9ySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKGNvbG9ySWRzW2ldKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0oaSk7Ci0JCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKDEsIGNvbG9yKTsKLQkJCX0KLQkJCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCWNvbHVtbnNbMF0ucGFjaygpOwotCQkJY29sdW1uc1syXS5wYWNrKCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXN0YXRpYyBpbnRbXSBjb2xvcklkcyA9IG5ldyBpbnRbXSB7U1dULkNPTE9SX0lORk9fQkFDS0dST1VORCwgCi0JCVNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQsIAotCQlTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5ELAotCQlTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5ELAotCQlTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04sCi0JCVNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhULAotCQlTV1QuQ09MT1JfVElUTEVfQkFDS0dST1VORCwKLQkJU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkRfR1JBRElFTlQsCi0JCVNXVC5DT0xPUl9USVRMRV9GT1JFR1JPVU5ELAotCQlTV1QuQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORCwKLQkJU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0JBQ0tHUk9VTkRfR1JBRElFTlQsCi0JCVNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9GT1JFR1JPVU5ELAotCQlTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQsCi0JCVNXVC5DT0xPUl9XSURHRVRfQk9SREVSLAotCQlTV1QuQ09MT1JfV0lER0VUX0RBUktfU0hBRE9XLAotCQlTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVywKLQkJU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1csCi0JCVNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVyx9Owotc3RhdGljIFN0cmluZyBbXSBjb2xvck5hbWVzID0gbmV3IFN0cmluZ1tdIHsiU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCIsCi0JCSJTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EIiwgCi0JCSJTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQiLAotCQkiU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OIiwKLQkJIlNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9CQUNLR1JPVU5EX0dSQURJRU5UIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9GT1JFR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5EX0dSQURJRU5UIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9GT1JFR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX0JPUkRFUiIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX0RBUktfU0hBRE9XIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX0hJR0hMSUdIVF9TSEFET1ciLAotCQkiU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1ciLAotCQkiU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XIix9OwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmY1N2ViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogZHJhdyBkaWZmZXJlbnQgZm9yZWdyb3VuZCBjb2xvcnMgZm9yIHRleHQgaW4gYSBUYWJsZUl0ZW0uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGFibGU6IENoYW5nZSBzdHlsZSBtdWx0aXBsZSB0aW1lcyBpbiBjZWxsIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7CQkJCi0JfQotCWZpbmFsIFRleHRMYXlvdXQgdGV4dExheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCXRleHRMYXlvdXQuc2V0VGV4dCgiU1dUOiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCIpOwotCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTQsIFNXVC5CT0xEKTsKLQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgIlRhaG9tYSIsIDEwLCBTV1QuTk9STUFMKTsKLQlGb250IGZvbnQzID0gbmV3IEZvbnQoZGlzcGxheSwgIlRhaG9tYSIsIDE0LCBTV1QuSVRBTElDKTsKLQlUZXh0U3R5bGUgc3R5bGUxID0gbmV3IFRleHRTdHlsZShmb250MSwgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSksIG51bGwpOwotCVRleHRTdHlsZSBzdHlsZTIgPSBuZXcgVGV4dFN0eWxlKGZvbnQyLCBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9NQUdFTlRBKSwgbnVsbCk7Ci0JVGV4dFN0eWxlIHN0eWxlMyA9IG5ldyBUZXh0U3R5bGUoZm9udDMsIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCksIG51bGwpOwotCXRleHRMYXlvdXQuc2V0U3R5bGUoc3R5bGUxLCAwLCAwKTsgdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTEsIDUsIDEyKTsKLQl0ZXh0TGF5b3V0LnNldFN0eWxlKHN0eWxlMiwgMSwgMSk7IHRleHRMYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCAxNCwgMTkpOwotCXRleHRMYXlvdXQuc2V0U3R5bGUoc3R5bGUzLCAyLCAyKTsgdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTMsIDIxLCAyNyk7Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXRleHRMYXlvdXQuZHJhdyhldmVudC5nYywgZXZlbnQueCwgZXZlbnQueSk7Ci0JCX0KLQl9KTsKLQlmaW5hbCBSZWN0YW5nbGUgdGV4dExheW91dEJvdW5kcyA9IHRleHRMYXlvdXQuZ2V0Qm91bmRzKCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWUud2lkdGggPSB0ZXh0TGF5b3V0Qm91bmRzLndpZHRoICsgMjsKLQkJCWUuaGVpZ2h0ID0gdGV4dExheW91dEJvdW5kcy5oZWlnaHQgKyAyOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9udDEuZGlzcG9zZSgpOwotCWZvbnQyLmRpc3Bvc2UoKTsKLQlmb250My5kaXNwb3NlKCk7Ci0JdGV4dExheW91dC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODIzZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogQ29tcG9zaXRlIFNuaXBwZXQ6IGluaGVyaXQgYSBiYWNrZ3JvdW5kIGNvbG9yIG9yIGltYWdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJDb21wb3NpdGUuc2V0QmFja2dyb3VuZE1vZGUoKSIpOwotCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQ1lBTik7Ci0JCi0JR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRUZXh0KCJTV1QuSU5IRVJJVF9OT05FIik7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZE1vZGUoU1dULklOSEVSSVRfTk9ORSk7Ci0JY3JlYXRlQ2hpbGRyZW4oZ3JvdXApOwotCQotCWdyb3VwID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JZ3JvdXAuc2V0VGV4dCgiU1dULklOSEVSSVRfREVGQVVMVCIpOwotCWdyb3VwLnNldEJhY2tncm91bmRNb2RlKFNXVC5JTkhFUklUX0RFRkFVTFQpOwotCWNyZWF0ZUNoaWxkcmVuKGdyb3VwKTsKLQkKLQlncm91cCA9IG5ldyBHcm91cChzaGVsbCwgU1dULk5PTkUpOwotCWdyb3VwLnNldEJhY2tncm91bmQoY29sb3IpOwotCWdyb3VwLnNldFRleHQoIlNXVC5JTkhFUklUX0ZPUkNFIik7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZE1vZGUoU1dULklOSEVSSVRfRk9SQ0UpOwotCWNyZWF0ZUNoaWxkcmVuKGdyb3VwKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci1zdGF0aWMgdm9pZCBjcmVhdGVDaGlsZHJlbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCUxpc3QgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JbGlzdC5hZGQoIkxpc3QgaXRlbSAxIik7Ci0JbGlzdC5hZGQoIkxpc3QgaXRlbSAyIik7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiTGFiZWwiKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0JYnV0dG9uLnNldFRleHQoIlJhZGlvIEJ1dHRvbiIpOwotCWJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWJ1dHRvbi5zZXRUZXh0KCJDaGVjayBib3ggQnV0dG9uIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiUHVzaCBCdXR0b24iKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiVGV4dCIpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTZjZTA0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHBvcHVwIG1lbnUgd2l0aCBhIHN1Ym1lbnUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JY29tcG9zaXRlLnNldFNpemUgKDEwMCwgMTAwKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCU1lbnVJdGVtIGl0ZW0xID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbTEuc2V0VGV4dCAoIlB1c2ggSXRlbSIpOwotCU1lbnVJdGVtIGl0ZW0yID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbTIuc2V0VGV4dCAoIkNhc2NhZGUgSXRlbSIpOwotCU1lbnUgc3ViTWVudSA9IG5ldyBNZW51IChtZW51KTsKLQlpdGVtMi5zZXRNZW51IChzdWJNZW51KTsKLQlNZW51SXRlbSBzdWJJdGVtMSA9IG5ldyBNZW51SXRlbSAoc3ViTWVudSwgU1dULlBVU0gpOwotCXN1Ykl0ZW0xLnNldFRleHQgKCJTdWJpdGVtIDEiKTsKLQlNZW51SXRlbSBzdWJJdGVtMiA9IG5ldyBNZW51SXRlbSAoc3ViTWVudSwgU1dULlBVU0gpOwotCXN1Ykl0ZW0yLnNldFRleHQgKCJTdWJpdGVtIDIiKTsKLQljb21wb3NpdGUuc2V0TWVudSAobWVudSk7Ci0Jc2hlbGwuc2V0TWVudSAobWVudSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3MzJlMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRhYmxlIHNuaXBwZXQ6IG1ha2UgdGV4dCBzcGFuIG11bHRpcGxlIGNvbHVtbnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzOSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlRleHQgc3BhbnMgdHdvIGNvbHVtbnMgaW4gYSBUYWJsZUl0ZW0iKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JaW50IGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoMCwgIml0ZW0gIitpKyIgYSIpOwotCQlpdGVtLnNldFRleHQoMywgIml0ZW0gIitpKyIgZCIpOwotCX0JCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQlmaW5hbCBTdHJpbmcgc3RyaW5nID0gInRleHQgdGhhdCBzcGFucyB0d28gY29sdW1ucyI7Ci0JR0MgZ2MgPSBuZXcgR0ModGFibGUpOwotCWZpbmFsIFBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2goZXZlbnQudHlwZSkgewkJCi0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJaWYgKGV2ZW50LmluZGV4ID09IDEgfHwgZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJZXZlbnQud2lkdGggPSBleHRlbnQueC8yOwotCQkJCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCBleHRlbnQueSArIDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJaWYgKGV2ZW50LmluZGV4ID09IDEgfHwgZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJaW50IG9mZnNldCA9IDA7Ci0JCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSB0YWJsZS5nZXRDb2x1bW4oMSk7Ci0JCQkJCQkJb2Zmc2V0ID0gY29sdW1uMS5nZXRXaWR0aCgpOwotCQkJCQkJfQotCQkJCQkJZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJCQkJaW50IHkgPSBldmVudC55ICsgKGV2ZW50LmhlaWdodCAtIGV4dGVudC55KS8yOwotCQkJCQkJZXZlbnQuZ2MuZHJhd1N0cmluZyhzdHJpbmcsIGV2ZW50LnggLSBvZmZzZXQsIHksIHRydWUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBwYWludExpc3RlbmVyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTQ0YWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgQ1IgaW4gYSB0ZXh0IG9yIGNvbWJvIGNvbnRyb2wgKGRlZmF1bHQgc2VsZWN0aW9uKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChzaGVsbCwgU1dULk5PTkUpOwotCWNvbWJvLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiQS0xIiwgIkItMSIsICJDLTEifSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRUZXh0ICgic29tZSB0ZXh0Iik7Ci0JY29tYm8uYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuIChlLndpZGdldCArICIgLSBEZWZhdWx0IFNlbGVjdGlvbiIpOwotCQl9Ci0JfSk7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGUud2lkZ2V0ICsgIiAtIERlZmF1bHQgU2VsZWN0aW9uIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4YTFiNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUcmVlIHNuaXBwZXQ6IFRleHQgdGhhdCBzcGFucyBtdWx0aXBsZSBjb2x1bW5zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlRleHQgc3BhbnMgdHdvIGNvbHVtbnMgaW4gYSBUcmVlSXRlbSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWludCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwkKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KDAsICJpdGVtICIraSsiIGEiKTsKLQkJaXRlbS5zZXRUZXh0KDMsICJpdGVtICIraSsiIGQiKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKLQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJc3ViSXRlbS5zZXRUZXh0KDAsICJzdWJJdGVtICIraSsiLSIraisiIGEiKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgzLCAic3ViSXRlbSAiK2krIi0iK2orIiBkIik7Ci0JCX0KLQl9CQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JZmluYWwgU3RyaW5nIHN0cmluZyA9ICJ0ZXh0IHRoYXQgc3BhbnMgdHdvIGNvbHVtbnMiOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCWZpbmFsIFBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2goZXZlbnQudHlwZSkgewkJCi0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJaWYgKGV2ZW50LmluZGV4ID09IDEgfHwgZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJZXZlbnQud2lkdGggPSBleHRlbnQueC8yOwotCQkJCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCBleHRlbnQueSArIDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJaWYgKGV2ZW50LmluZGV4ID09IDEgfHwgZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJaW50IG9mZnNldCA9IDA7Ci0JCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJCVRyZWVDb2x1bW4gY29sdW1uMSA9IHRyZWUuZ2V0Q29sdW1uKDEpOwotCQkJCQkJCW9mZnNldCA9IGNvbHVtbjEuZ2V0V2lkdGgoKTsKLQkJCQkJCX0KLQkJCQkJCWV2ZW50LmdjLnNldEZvcmVncm91bmQocmVkKTsKLQkJCQkJCWludCB5ID0gZXZlbnQueSArIChldmVudC5oZWlnaHQgLSBleHRlbnQueSkvMjsKLQkJCQkJCWV2ZW50LmdjLmRyYXdTdHJpbmcoc3RyaW5nLCBldmVudC54IC0gb2Zmc2V0LCB5LCB0cnVlKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0cmVlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0JfQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZjFlODMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUZXh0IHNuaXBwZXQ6IE92ZXJyaWRlIFRhYiBiZWhhdmlvciB0byB0cmF2ZXJzZSBvdXQgb2YgYSBUZXh0LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsMTAsMjAwLDIwMCk7Ci0JVGV4dCB0ZXh0MSA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JdGV4dDEuc2V0Qm91bmRzKDEwLDEwLDE1MCw1MCk7Ci0JdGV4dDEuc2V0VGV4dCgiVGFiIHdpbGwgdHJhdmVyc2Ugb3V0IGZyb20gaGVyZS4iKTsKLQl0ZXh0MS5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpIHsKLQkJCQllLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfSk7Ci0JVGV4dCB0ZXh0MiA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JdGV4dDIuc2V0Qm91bmRzKDEwLDEwMCwxNTAsNTApOwotCXRleHQyLnNldFRleHQoIkJ1dCBUYWIgd2lsbCBOT1QgdHJhdmVyc2Ugb3V0IGZyb20gaGVyZSAoQ3RybCtUYWIgd2lsbCkuIik7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0MjczYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIEN1cnNvciBzbmlwcGV0OiBIaWRlIHRoZSBDdXJzb3Igb3ZlciBhIGNvbnRyb2wuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljYW52YXMuc2V0Qm91bmRzKDEwLDUwLDE1MCwxMDApOwotCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQllLmdjLmRyYXdTdHJpbmcoImhpZGUgQ3Vyc29yIGhlcmUiLCAxMCwgMTApOwotCQl9Ci0JfSk7Ci0KLQkvLyBjcmVhdGUgYSBjdXJzb3Igd2l0aCBhIHRyYW5zcGFyZW50IGltYWdlCi0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHt3aGl0ZS5nZXRSR0IoKSwgYmxhY2suZ2V0UkdCKCl9KTsKLQlJbWFnZURhdGEgc291cmNlRGF0YSA9IG5ldyBJbWFnZURhdGEgKDE2LCAxNiwgMSwgcGFsZXR0ZSk7Ci0Jc291cmNlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gMDsKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBzb3VyY2VEYXRhLCAwLCAwKTsKLQotCXNoZWxsLm9wZW4oKTsKLQljYW52YXMuc2V0Q3Vyc29yKGN1cnNvcik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjQyZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUZXh0IHNuaXBwZXQ6IHR5cGUgaW4gb25lIHRleHQsIG91dHB1dCB0byBhbm90aGVyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRleHQgdGV4dDAgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWZpbmFsIFRleHQgdGV4dDEgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQwLmFkZFZlcmlmeUxpc3RlbmVyIChuZXcgVmVyaWZ5TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0IChWZXJpZnlFdmVudCBldmVudCkgewotCQkJdGV4dDEuc2V0VG9wSW5kZXggKHRleHQwLmdldFRvcEluZGV4ICgpKTsKLQkJCXRleHQxLnNldFNlbGVjdGlvbiAoZXZlbnQuc3RhcnQsIGV2ZW50LmVuZCk7Ci0JCQl0ZXh0MS5pbnNlcnQgKGV2ZW50LnRleHQpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTdkZmU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogU3R5bGVkVGV4dCBzbmlwcGV0OiBEcmF3IGEgYm94IGFyb3VuZCB0ZXh0LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ0IHsKLQlzdGF0aWMgU3RyaW5nIFNFQVJDSF9TVFJJTkcgPSAiYm94IjsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgICAgIGZpbmFsIENvbG9yIFJFRCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgICAgICBzaGVsbC5zZXRCb3VuZHMoMTAsMTAsMjUwLDI1MCk7Ci0gICAgICAgIGZpbmFsIFN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRleHQuc2V0Qm91bmRzKDEwLDEwLDIwMCwyMDApOwotICAgICAgICB0ZXh0LmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgY29udGVudHMgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlpbnQgc3RyaW5nV2lkdGggPSBldmVudC5nYy5zdHJpbmdFeHRlbnQoU0VBUkNIX1NUUklORykueDsKLQkJCQlpbnQgbGluZUhlaWdodCA9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCQkJCWV2ZW50LmdjLnNldEZvcmVncm91bmQoUkVEKTsKLQkJCQlpbnQgaW5kZXggPSBjb250ZW50cy5pbmRleE9mKFNFQVJDSF9TVFJJTkcpOwotCQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCQlQb2ludCB0b3BMZWZ0ID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KGluZGV4KTsKLQkJCQkJZXZlbnQuZ2MuZHJhd1JlY3RhbmdsZSh0b3BMZWZ0LnggLSAxLCB0b3BMZWZ0LnksIHN0cmluZ1dpZHRoICsgMSwgbGluZUhlaWdodCAtIDEpOwotCQkJCQlpbmRleCA9IGNvbnRlbnRzLmluZGV4T2YoU0VBUkNIX1NUUklORywgaW5kZXggKyAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotICAgICAgICB0ZXh0LnNldFRleHQoIlRoaXMgZGVtb25zdHJhdGVzIGRyYXdpbmcgYSBib3hcbmFyb3VuZCBldmVyeSBvY2N1cnJlbmNlIG9mIHRoZSB3b3JkXG5ib3ggaW4gdGhlIFN0eWxlZFRleHQiKTsKLSAgICAgICAgc2hlbGwub3BlbigpOwotICAgICAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGI4NDI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogQ2FudmFzIHNuaXBwZXQ6IHBhaW50IGEgY2lyY2xlIGluIGEgY2FudmFzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEoKTsKLQkJCWV2ZW50LmdjLmRyYXdPdmFsKDAsIDAsIHJlY3Qud2lkdGggLSAxLCByZWN0LmhlaWdodCAtIDEpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTE4NmI3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBXcml0ZSBhbiBJbWFnZSB0byBhIFBORyBmaWxlLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiQ29taWMgU2FucyBNUyIsIDI0LCBTV1QuQk9MRCk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDg3LCA0OCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZHJhd1N0cmluZygiUyIsIDMsIDApOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JCWdjLmRyYXdTdHJpbmcoIlciLCAyNSwgMCk7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQlnYy5kcmF3U3RyaW5nKCJUIiwgNjIsIDApOwotCQlnYy5kaXNwb3NlKCk7Ci0KLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHtpbWFnZS5nZXRJbWFnZURhdGEoKX07Ci0JCWxvYWRlci5zYXZlKCJzd3QucG5nIiwgU1dULklNQUdFX1BORyk7Ci0KLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA1MDBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogYWxsb3cgYSBtdWx0aS1saW5lIHRleHQgdG8gcHJvY2VzcyB0aGUgZGVmYXVsdCBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0NyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCVN0cmluZyBtb2RpZmllciA9IFNXVC5NT0QxID09IFNXVC5DVFJMID8gIkN0cmwiIDogIkNvbW1hbmQiOwotCXRleHQuc2V0VGV4dCgiSGl0ICIgKyBtb2RpZmllciArICIrUmV0dXJuXG50byBzZWVcbnRoZSBkZWZhdWx0IGJ1dHRvblxucnVuIik7Ci0JdGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5NT0QxKSAhPSAwKSBlLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnBhY2soKTsKLQlidXR0b24uc2V0VGV4dCgiT0siKTsKLQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9LIHNlbGVjdGVkIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5MGFiZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBhbGxvdyBlc2NhcGUgdG8gY2xvc2UgYSBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDggewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCQlldmVudC5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0pOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiQSBCdXR0b24gKHRoYXQgZG9lc24ndCBwcm9jZXNzIEVzY2FwZSkiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjRhYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFN0YWNrTGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNlIGEgU3RhY2tMYXlvdXQgdG8gc3dpdGNoIGJldHdlZW4gQ29tcG9zaXRlcy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0OSB7Ci0KLQlzdGF0aWMgaW50IHBhZ2VOdW0gPSAtMTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMTAsIDEwLCAzMDAsIDIwMCk7Ci0JLy8gY3JlYXRlIHRoZSBjb21wb3NpdGUgdGhhdCB0aGUgcGFnZXMgd2lsbCBzaGFyZQotCWZpbmFsIENvbXBvc2l0ZSBjb250ZW50UGFuZWwgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JY29udGVudFBhbmVsLnNldEJvdW5kcyAoMTAwLCAxMCwgMTkwLCA5MCk7Ci0JZmluYWwgU3RhY2tMYXlvdXQgbGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0ICgpOwotCWNvbnRlbnRQYW5lbC5zZXRMYXlvdXQgKGxheW91dCk7Ci0KLQkvLyBjcmVhdGUgdGhlIGZpcnN0IHBhZ2UncyBjb250ZW50Ci0JZmluYWwgQ29tcG9zaXRlIHBhZ2UwID0gbmV3IENvbXBvc2l0ZSAoY29udGVudFBhbmVsLCBTV1QuTk9ORSk7Ci0JcGFnZTAuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAocGFnZTAsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiTGFiZWwgb24gcGFnZSAxIik7Ci0JbGFiZWwucGFjayAoKTsKLQotCS8vIGNyZWF0ZSB0aGUgc2Vjb25kIHBhZ2UncyBjb250ZW50CQotCWZpbmFsIENvbXBvc2l0ZSBwYWdlMSA9IG5ldyBDb21wb3NpdGUgKGNvbnRlbnRQYW5lbCwgU1dULk5PTkUpOwotCXBhZ2UxLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHBhZ2UxLCBTV1QuTk9ORSk7Ci0JYnV0dG9uLnNldFRleHQgKCJCdXR0b24gb24gcGFnZSAyIik7Ci0JYnV0dG9uLnBhY2sgKCk7Ci0KLQkvLyBjcmVhdGUgdGhlIGJ1dHRvbiB0aGF0IHdpbGwgc3dpdGNoIGJldHdlZW4gdGhlIHBhZ2VzCi0JQnV0dG9uIHBhZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCXBhZ2VCdXR0b24uc2V0VGV4dCAoIlB1c2giKTsKLQlwYWdlQnV0dG9uLnNldEJvdW5kcyAoMTAsIDEwLCA4MCwgMjUpOwotCXBhZ2VCdXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcGFnZU51bSA9ICsrcGFnZU51bSAlIDI7Ci0JCQlsYXlvdXQudG9wQ29udHJvbCA9IHBhZ2VOdW0gPT0gMCA/IHBhZ2UwIDogcGFnZTE7Ci0JCQljb250ZW50UGFuZWwubGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiYzdlMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBrZXkgc3RhdGUsIGNvZGUgYW5kIGNoYXJhY3RlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUgewotCi1zdGF0aWMgU3RyaW5nIHN0YXRlTWFzayAoaW50IHN0YXRlTWFzaykgewotCVN0cmluZyBzdHJpbmcgPSAiIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5DVFJMKSAhPSAwKSBzdHJpbmcgKz0gIiBDVFJMIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5BTFQpICE9IDApIHN0cmluZyArPSAiIEFMVCI7Ci0JaWYgKChzdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHN0cmluZyArPSAiIFNISUZUIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5DT01NQU5EKSAhPSAwKSBzdHJpbmcgKz0gIiBDT01NQU5EIjsKLQlyZXR1cm4gc3RyaW5nOwotfQotCi1zdGF0aWMgU3RyaW5nIGNoYXJhY3RlciAoY2hhciBjaGFyYWN0ZXIpIHsKLQlzd2l0Y2ggKGNoYXJhY3RlcikgewotCQljYXNlIDA6IAkJcmV0dXJuICInXFwwJyI7Ci0JCWNhc2UgU1dULkJTOglyZXR1cm4gIidcXGInIjsKLQkJY2FzZSBTV1QuQ1I6CXJldHVybiAiJ1xcciciOwotCQljYXNlIFNXVC5ERUw6CXJldHVybiAiREVMIjsKLQkJY2FzZSBTV1QuRVNDOglyZXR1cm4gIkVTQyI7Ci0JCWNhc2UgU1dULkxGOglyZXR1cm4gIidcXG4nIjsKLQkJY2FzZSBTV1QuVEFCOglyZXR1cm4gIidcXHQnIjsKLQl9Ci0JcmV0dXJuICInIiArIGNoYXJhY3RlciArIiciOwotfQotCi1zdGF0aWMgU3RyaW5nIGtleUNvZGUgKGludCBrZXlDb2RlKSB7Ci0Jc3dpdGNoIChrZXlDb2RlKSB7Ci0JCQotCQkvKiBLZXlib2FyZCBhbmQgTW91c2UgTWFza3MgKi8KLQkJY2FzZSBTV1QuQUxUOiAJCXJldHVybiAiQUxUIjsKLQkJY2FzZSBTV1QuU0hJRlQ6IAlyZXR1cm4gIlNISUZUIjsKLQkJY2FzZSBTV1QuQ09OVFJPTDoJcmV0dXJuICJDT05UUk9MIjsKLQkJY2FzZSBTV1QuQ09NTUFORDoJcmV0dXJuICJDT01NQU5EIjsKLQkJCQotCQkvKiBOb24tTnVtZXJpYyBLZXlwYWQgS2V5cyAqLwotCQljYXNlIFNXVC5BUlJPV19VUDoJCXJldHVybiAiQVJST1dfVVAiOwotCQljYXNlIFNXVC5BUlJPV19ET1dOOglyZXR1cm4gIkFSUk9XX0RPV04iOwotCQljYXNlIFNXVC5BUlJPV19MRUZUOglyZXR1cm4gIkFSUk9XX0xFRlQiOwotCQljYXNlIFNXVC5BUlJPV19SSUdIVDoJcmV0dXJuICJBUlJPV19SSUdIVCI7Ci0JCWNhc2UgU1dULlBBR0VfVVA6CQlyZXR1cm4gIlBBR0VfVVAiOwotCQljYXNlIFNXVC5QQUdFX0RPV046CQlyZXR1cm4gIlBBR0VfRE9XTiI7Ci0JCWNhc2UgU1dULkhPTUU6CQkJcmV0dXJuICJIT01FIjsKLQkJY2FzZSBTV1QuRU5EOgkJCXJldHVybiAiRU5EIjsKLQkJY2FzZSBTV1QuSU5TRVJUOgkJcmV0dXJuICJJTlNFUlQiOwotCi0JCS8qIFZpcnR1YWwgYW5kIEFzY2lpIEtleXMgKi8KLQkJY2FzZSBTV1QuQlM6CXJldHVybiAiQlMiOwotCQljYXNlIFNXVC5DUjoJcmV0dXJuICJDUiI7CQkKLQkJY2FzZSBTV1QuREVMOglyZXR1cm4gIkRFTCI7Ci0JCWNhc2UgU1dULkVTQzoJcmV0dXJuICJFU0MiOwotCQljYXNlIFNXVC5MRjoJcmV0dXJuICJMRiI7Ci0JCWNhc2UgU1dULlRBQjoJcmV0dXJuICJUQUIiOwotCQotCQkvKiBGdW5jdGlvbnMgS2V5cyAqLwotCQljYXNlIFNXVC5GMToJcmV0dXJuICJGMSI7Ci0JCWNhc2UgU1dULkYyOglyZXR1cm4gIkYyIjsKLQkJY2FzZSBTV1QuRjM6CXJldHVybiAiRjMiOwotCQljYXNlIFNXVC5GNDoJcmV0dXJuICJGNCI7Ci0JCWNhc2UgU1dULkY1OglyZXR1cm4gIkY1IjsKLQkJY2FzZSBTV1QuRjY6CXJldHVybiAiRjYiOwotCQljYXNlIFNXVC5GNzoJcmV0dXJuICJGNyI7Ci0JCWNhc2UgU1dULkY4OglyZXR1cm4gIkY4IjsKLQkJY2FzZSBTV1QuRjk6CXJldHVybiAiRjkiOwotCQljYXNlIFNXVC5GMTA6CXJldHVybiAiRjEwIjsKLQkJY2FzZSBTV1QuRjExOglyZXR1cm4gIkYxMSI7Ci0JCWNhc2UgU1dULkYxMjoJcmV0dXJuICJGMTIiOwotCQljYXNlIFNXVC5GMTM6CXJldHVybiAiRjEzIjsKLQkJY2FzZSBTV1QuRjE0OglyZXR1cm4gIkYxNCI7Ci0JCWNhc2UgU1dULkYxNToJcmV0dXJuICJGMTUiOwotCQkKLQkJLyogTnVtZXJpYyBLZXlwYWQgS2V5cyAqLwotCQljYXNlIFNXVC5LRVlQQURfQUREOgkJcmV0dXJuICJLRVlQQURfQUREIjsKLQkJY2FzZSBTV1QuS0VZUEFEX1NVQlRSQUNUOglyZXR1cm4gIktFWVBBRF9TVUJUUkFDVCI7Ci0JCWNhc2UgU1dULktFWVBBRF9NVUxUSVBMWToJcmV0dXJuICJLRVlQQURfTVVMVElQTFkiOwotCQljYXNlIFNXVC5LRVlQQURfRElWSURFOgkJcmV0dXJuICJLRVlQQURfRElWSURFIjsKLQkJY2FzZSBTV1QuS0VZUEFEX0RFQ0lNQUw6CXJldHVybiAiS0VZUEFEX0RFQ0lNQUwiOwotCQljYXNlIFNXVC5LRVlQQURfQ1I6CQkJcmV0dXJuICJLRVlQQURfQ1IiOwotCQljYXNlIFNXVC5LRVlQQURfMDoJCQlyZXR1cm4gIktFWVBBRF8wIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzE6CQkJcmV0dXJuICJLRVlQQURfMSI7Ci0JCWNhc2UgU1dULktFWVBBRF8yOgkJCXJldHVybiAiS0VZUEFEXzIiOwotCQljYXNlIFNXVC5LRVlQQURfMzoJCQlyZXR1cm4gIktFWVBBRF8zIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzQ6CQkJcmV0dXJuICJLRVlQQURfNCI7Ci0JCWNhc2UgU1dULktFWVBBRF81OgkJCXJldHVybiAiS0VZUEFEXzUiOwotCQljYXNlIFNXVC5LRVlQQURfNjoJCQlyZXR1cm4gIktFWVBBRF82IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzc6CQkJcmV0dXJuICJLRVlQQURfNyI7Ci0JCWNhc2UgU1dULktFWVBBRF84OgkJCXJldHVybiAiS0VZUEFEXzgiOwotCQljYXNlIFNXVC5LRVlQQURfOToJCQlyZXR1cm4gIktFWVBBRF85IjsKLQkJY2FzZSBTV1QuS0VZUEFEX0VRVUFMOgkJcmV0dXJuICJLRVlQQURfRVFVQUwiOwotCi0JCS8qIE90aGVyIGtleXMgKi8KLQkJY2FzZSBTV1QuQ0FQU19MT0NLOgkJcmV0dXJuICJDQVBTX0xPQ0siOwotCQljYXNlIFNXVC5OVU1fTE9DSzoJCXJldHVybiAiTlVNX0xPQ0siOwotCQljYXNlIFNXVC5TQ1JPTExfTE9DSzoJcmV0dXJuICJTQ1JPTExfTE9DSyI7Ci0JCWNhc2UgU1dULlBBVVNFOgkJCXJldHVybiAiUEFVU0UiOwotCQljYXNlIFNXVC5CUkVBSzoJCQlyZXR1cm4gIkJSRUFLIjsKLQkJY2FzZSBTV1QuUFJJTlRfU0NSRUVOOglyZXR1cm4gIlBSSU5UX1NDUkVFTiI7Ci0JCWNhc2UgU1dULkhFTFA6CQkJcmV0dXJuICJIRUxQIjsKLQl9Ci0JcmV0dXJuIGNoYXJhY3RlciAoKGNoYXIpIGtleUNvZGUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9IGUudHlwZSA9PSBTV1QuS2V5RG93biA/ICJET1dOOiIgOiAiVVAgIDoiOwotCQkJc3RyaW5nICs9ICIgc3RhdGVNYXNrPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUuc3RhdGVNYXNrKSArIHN0YXRlTWFzayAoZS5zdGF0ZU1hc2spICsgIiwiOwotCQkJc3RyaW5nICs9ICIga2V5Q29kZT0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nIChlLmtleUNvZGUpICsgIiAiICsga2V5Q29kZSAoZS5rZXlDb2RlKSArICIsIjsKLQkJCXN0cmluZyArPSAiIGNoYXJhY3Rlcj0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nIChlLmNoYXJhY3RlcikgKyAiICIgKyBjaGFyYWN0ZXIgKGUuY2hhcmFjdGVyKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoc3RyaW5nKTsKLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5LZXlEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5LZXlVcCwgbGlzdGVuZXIpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTkzYmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERhdGVUaW1lIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgRGF0ZVRpbWUgY2FsZW5kYXIgYW5kIGEgRGF0ZVRpbWUgdGltZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCi0JRGF0ZVRpbWUgY2FsZW5kYXIgPSBuZXcgRGF0ZVRpbWUgKHNoZWxsLCBTV1QuQ0FMRU5EQVIpOwotCWNhbGVuZGFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYWxlbmRhciBkYXRlIGNoYW5nZWQiKTsKLQkJfQotCX0pOwotCi0JRGF0ZVRpbWUgdGltZSA9IG5ldyBEYXRlVGltZSAoc2hlbGwsIFNXVC5USU1FKTsKLQl0aW1lLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJ0aW1lIGNoYW5nZWQiKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTdjYTBiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEYXRlVGltZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIERhdGVUaW1lIGNhbGVuZGFyLCBkYXRlLCBhbmQgdGltZSBpbiBhIGRpYWxvZy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlCdXR0b24gb3BlbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jb3Blbi5zZXRUZXh0ICgiT3BlbiBEaWFsb2ciKTsKLQlvcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCQkJZGlhbG9nLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDMsIGZhbHNlKSk7Ci0KLQkJCWZpbmFsIERhdGVUaW1lIGNhbGVuZGFyID0gbmV3IERhdGVUaW1lIChkaWFsb2csIFNXVC5DQUxFTkRBUiB8IFNXVC5CT1JERVIpOwotCQkJZmluYWwgRGF0ZVRpbWUgZGF0ZSA9IG5ldyBEYXRlVGltZSAoZGlhbG9nLCBTV1QuREFURSB8IFNXVC5TSE9SVCk7Ci0JCQlmaW5hbCBEYXRlVGltZSB0aW1lID0gbmV3IERhdGVUaW1lIChkaWFsb2csIFNXVC5USU1FIHwgU1dULlNIT1JUKTsKLQotCQkJbmV3IExhYmVsIChkaWFsb2csIFNXVC5OT05FKTsKLQkJCW5ldyBMYWJlbCAoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQgKCJPSyIpOwotCQkJb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiQ2FsZW5kYXIgZGF0ZSBzZWxlY3RlZCAoTU0vREQvWVlZWSkgPSAiICsgKGNhbGVuZGFyLmdldE1vbnRoICgpICsgMSkgKyAiLyIgKyBjYWxlbmRhci5nZXREYXkgKCkgKyAiLyIgKyBjYWxlbmRhci5nZXRZZWFyICgpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGF0ZSBzZWxlY3RlZCAoTU0vWVlZWSkgPSAiICsgKGRhdGUuZ2V0TW9udGggKCkgKyAxKSArICIvIiArIGRhdGUuZ2V0WWVhciAoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlRpbWUgc2VsZWN0ZWQgKEhIOk1NKSA9ICIgKyB0aW1lLmdldEhvdXJzICgpICsgIjoiICsgdGltZS5nZXRNaW51dGVzICgpKTsKLQkJCQkJZGlhbG9nLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24gKG9rKTsKLQkJCWRpYWxvZy5wYWNrICgpOwotCQkJZGlhbG9nLm9wZW4gKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjY3NTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExpbmVBdHRyaWJ1dGVzIGV4YW1wbGUgc25pcHBldDogZHJhdyAyIHBvbHlsaW5lcyB3aXRoIGRpZmZlcmVudCBsaW5lIGF0dHJpYnV0ZXMuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUyIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJCi0JCQkJZ2Muc2V0TGluZUF0dHJpYnV0ZXMobmV3IExpbmVBdHRyaWJ1dGVzKDEwLCBTV1QuQ0FQX0ZMQVQsIFNXVC5KT0lOX01JVEVSLCBTV1QuTElORV9TT0xJRCwgbnVsbCwgMCwgMTApKTsKLQkJCQlnYy5kcmF3UG9seWxpbmUobmV3IGludFtdezUwLCAxMDAsIDUwLCAyMCwgNjAsIDMwLCA1MCwgNDV9KTsKLQkJCQkKLQkJCQlnYy5zZXRMaW5lQXR0cmlidXRlcyhuZXcgTGluZUF0dHJpYnV0ZXMoMS8yZiwgU1dULkNBUF9GTEFULCBTV1QuSk9JTl9NSVRFUiwgU1dULkxJTkVfRE9ULCBudWxsLCAwLCAxMCkpOwotCQkJCWdjLmRyYXdQb2x5bGluZShuZXcgaW50W117MTAwLCAxMDAsIDEwMCwgMjAsIDExMCwgMzAsIDEwMCwgNDV9KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMWVjOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjb21wdXRlIHRoZSB2aXNpYmxlIHJvd3MgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTMgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCUZpbGxMYXlvdXQgbGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQgKFNXVC5WRVJUSUNBTCk7Ci0JCXNoZWxsLnNldExheW91dCAobGF5b3V0KTsKLQkJZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGk9MDsgaTwzMjsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyAoaSsxKSArICIgaXMgcXVpdGUgbG9uZyIpOwotCQl9Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoIlZpc2libGUgSXRlbXMgW10iKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHRhYmxlLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJaW50IGl0ZW1IZWlnaHQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0ICgpOwotCQkJCWludCBoZWFkZXJIZWlnaHQgPSB0YWJsZS5nZXRIZWFkZXJIZWlnaHQgKCk7Ci0JCQkJaW50IHZpc2libGVDb3VudCA9IChyZWN0LmhlaWdodCAtIGhlYWRlckhlaWdodCArIGl0ZW1IZWlnaHQgLSAxKSAvIGl0ZW1IZWlnaHQ7Ci0JCQkJYnV0dG9uLnNldFRleHQgKCJWaXNpYmxlIEl0ZW1zIFsiICsgdmlzaWJsZUNvdW50ICsgIl0iKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoMjAwLCAyNTApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTgyMGIyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0TGF5b3V0IGV4YW1wbGUgc25pcHBldDogdGV4dCB3aXRoIHVuZGVybGluZSBhbmQgc3RyaWtlIHRocm91Z2gKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTYgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsJCi0Jc2hlbGwuc2V0VGV4dCgiVW5kZXJsaW5lLCBTdHJpa2UgT3V0Iik7Ci0JRm9udCBmb250ID0gc2hlbGwuZ2V0Rm9udCgpOwotCVN0cmluZyB0ZXh0ID0gIkhlcmUgaXMgc29tZSB0ZXh0IHRoYXQgaXMgdW5kZXJsaW5lZCBvciBzdHJ1Y2sgb3V0IG9yIGJvdGguIjsKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dC5zZXRUZXh0KHRleHQpOwotCVRleHRTdHlsZSBzdHlsZTEgPSBuZXcgVGV4dFN0eWxlKGZvbnQsIG51bGwsIG51bGwpOwotCXN0eWxlMS51bmRlcmxpbmUgPSB0cnVlOwotCWxheW91dC5zZXRTdHlsZShzdHlsZTEsIDI2LCAzNSk7Ci0JVGV4dFN0eWxlIHN0eWxlMiA9IG5ldyBUZXh0U3R5bGUoZm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3R5bGUyLnN0cmlrZW91dCA9IHRydWU7Ci0JbGF5b3V0LnNldFN0eWxlKHN0eWxlMiwgNDAsIDQ5KTsKLQlUZXh0U3R5bGUgc3R5bGUzID0gbmV3IFRleHRTdHlsZShmb250LCBudWxsLCBudWxsKTsKLQlzdHlsZTMudW5kZXJsaW5lID0gdHJ1ZTsKLQlzdHlsZTMuc3RyaWtlb3V0ID0gdHJ1ZTsKLQlsYXlvdXQuc2V0U3R5bGUoc3R5bGUzLCA1NCwgNTcpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQkJCWludCB3aWR0aCA9IHNoZWxsLmdldENsaWVudEFyZWEoKS53aWR0aCAtIDIgKiBwb2ludC54OwotCQkJbGF5b3V0LnNldFdpZHRoKHdpZHRoKTsKLQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCBwb2ludC54LCBwb2ludC55KTsJCQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlsYXlvdXQuZGlzcG9zZSgpOwkJCi0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYTY3MTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIHRleHQgc2VsZWN0aW9uIHdpdGhpbiBhIFN0eWxlZFRleHQgd2lkZ2V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjU3IHsKLQotCXN0YXRpYyBTdHJpbmcgc3RyaW5nMSA9ICJBIGRyYWcgc291cmNlIGlzIHRoZSBwcm92aWRlciBvZiBkYXRhIGluIGEgRHJhZyBhbmQgRHJvcCBkYXRhIHRyYW5zZmVyIGFzIHdlbGwgYXMgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgb3JpZ2luYXRvciBvZiB0aGUgRHJhZyBhbmQgRHJvcCBvcGVyYXRpb24uIFRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBkcmFnIHNvdXJjZSAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heSBiZSB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGxvY2F0aW9uIGluIHRoZSBzYW1lIHdpZGdldCwgdG8gYSBkaWZmZXJlbnQgd2lkZ2V0ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLCBvciB0byBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBhbHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIGRyYWcgdGV4dCBmcm9tIHlvdXIgYXBwbGljYXRpb24gYW5kIGRyb3AgaXQgb24gYW4gZW1haWwgYXBwbGljYXRpb24sIG9yIHlvdSAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIGRyYWcgYW4gaXRlbSBpbiBhIHRyZWUgYW5kIGRyb3AgaXQgYmVsb3cgYSBkaWZmZXJlbnQgbm9kZSBpbiB0aGUgc2FtZSB0cmVlLiI7Ci0KLQlzdGF0aWMgU3RyaW5nIERSQUdfU1RBUlRfREFUQSA9ICJEUkFHX1NUQVJUX0RBVEEiOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlzaGVsbC5zZXRTaXplKDEwMCwgMzAwKTsKLQlpbnQgc3R5bGUgPSBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVI7Ci0JZmluYWwgU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIHN0eWxlKTsKLQl0ZXh0LnNldFRleHQoc3RyaW5nMSk7Ci0JZmluYWwgRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSh0ZXh0LCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSk7Ci0Jc291cmNlLnNldERyYWdTb3VyY2VFZmZlY3QobmV3IERyYWdTb3VyY2VFZmZlY3QodGV4dCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5pbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0JCX0KLQl9KTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0JCVBvaW50IHNlbGVjdGlvbjsKLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJCWV2ZW50LmRvaXQgPSBzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueTsKLQkJCXRleHQuc2V0RGF0YShEUkFHX1NUQVJUX0RBVEEsIHNlbGVjdGlvbik7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJCWUuZGF0YSA9IHRleHQuZ2V0VGV4dChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnktMSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJUG9pbnQgbmV3U2VsZWN0aW9uPSB0ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJCWludCBsZW5ndGggPSBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54OwotCQkJCWludCBkZWx0YSA9IDA7Ci0JCQkJaWYgKG5ld1NlbGVjdGlvbi54IDwgc2VsZWN0aW9uLngpCi0JCQkJCWRlbHRhID0gbGVuZ3RoOyAKLQkJCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2Uoc2VsZWN0aW9uLnggKyBkZWx0YSwgbGVuZ3RoLCAiIik7Ci0JCQl9Ci0JCQlzZWxlY3Rpb24gPSBudWxsOwotCQkJdGV4dC5zZXREYXRhKERSQUdfU1RBUlRfREFUQSwgbnVsbCk7Ci0JCX0KLQl9KTsKLQkKLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRleHQsIERORC5EUk9QX0RFRkFVTFQgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTkspOwotCXRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKHRleHQuZ2V0RGF0YShEUkFHX1NUQVJUX0RBVEEpID09IG51bGwpCi0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJZWxzZSAKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWlmICh0ZXh0LmdldERhdGEoRFJBR19TVEFSVF9EQVRBKSA9PSBudWxsKQotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCWVsc2UgCi0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX01PVkU7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TQ1JPTEwgfCBETkQuRkVFREJBQ0tfU0VMRUNUOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsICE9IERORC5EUk9QX05PTkUpIHsKLQkJCQlQb2ludCBzZWxlY3Rpb24gPSAoUG9pbnQpIHRleHQuZ2V0RGF0YShEUkFHX1NUQVJUX0RBVEEpOwotCQkJCWludCBpbnNlcnRQb3MgPSB0ZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFICYmIHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi54IDw9IGluc2VydFBvcyAgJiYgaW5zZXJ0UG9zIDw9IHNlbGVjdGlvbi55IAotCQkJCQkJfHwgZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0NPUFkgJiYgc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnggPCBpbnNlcnRQb3MgICYmIGluc2VydFBvcyA8IHNlbGVjdGlvbi55KSB7Ci0JCQkJCXRleHQuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7ICAvLyBwcmV2ZW50IHNvdXJjZSBmcm9tIGRlbGV0aW5nIHNlbGVjdGlvbgotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKWV2ZW50LmRhdGE7Ci0JCQkJCXRleHQuaW5zZXJ0KHN0cmluZyk7Ci0JCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLQkJCQkJCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoaW5zZXJ0UG9zLCBzdHJpbmcubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjYzN2Y2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBzZWFyY2ggdGV4dCBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TRUFSQ0ggfCBTV1QuQ0FOQ0VMKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAoKHRleHQuZ2V0U3R5bGUoKSAmIFNXVC5DQU5DRUwpID09IDApIHsKLQkJCWltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBTbmlwcGV0MjU4LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImNhbmNlbC5naWYiKSk7Ci0JCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5GTEFUKTsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQkJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0ZXh0LnNldFRleHQoIiIpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlYXJjaCBjYW5jZWxsZWQiKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0ZXh0LnNldFRleHQoIlNlYXJjaCB0ZXh0Iik7Ci0JCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuQ0FOQ0VMKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoIGNhbmNlbGxlZCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoaW5nIGZvcjogIiArIHRleHQuZ2V0VGV4dCgpICsgIi4uLiIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTUzNTRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGV0ZWN0IGRyYWcgaW4gYSBjdXN0b20gY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjU5IHsKLQotc3RhdGljIGNsYXNzIE15TGlzdCBleHRlbmRzIENhbnZhcyB7Ci0JaW50IHNlbGVjdGlvbjsKLQlTdHJpbmcgW10gaXRlbXMgPSBuZXcgU3RyaW5nIFswXTsKLQlzdGF0aWMgZmluYWwgaW50IElOU0VUX1ggPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5TRVRfWSA9IDI7Ci0JCi1zdGF0aWMgaW50IGNoZWNrU3R5bGUgKGludCBzdHlsZSkgewotCXN0eWxlICY9IH4oU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlzdHlsZSB8PSBTV1QuTk9fQkFDS0dST1VORCB8IFNXVC5OT19SRURSQVdfUkVTSVpFOwotCXJldHVybiBzdHlsZTsKLX0KLQotcHVibGljIE15TGlzdCAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0Jc3VwZXIgKHBhcmVudCwgY2hlY2tTdHlsZSAoc3R5bGUpKTsKLQlzdXBlci5zZXREcmFnRGV0ZWN0IChmYWxzZSk7Ci0JYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG93biAoTW91c2VFdmVudCBldmVudCkgewotCQkJR0MgZ2MgPSBuZXcgR0MgKE15TGlzdC50aGlzKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCQlpbnQgaW5kZXggPSAwLCB4ID0gY2xpZW50LnggKyBJTlNFVF9YLCB5ID0gY2xpZW50LnkgKyBJTlNFVF9ZOwotCQkJd2hpbGUgKGluZGV4IDwgaXRlbXMubGVuZ3RoKSB7Ci0JCQkJUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoaXRlbXMgW2luZGV4XSk7Ci0JCQkJUmVjdGFuZ2xlIGl0ZW0gPSBuZXcgUmVjdGFuZ2xlICh4LCB5LCBwdC54LCBwdC55KTsKLQkJCQlpZiAoaXRlbS5jb250YWlucyAoZXZlbnQueCwgZXZlbnQueSkpIGJyZWFrOwotCQkJCXkgKz0gcHQueTsKLQkJCQlpZiAoIWNsaWVudC5jb250YWlucyAoeCwgeSkpIHJldHVybjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCWlmIChpbmRleCA9PSBpdGVtcy5sZW5ndGggfHwgIWNsaWVudC5jb250YWlucyAoeCwgeSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzZWxlY3Rpb24gPSBpbmRleDsKLQkJCXJlZHJhdyAoKTsKLQkJCXVwZGF0ZSAoKTsKLQkJCWRyYWdEZXRlY3QgKGV2ZW50KTsKLQkJfQotCX0pOwotCWFkZFBhaW50TGlzdGVuZXIgKG5ldyBQYWludExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sIChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJQ29sb3IgZm9yZWdyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotCQkJQ29sb3IgYmFja2dyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotCQkJQ29sb3Igc2VsZWN0Rm9yZWdyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUKTsKLQkJCUNvbG9yIHNlbGVjdEJhY2tncm91bmQgPSBldmVudC5kaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCAoZm9yZWdyb3VuZCk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kIChiYWNrZ3JvdW5kKTsKLQkJCU15TGlzdC50aGlzLmRyYXdCYWNrZ3JvdW5kIChnYywgZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQlpbnQgeCA9IElOU0VUX1gsIHkgPSBJTlNFVF9ZOwotCQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoaXRlbXMgW2ldKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kIChpID09IHNlbGVjdGlvbiA/IHNlbGVjdEZvcmVncm91bmQgOiBmb3JlZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kIChpID09IHNlbGVjdGlvbiA/IHNlbGVjdEJhY2tncm91bmQgOiBiYWNrZ3JvdW5kKTsKLQkJCQlnYy5kcmF3U3RyaW5nIChpdGVtcyBbaV0sIHgsIHkpOwotCQkJCXkgKz0gcHQueTsKLQkJCX0KLQkJCQotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZSAoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCUdDIGdjID0gbmV3IEdDICh0aGlzKTsKLQlpbnQgaW5kZXggPSAwLCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0Jd2hpbGUgKGluZGV4IDwgaXRlbXMubGVuZ3RoKSB7Ci0JCVBvaW50IHB0ID0gZ2Muc3RyaW5nRXh0ZW50KGl0ZW1zIFtpbmRleF0pOwotCQl3aWR0aCA9IE1hdGgubWF4ICh3aWR0aCwgcHQueCk7Ci0JCWhlaWdodCArPSBwdC55OwotCQlpbmRleCsrOwotCX0KLQlnYy5kaXNwb3NlICgpOwotCXdpZHRoICs9IElOU0VUX1ggKiAyOwotCWhlaWdodCArPSBJTlNFVF9ZICogMjsKLQlSZWN0YW5nbGUgcmVjdCA9IGNvbXB1dGVUcmltICgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQlyZXR1cm4gbmV3IFBvaW50IChyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgW10gZ2V0SXRlbXMgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCXJldHVybiBpdGVtczsKLX0KLQotcHVibGljIHZvaWQgc2V0SXRlbXMgKFN0cmluZyBbXSBpdGVtcykgewotCWNoZWNrV2lkZ2V0ICgpOwotCWlmIChpdGVtcyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JcmVkcmF3ICgpOwkKLX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCU15TGlzdCB0MSA9IG5ldyBNeUxpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQl0MS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IlNvbWUiLCAiaXRlbXMiLCAiaW4iLCAidGhlIiwgImxpc3QifSk7Ci0JdDEuYWRkRHJhZ0RldGVjdExpc3RlbmVyIChuZXcgRHJhZ0RldGVjdExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0RldGVjdGVkIChEcmFnRGV0ZWN0RXZlbnQgZXZlbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRyYWcgc3RhcnRlZCAuLi4iKTsKLQkJfQotCX0pOwotCU15TGlzdCB0MiA9IG5ldyBNeUxpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQl0Mi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IlNvbWUiLCAiaXRlbXMiLCAiaW4iLCAiYW5vdGhlciIsICJsaXN0In0pOwotCXQyLmFkZERyYWdEZXRlY3RMaXN0ZW5lciAobmV3IERyYWdEZXRlY3RMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdEZXRlY3RlZCAoRHJhZ0RldGVjdEV2ZW50IGV2ZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEcmFnIHN0YXJ0ZWQgLi4uIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NlNWU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbWJvIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29tYm8gYm94IChub24tZWRpdGFibGUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuUkVBRF9PTkxZKTsKLQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkEiLCAiQiIsICJDIn0pOwotCWNvbWJvLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1OTMxYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTW96aWxsYSBpbiBhIEJyb3dzZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNjAgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJc2hlbGwuc2V0VGV4dCgiTW96aWxsYSIpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5NT1pJTExBKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vbW96aWxsYS5vcmciKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTA4YzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBPcGVuIGFuIE9MRSBFeGNlbCBzaGVldC4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2MSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiRXhjZWwgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQkJbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiRXhjZWwuU2hlZXQiKTsKLQkJCWFkZEZpbGVNZW51KGZyYW1lKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGFkZEZpbGVNZW51KE9sZUZyYW1lIGZyYW1lKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZnJhbWUuZ2V0U2hlbGwoKTsKLQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQlNZW51SXRlbSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVNZW51LnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgbWVudUZpbGUgPSBuZXcgTWVudShmaWxlTWVudSk7Ci0JCWZpbGVNZW51LnNldE1lbnUobWVudUZpbGUpOwotCQlNZW51SXRlbSBtZW51RmlsZUNvbnRyb2wgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVDb250cm9sLnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVDb250cm9sLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWZyYW1lLnNldEZpbGVNZW51cyhuZXcgTWVudUl0ZW1bXSB7IGZpbGVNZW51IH0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwOGE1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIFdvcmQgZG9jdW1lbnQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotcHVibGljIGNsYXNzIFNuaXBwZXQyNjIgewotCXN0YXRpYyBPbGVDbGllbnRTaXRlIGNsaWVudFNpdGU7Ci0Jc3RhdGljIE9sZUZyYW1lIGZyYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIldvcmQgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIldvcmQuRG9jdW1lbnQiKTsKLQkJCWFkZEZpbGVNZW51KGZyYW1lKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGFkZEZpbGVNZW51KE9sZUZyYW1lIGZyYW1lKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZnJhbWUuZ2V0U2hlbGwoKTsKLQkJTWVudSBtZW51QmFyID0gc2hlbGwuZ2V0TWVudUJhcigpOwotCQlpZiAobWVudUJhciA9PSBudWxsKSB7Ci0JCQltZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJfQotCQlNZW51SXRlbSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVNZW51LnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgbWVudUZpbGUgPSBuZXcgTWVudShmaWxlTWVudSk7Ci0JCWZpbGVNZW51LnNldE1lbnUobWVudUZpbGUpOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQotCQlNZW51SXRlbSBtZW51RmlsZU9wZW4gPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVPcGVuLnNldFRleHQoIk9wZW4uLi4iKTsKLQkJbWVudUZpbGVPcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbGVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlNZW51SXRlbSBtZW51RmlsZUV4aXQgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVFeGl0LnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVFeGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgZmlsZU9wZW4oKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coY2xpZW50U2l0ZS5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLmRvYyIgfSk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQljbGllbnRTaXRlLmRpc3Bvc2UoKTsKLQkJCWNsaWVudFNpdGUgPSBuZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJXb3JkLkRvY3VtZW50IiwgbmV3IEZpbGUoZmlsZU5hbWUpKTsKLQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwYmZkZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIFBvd2VyUG9pbnQgc2xpZGUuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotcHVibGljIGNsYXNzIFNuaXBwZXQyNjMgewotCXN0YXRpYyBPbGVDbGllbnRTaXRlIGNsaWVudFNpdGU7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJQb3dlclBvaW50IEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWNsaWVudFNpdGUgID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiUG93ZXJQb2ludC5TbGlkZSIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCU1lbnVJdGVtIG1lbnVGaWxlQ29udHJvbCA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZUNvbnRyb2wuc2V0VGV4dCgiRXhpdCIpOwotCQltZW51RmlsZUNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZDhiZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIE1lZGlhIFBsYXllci4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2NCB7Ci0Jc3RhdGljIE9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIk1lZGlhIFBsYXllciBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQljbGllbnRTaXRlICA9IG5ldyBPbGVDbGllbnRTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIk1QbGF5ZXIiKTsKLQkJCWFkZEZpbGVNZW51KGZyYW1lKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGFkZEZpbGVNZW51KE9sZUZyYW1lIGZyYW1lKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZnJhbWUuZ2V0U2hlbGwoKTsKLQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQlNZW51SXRlbSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVNZW51LnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgbWVudUZpbGUgPSBuZXcgTWVudShmaWxlTWVudSk7Ci0JCWZpbGVNZW51LnNldE1lbnUobWVudUZpbGUpOwotCQlNZW51SXRlbSBtZW51RmlsZUNvbnRyb2wgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVDb250cm9sLnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVDb250cm9sLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWZyYW1lLnNldEZpbGVNZW51cyhuZXcgTWVudUl0ZW1bXSB7IGZpbGVNZW51IH0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzVkYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBPcGVuIGFuIE9MRSBXaW5kb3dzIE1lZGlhIFBsYXllci4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2NSB7Ci0Jc3RhdGljIE9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIk1lZGlhIFBsYXllciBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiV01QbGF5ZXIuT0NYIik7Ci0JCQljbGllbnRTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQkJCWFkZEZpbGVNZW51KGZyYW1lKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IHNoZWxsLmdldE1lbnVCYXIoKTsKLQkJaWYgKG1lbnVCYXIgPT0gbnVsbCkgewotCQkJbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCX0KLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0KLQkJTWVudUl0ZW0gbWVudUZpbGVPcGVuID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlT3Blbi5zZXRUZXh0KCJPcGVuLi4uIik7Ci0JCW1lbnVGaWxlT3Blbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaWxlT3BlbigpOwotCQkJfQotCQl9KTsKLQkJTWVudUl0ZW0gbWVudUZpbGVFeGl0ID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlRXhpdC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlRXhpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXN0YXRpYyB2b2lkIGZpbGVPcGVuKCkgewotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGNsaWVudFNpdGUuZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi53bXYiIH0pOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkgewotCQkJT2xlQXV0b21hdGlvbiBwbGF5ZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjbGllbnRTaXRlKTsKLQkJCWludCBwbGF5VVJMW10gPSBwbGF5ZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiVVJMIiB9KTsKLQkJCWlmIChwbGF5VVJMICE9IG51bGwpIHsKLQkJCQlWYXJpYW50IHRoZUZpbGUgPSBuZXcgVmFyaWFudChmaWxlbmFtZSk7Ci0JCQkJcGxheWVyLnNldFByb3BlcnR5KHBsYXlVUkxbMF0sIHRoZUZpbGUpOwotCQkJfQotCQkJcGxheWVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTdhMGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogU3BhbiBhbmQgY2VudGVyIGNvbHVtbnMgd2l0aCBhIEdyaWRMYXlvdXQuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLwotcHVibGljIGNsYXNzIFNuaXBwZXQyNjYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJCi0JCVRhYkZvbGRlciB0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQkJCi0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIldpZGdldCIpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJaXRlbS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoIlN0YW5kYXJkIik7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KCJXaWRnZXQiKTsKLQkJVHJlZUl0ZW0gYnJhbmNoID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJYnJhbmNoLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkVmZmljaWVudCIsICJQb3J0YWJsZSJ9KTsKLQkJVHJlZUl0ZW0gbGVhZiA9IG5ldyBUcmVlSXRlbShicmFuY2gsIFNXVC5OT05FKTsKLQkJbGVhZi5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDcm9zcyIsICJQbGF0Zm9ybSJ9KTsKLQkJYnJhbmNoLnNldEV4cGFuZGVkKHRydWUpOwotCQlicmFuY2ggPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlicmFuY2guc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiTmF0aXZlIiwgIkNvbnRyb2xzIn0pOwotCQlsZWFmID0gbmV3IFRyZWVJdGVtKGJyYW5jaCwgU1dULk5PTkUpOwotCQlsZWFmLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkNyb3NzIiwgIlBsYXRmb3JtIn0pOwotCQlicmFuY2ggPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlicmFuY2guc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiQ3Jvc3MiLCAiUGxhdGZvcm0ifSk7Ci0JCWNvbHVtbjEucGFjaygpOwotCQljb2x1bW4yLnBhY2soKTsKLQotCQlpdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiVG9vbGtpdCIpOwotCQkKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJUb3RhbGx5Iik7Ci0JCWJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCi0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkF3ZXNvbWUiKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZmM4ZGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLm1vemlsbGEuaW50ZXJmYWNlcy4qOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IFRvZ2dsZSBhIE1vemlsbGEgQnJvd3NlciBiZXR3ZWVuIERlc2lnbiBtb2RlIGFuZCBWaWV3IG1vZGUuCi0gKiAKLSAqIElNUE9SVEFOVDogRm9yIHRoaXMgc25pcHBldCB0byB3b3JrIHByb3Blcmx5IGFsbCBvZiB0aGUgcmVxdWlyZW1lbnRzCi0gKiBmb3IgdXNpbmcgSmF2YVhQQ09NIGluIGEgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24gbXVzdCBiZSBzYXRpc2ZpZWQKLSAqIChzZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3QvZmFxLnBocCNob3d1c2VqYXZheHBjb20pLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY3IHsKLQlzdGF0aWMgQnJvd3NlciBicm93c2VyOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJc2hlbGwuc2V0VGV4dCgiVXNlIE1vemlsbGEncyBEZXNpZ24gTW9kZSIpOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTU9aSUxMQSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0KLQkJZmluYWwgQnV0dG9uIG9mZkJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5SQURJTyk7Ci0JCW9mZkJ1dHRvbi5zZXRUZXh0KCJEZXNpZ24gTW9kZSBPZmYiKTsKLQkJb2ZmQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvZmZCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHJldHVybjsKLQkJCQlzZXREZXNpZ25Nb2RlKCJvZmYiKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIEJ1dHRvbiBvbkJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5SQURJTyk7Ci0JCW9uQnV0dG9uLnNldFRleHQoIkRlc2lnbiBNb2RlIE9uIik7Ci0JCW9uQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcmV0dXJuOwotCQkJCWJvb2xlYW4gc3VjY2VzcyA9IHNldERlc2lnbk1vZGUoIm9uIik7Ci0JCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJCW9uQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCW9mZkJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJb2ZmQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQotCQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5nb29nbGUuY29tIik7Ci0JCXNoZWxsLnNldFNpemUoNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVzaWduTW9kZShTdHJpbmcgdmFsdWUpIHsKLQkJbnNJV2ViQnJvd3NlciB3ZWJCcm93c2VyID0gKG5zSVdlYkJyb3dzZXIpYnJvd3Nlci5nZXRXZWJCcm93c2VyKCk7Ci0JCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGdldCB0aGUgbnNJV2ViQnJvd3NlciBmcm9tIHRoZSBCcm93c2VyIHdpZGdldCIpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCW5zSURPTVdpbmRvdyB3aW5kb3cgPSB3ZWJCcm93c2VyLmdldENvbnRlbnRET01XaW5kb3coKTsKLQkJbnNJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSB3aW5kb3cuZ2V0RG9jdW1lbnQoKTsKLQkJbnNJRE9NTlNIVE1MRG9jdW1lbnQgbnNEb2N1bWVudCA9IChuc0lET01OU0hUTUxEb2N1bWVudClkb2N1bWVudC5xdWVyeUludGVyZmFjZShuc0lET01OU0hUTUxEb2N1bWVudC5OU19JRE9NTlNIVE1MRE9DVU1FTlRfSUlEKTsKLQkJbnNEb2N1bWVudC5zZXREZXNpZ25Nb2RlKHZhbHVlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA3YzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFVJIEF1dG9tYXRpb24gKGZvciB0ZXN0aW5nIHRvb2xzKSBzbmlwcGV0OiBwb3N0IG1vdXNlIHdoZWVsIGV2ZW50cyB0byBhIHN0eWxlZCB0ZXh0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNjggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5WX1NDUk9MTCk7Ci0JU3RyaW5nIG11bHRpTGluZVN0cmluZyA9ICIiOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJbXVsdGlMaW5lU3RyaW5nID0gbXVsdGlMaW5lU3RyaW5nLmNvbmNhdCgiVGhpcyBpcyBsaW5lIG51bWJlciAiICsgaSArICIgaW4gdGhlIG11bHRpLWxpbmUgc3RyaW5nLlxuIik7Ci0JfQotCXN0eWxlZFRleHQuc2V0VGV4dChtdWx0aUxpbmVTdHJpbmcpOwotCXNoZWxsLnNldFNpemUoc3R5bGVkVGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgNDAwKSk7Ci0Jc2hlbGwub3BlbigpOwotCXN0eWxlZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vdXNlV2hlZWwsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlIFdoZWVsIGV2ZW50ICIgKyBlKTsKLQkJfQotCX0pOwotCWZpbmFsIFBvaW50IHB0ID0gZGlzcGxheS5tYXAoc2hlbGwsIG51bGwsIDUwLCA1MCk7Ci0JbmV3IFRocmVhZCgpewotCQlFdmVudCBldmVudDsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7Ci0JCQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJCQlldmVudC50eXBlID0gU1dULk1vdXNlV2hlZWw7Ci0JCQkJZXZlbnQuZGV0YWlsID0gU1dULlNDUk9MTF9MSU5FOwotCQkJCWV2ZW50LnggPSBwdC54OwotCQkJCWV2ZW50LnkgPSBwdC55OwotCQkJCWV2ZW50LmNvdW50ID0gLTI7Ci0JCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJfQotCQl9CQotCX0uc3RhcnQoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYTRiZDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogQ29tYm8gZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIGNhcmV0IHBvc2l0aW9uIHdpdGhpbiBhIENvbWJvJ3MgdGV4dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNjkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChzaGVsbCwgU1dULk5PTkUpOwotCWNvbWJvLmFkZCAoIml0ZW0iKTsKLQljb21iby5zZWxlY3QgKDApOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlpbnQgc3RyaW5nTGVuZ3RoID0gY29tYm8uZ2V0VGV4dCAoKS5sZW5ndGggKCk7IAotCWNvbWJvLnNldFNlbGVjdGlvbiAobmV3IFBvaW50IChzdHJpbmdMZW5ndGgsIHN0cmluZ0xlbmd0aCkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNhOWMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogb3BlbiBhIHNoZWxsIG1pbmltaXplZCAoaWNvbmlmaWVkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldE1pbmltaXplZCAodHJ1ZSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU2YzEwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIHNuaXBwZXQ6IGJyaW5nIHVwIGEgYnJvd3NlciB3aXRoIHBvcC11cCB3aW5kb3cgc3VwcG9ydAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIk1haW4gV2luZG93Iik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQl0cnkgewotCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCXJldHVybjsKLQl9Ci0JaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQlzaGVsbC5vcGVuKCk7Ci0JYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0vKiByZWdpc3RlciBXaW5kb3dFdmVudCBsaXN0ZW5lcnMgKi8KLXN0YXRpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBCcm93c2VyIGJyb3dzZXIpIHsKLQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIWV2ZW50LnJlcXVpcmVkKSByZXR1cm47CS8qIG9ubHkgZG8gaXQgaWYgbmVjZXNzYXJ5ICovCi0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCXNoZWxsLnNldFRleHQoIk5ldyBXaW5kb3ciKTsKLQkJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXI7Ci0JCX0KLQl9KTsKLQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJaWYgKGV2ZW50LmxvY2F0aW9uICE9IG51bGwpIHNoZWxsLnNldExvY2F0aW9uKGV2ZW50LmxvY2F0aW9uKTsKLQkJCWlmIChldmVudC5zaXplICE9IG51bGwpIHsKLQkJCQlQb2ludCBzaXplID0gZXZlbnQuc2l6ZTsKLQkJCQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKHNpemUueCwgc2l6ZS55KSk7Ci0JCQl9Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCX0KLQl9KTsKLQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCX0KLQl9KTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODIxOTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIHNuaXBwZXQ6IHNwZWNpZnkgY3VzdG9tIGNvbnRlbnQgZGltZW5zaW9ucyBpbiBhIHRhYmxlIHdpdGggbm8gY29sdW1ucwotICogCi0gKiBGb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGlzIHNuaXBwZXQgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtQ3VzdG9tRHJhd2luZ1RhYmxlQW5kVHJlZUl0ZW1zL2N1c3RvbURyYXcuaHRtI19leGFtcGxlMQotICogIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsMTAsMjAwLDI1MCk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsMTAsMTUwLDIwMCk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtICIgKyBpKTsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtIGlzIGNhbGxlZCByZXBlYXRlZGx5LiAgVGhlcmVmb3JlIGl0IGlzIGNyaXRpY2FsCi0JICogZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhpcyBtZXRob2QgYmUgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaW50IGNsaWVudFdpZHRoID0gdGFibGUuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCQkJZXZlbnQuaGVpZ2h0ID0gZXZlbnQuZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSAqIDI7Ci0JCQlldmVudC53aWR0aCA9IGNsaWVudFdpZHRoICogMjsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3OGMxYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgc25pcHBldDogc3BlY2lmeSBjdXN0b20gY29sdW1uIHdpZHRocyB3aGVuIGEgY29sdW1uIGlzIHBhY2tlZAotICogIAotICogRm9yIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhpcyBzbmlwcGV0IHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLUN1c3RvbURyYXdpbmdUYWJsZUFuZFRyZWVJdGVtcy9jdXN0b21EcmF3Lmh0bSNfZXhhbXBsZTIKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsgCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLDEwLDQwMCwyMDApOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JdGFibGUuc2V0Qm91bmRzKDEwLDEwLDM1MCwxNTApOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0V2lkdGgoMTAwKTsKLQljb2x1bW4wLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWNvbHVtbjAucGFjaygpOwotCQl9Ci0JfSk7Ci0JY29sdW1uMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQljb2x1bW4xLnBhY2soKTsKLQkJfQotCX0pOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoMCwgIml0ZW0gIiArIGkgKyAiIGNvbCAwIik7Ci0JCWl0ZW0uc2V0VGV4dCgxLCAiaXRlbSAiICsgaSArICIgY29sIDEiKTsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtIGlzIGNhbGxlZCByZXBlYXRlZGx5LiAgVGhlcmVmb3JlIGl0IGlzIGNyaXRpY2FsCi0JICogZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhpcyBtZXRob2QgYmUgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZXZlbnQud2lkdGggKj0gMjsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlNmMzYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjczLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIHNuaXBwZXQ6IG1vZGlmeSB0aGUgY2xpcHBpbmcgb2YgY3VzdG9tIGJhY2tncm91bmQgcGFpbnRzCi0gKiAKLSAqIEZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoaXMgc25pcHBldCBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1DdXN0b21EcmF3aW5nVGFibGVBbmRUcmVlSXRlbXMvY3VzdG9tRHJhdy5odG0jX2V4YW1wbGU0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjczIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIFN0cmluZ1tdIE1PTlRIUyA9IHsKLQkJIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKLQkJIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgotCX07Ci0JZmluYWwgaW50W10gSElHSFMgPSB7LTcsIC00LCAxLCAxMSwgMTgsIDI0LCAyNiwgMjUsIDIwLCAxMywgNSwgLTR9OwotCWZpbmFsIGludFtdIExPV1MgPSB7LTE1LCAtMTMsIC03LCAxLCA3LCAxMywgMTUsIDE0LCAxMCwgNCwgLTIsIC0xMX07Ci0JZmluYWwgaW50IFNDQUxFX01JTiA9IC0zMDsgZmluYWwgaW50IFNDQUxFX01BWCA9IDMwOwotCWZpbmFsIGludCBTQ0FMRV9SQU5HRSA9IE1hdGguYWJzKFNDQUxFX01JTiAtIFNDQUxFX01BWCk7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwxMCw0MDAsMzUwKTsKLQlzaGVsbC5zZXRUZXh0KCJPdHRhd2EgQXZlcmFnZSBEYWlseSBUZW1wZXJhdHVyZSBSYW5nZXMiKTsKLQlmaW5hbCBDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JZmluYWwgQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0JZmluYWwgQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkvLyBmaW5hbCBJbWFnZSBwYXJsaWFtZW50SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgIi4vcGFybGlhbWVudC5qcGciKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk5PTkUpOwotCXRhYmxlLnNldEJvdW5kcygxMCwxMCwzNTAsMzAwKTsKLQkvLyB0YWJsZS5zZXRCYWNrZ3JvdW5kSW1hZ2UocGFybGlhbWVudEltYWdlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChNT05USFNbaV0gKyAiICgiICsgTE9XU1tpXSArICJDLi4uIiArIEhJR0hTW2ldICsgIkMpIik7Ci0JfQotCWZpbmFsIGludCBjbGllbnRXaWR0aCA9IHRhYmxlLmdldENsaWVudEFyZWEoKS53aWR0aDsKLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuIFRoZXJlZm9yZSBpdCBpcwotCSAqIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUgYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZWFzdXJlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaW50IGl0ZW1JbmRleCA9IHRhYmxlLmluZGV4T2YoKFRhYmxlSXRlbSlldmVudC5pdGVtKTsKLQkJCWludCByaWdodFggPSAoSElHSFNbaXRlbUluZGV4XSAtIFNDQUxFX01JTikgKiBjbGllbnRXaWR0aCAvIFNDQUxFX1JBTkdFOwotCQkJZXZlbnQud2lkdGggPSByaWdodFg7Ci0JCX0KLQl9KTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgaXRlbUluZGV4ID0gdGFibGUuaW5kZXhPZigoVGFibGVJdGVtKWV2ZW50Lml0ZW0pOwotCQkJaW50IGxlZnRYID0gKExPV1NbaXRlbUluZGV4XSAtIFNDQUxFX01JTikgKiBjbGllbnRXaWR0aCAvIFNDQUxFX1JBTkdFOwotCQkJaW50IHJpZ2h0WCA9IChISUdIU1tpdGVtSW5kZXhdIC0gU0NBTEVfTUlOKSAqIGNsaWVudFdpZHRoIC8gU0NBTEVfUkFOR0U7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJUmVjdGFuZ2xlIGNsaXBwaW5nID0gZ2MuZ2V0Q2xpcHBpbmcoKTsKLQkJCWNsaXBwaW5nLnggPSBsZWZ0WDsKLQkJCWNsaXBwaW5nLndpZHRoID0gcmlnaHRYIC0gbGVmdFg7Ci0JCQlnYy5zZXRDbGlwcGluZyhjbGlwcGluZyk7Ci0JCQlDb2xvciBvbGRGb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJQ29sb3Igb2xkQmFja2dyb3VuZCA9IGdjLmdldEJhY2tncm91bmQoKTsKLQkJCWdjLnNldEZvcmVncm91bmQoYmx1ZSk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCBldmVudC53aWR0aCAvIDIsIGV2ZW50LmhlaWdodCwgZmFsc2UpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCh3aGl0ZSk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHJlZCk7Ci0JCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoCi0JCQkJZXZlbnQueCArIGV2ZW50LndpZHRoIC8gMiwgZXZlbnQueSwgZXZlbnQud2lkdGggLyAyLCBldmVudC5oZWlnaHQsIGZhbHNlKTsKLQkJCWdjLnNldEZvcmVncm91bmQob2xkRm9yZWdyb3VuZCk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKG9sZEJhY2tncm91bmQpOwotCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuQkFDS0dST1VORDsKLQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkhPVDsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQkvLyBwYXJsaWFtZW50SW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQ3ZTk3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIHNuaXBwZXQ6IGltcGxlbWVudCBzdGFuZGFyZCB0cmVlIGNoZWNrIGJveCBiZWhhdmlvciAoU1dULkNIRUNLKQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI3NCB7Ci0JCi0Jc3RhdGljIHZvaWQgY2hlY2tQYXRoKFRyZWVJdGVtIGl0ZW0sIGJvb2xlYW4gY2hlY2tlZCwgYm9vbGVhbiBncmF5ZWQpIHsKLQkgICAgaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCSAgICBpZiAoZ3JheWVkKSB7Ci0JICAgICAgICBjaGVja2VkID0gdHJ1ZTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIGludCBpbmRleCA9IDA7Ci0JICAgICAgICBUcmVlSXRlbVtdIGl0ZW1zID0gaXRlbS5nZXRJdGVtcygpOwotCSAgICAgICAgd2hpbGUgKGluZGV4IDwgaXRlbXMubGVuZ3RoKSB7Ci0JICAgICAgICAgICAgVHJlZUl0ZW0gY2hpbGQgPSBpdGVtc1tpbmRleF07Ci0JICAgICAgICAgICAgaWYgKGNoaWxkLmdldEdyYXllZCgpIHx8IGNoZWNrZWQgIT0gY2hpbGQuZ2V0Q2hlY2tlZCgpKSB7Ci0JICAgICAgICAgICAgICAgIGNoZWNrZWQgPSBncmF5ZWQgPSB0cnVlOwotCSAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaW5kZXgrKzsKLQkgICAgICAgIH0KLQkgICAgfQotCSAgICBpdGVtLnNldENoZWNrZWQoY2hlY2tlZCk7Ci0JICAgIGl0ZW0uc2V0R3JheWVkKGdyYXllZCk7Ci0JICAgIGNoZWNrUGF0aChpdGVtLmdldFBhcmVudEl0ZW0oKSwgY2hlY2tlZCwgZ3JheWVkKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBjaGVja0l0ZW1zKFRyZWVJdGVtIGl0ZW0sIGJvb2xlYW4gY2hlY2tlZCkgewotCSAgICBpdGVtLnNldEdyYXllZChmYWxzZSk7Ci0JICAgIGl0ZW0uc2V0Q2hlY2tlZChjaGVja2VkKTsKLQkgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IGl0ZW0uZ2V0SXRlbXMoKTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCSAgICAgICAgY2hlY2tJdGVtcyhpdGVtc1tpXSwgY2hlY2tlZCk7Ci0JICAgIH0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCSAgICBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5DSEVDSyk7Ci0JICAgIHRyZWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkgICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5DSEVDSykgewotCSAgICAgICAgICAgICAgICBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCSAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSBpdGVtLmdldENoZWNrZWQoKTsKLQkgICAgICAgICAgICAgICAgY2hlY2tJdGVtcyhpdGVtLCBjaGVja2VkKTsKLQkgICAgICAgICAgICAgICAgY2hlY2tQYXRoKGl0ZW0uZ2V0UGFyZW50SXRlbSgpLCBjaGVja2VkLCBmYWxzZSk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICB9KTsKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkgICAgICAgIFRyZWVJdGVtIGl0ZW1JID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OVUxMKTsKLQkgICAgICAgIGl0ZW1JLnNldFRleHQoIkl0ZW0gIiArIGkpOwotCSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKLQkgICAgICAgICAgICBUcmVlSXRlbSBpdGVtSiA9IG5ldyBUcmVlSXRlbShpdGVtSSwgU1dULk5VTEwpOwotCSAgICAgICAgICAgIGl0ZW1KLnNldFRleHQoIkl0ZW0gIiArIGkgKyAiICIgKyBqKTsKLQkgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykgewotCSAgICAgICAgICAgICAgICBUcmVlSXRlbSBpdGVtSyA9IG5ldyBUcmVlSXRlbShpdGVtSiwgU1dULk5VTEwpOwotCSAgICAgICAgICAgICAgICBpdGVtSy5zZXRUZXh0KCJJdGVtICIgKyBpICsgIiAiICsgaiArICIgIiArIGspOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgfQotCSAgICB0cmVlLnNldFNpemUoMjAwLCAyMDApOwotCSAgICBzaGVsbC5wYWNrKCk7Ci0JICAgIHNoZWxsLm9wZW4oKTsKLQkgICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkgICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCSAgICB9Ci0JICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA5ZmQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDYW52YXMgc25pcHBldDogdXBkYXRlIGEgcG9ydGlvbiBvZiBhIENhbnZhcyBmcmVxdWVudGx5Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjc1IHsKLQotc3RhdGljIFN0cmluZyB2YWx1ZTsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgaW50IElOVEVSVkFMID0gODg4OwotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCA3NTAsIDc1MCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMTAsIDEwLCA3OTAsIDc5MCk7Ci0JZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY2FudmFzLnNldEJvdW5kcyAoMTAsIDEwLCA3NTAsIDc1MCk7Ci0JY2FudmFzLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJdmFsdWUgPSBTdHJpbmcudmFsdWVPZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpKTsKLQkJCWV2ZW50LmdjLmRyYXdJbWFnZSAoaW1hZ2UsIDAsIDApOwotCQkJZXZlbnQuZ2MuZHJhd1N0cmluZyAodmFsdWUsIDEwLCAxMCwgdHJ1ZSk7Ci0JCX0KLQl9KTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAoSU5URVJWQUwsIG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlpZiAoY2FudmFzLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCS8vIGNhbnZhcy5yZWRyYXcgKCk7IC8vIDwtLSBiYWQsIGRhbWFnZXMgbW9yZSB0aGFuIGlzIG5lZWRlZAotCQkJR0MgZ2MgPSBuZXcgR0MgKGNhbnZhcyk7Ci0JCQlQb2ludCBleHRlbnQgPSBnYy5zdHJpbmdFeHRlbnQgKHZhbHVlICsgJzAnKTsKLQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQljYW52YXMucmVkcmF3ICgxMCwgMTAsIGV4dGVudC54LCBleHRlbnQueSwgZmFsc2UpOwotCQkJZGlzcGxheS50aW1lckV4ZWMgKElOVEVSVkFMLCB0aGlzKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKXsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3NzlmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGlzcGxheSBzbmlwcGV0OiBtYXAgZnJvbSBjb250cm9sLXJlbGF0aXZlIHRvIGRpc3BsYXktcmVsYXRpdmUgY29vcmRpbmF0ZXMKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMgKDIwMCwgMjAwLCA0MDAsIDQwMCk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoImNsaWNrIGluIHNoZWxsIHRvIHByaW50IGRpc3BsYXktcmVsYXRpdmUgY29vcmRpbmF0ZSIpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGRpc3BsYXkubWFwICgoQ29udHJvbClldmVudC53aWRnZXQsIG51bGwsIHBvaW50KSk7Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0JbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlsYWJlbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKXsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YmQxZmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogSW1wbGVtZW50IGEgY3VzdG9tIGRvd25sb2FkIGhhbmRsZXIgZm9yIGEgTW96aWxsYSBCcm93c2VyLgotICogCi0gKiBJTVBPUlRBTlQ6IEZvciB0aGlzIHNuaXBwZXQgdG8gd29yayBwcm9wZXJseSBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cwotICogZm9yIHVzaW5nIEphdmFYUENPTSBpbiBhIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9uIG11c3QgYmUgc2F0aXNmaWVkCi0gKiAoc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L2ZhcS5waHAjaG93dXNlamF2YXhwY29tKS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLm1vemlsbGEuaW50ZXJmYWNlcy4qOwotaW1wb3J0IG9yZy5tb3ppbGxhLnhwY29tLk1vemlsbGE7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjc3IHsKLQlzdGF0aWMgU2hlbGwgc2hlbGw7Ci0Jc3RhdGljIFRhYmxlIHRhYmxlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCAoKSk7Ci0JCXNoZWxsLnNldFRleHQgKCJDdXN0b20gRG93bmxvYWQgSGFuZGxlciIpOwotCi0JCUJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlciAoc2hlbGwsIFNXVC5NT1pJTExBKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UgKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEgKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEubWluaW11bUhlaWdodCA9IDgwMDsKLQkJZGF0YS5taW5pbXVtV2lkdGggPSA4MDA7Ci0JCWJyb3dzZXIuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0KLQkJdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXRhYmxlLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5leGNsdWRlID0gdHJ1ZTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JCW5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCi0JCW5zSUNvbXBvbmVudFJlZ2lzdHJhciByZWdpc3RyYXIgPSBNb3ppbGxhLmdldEluc3RhbmNlICgpLmdldENvbXBvbmVudFJlZ2lzdHJhciAoKTsKLQkJU3RyaW5nIE5TX0RPV05MT0FEX0NJRCA9ICJlM2ZhOUQwYS0xZGQxLTExYjItYmRlZi04YzcyMGI1OTc0NDUiOwotCQlTdHJpbmcgTlNfVFJBTlNGRVJfQ09OVFJBQ1RJRCA9ICJAbW96aWxsYS5vcmcvdHJhbnNmZXI7MSI7Ci0JCXJlZ2lzdHJhci5yZWdpc3RlckZhY3RvcnkgKE5TX0RPV05MT0FEX0NJRCwgIlRyYW5zZmVyIiwgTlNfVFJBTlNGRVJfQ09OVFJBQ1RJRCwgbmV3IG5zSUZhY3RvcnkgKCkgewotCQkJcHVibGljIG5zSVN1cHBvcnRzIHF1ZXJ5SW50ZXJmYWNlIChTdHJpbmcgdXVpZCkgewotCQkJCWlmICh1dWlkLmVxdWFscyAobnNJRmFjdG9yeS5OU19JRkFDVE9SWV9JSUQpIHx8Ci0JCQkJCXV1aWQuZXF1YWxzIChuc0lGYWN0b3J5Lk5TX0lTVVBQT1JUU19JSUQpKSByZXR1cm4gdGhpczsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXB1YmxpYyBuc0lTdXBwb3J0cyBjcmVhdGVJbnN0YW5jZSAobnNJU3VwcG9ydHMgb3V0ZXIsIFN0cmluZyBpaWQpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVHJhbnNmZXIgKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsb2NrRmFjdG9yeSAoYm9vbGVhbiBsb2NrKSB7fQotCQl9KTsKLQotCQlicm93c2VyLnNldFVybCAoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzIik7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotCi0Jc3RhdGljIG5zSVRyYW5zZmVyIGNyZWF0ZVRyYW5zZmVyICgpIHsKLQkJLyogbnNJVHJhbnNmZXIgaXMgZG9jdW1lbnRlZCBhdCBodHRwOi8vd3d3Lnh1bHBsYW5ldC5jb20vcmVmZXJlbmNlcy94cGNvbXJlZi9pZmFjZXMvbnNJVHJhbnNmZXIuaHRtbCAqLwotCQlyZXR1cm4gbmV3IG5zSVRyYW5zZmVyICgpIHsKLQkJCXB1YmxpYyBuc0lTdXBwb3J0cyBxdWVyeUludGVyZmFjZSAoU3RyaW5nIHV1aWQpIHsKLQkJCQlpZiAodXVpZC5lcXVhbHMgKG5zSVRyYW5zZmVyLk5TX0lUUkFOU0ZFUl9JSUQpIHx8Ci0JCQkJCXV1aWQuZXF1YWxzIChuc0lUcmFuc2Zlci5OU19JV0VCUFJPR1JFU1NMSVNURU5FUjJfSUlEKSB8fAotCQkJCQl1dWlkLmVxdWFscyAobnNJVHJhbnNmZXIuTlNfSVdFQlBST0dSRVNTTElTVEVORVJfSUlEKSB8fAotCQkJCQl1dWlkLmVxdWFscyAobnNJVHJhbnNmZXIuTlNfSVNVUFBPUlRTX0lJRCkpIHJldHVybiB0aGlzOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHVibGljIHZvaWQgb25TdGF0ZUNoYW5nZSAobnNJV2ViUHJvZ3Jlc3Mgd2ViUHJvZ3Jlc3MsIG5zSVJlcXVlc3QgcmVxdWVzdCwgbG9uZyBzdGF0ZUZsYWdzLCBsb25nIHN0YXR1cykgewotCQkJCWlmICgoc3RhdGVGbGFncyAmIG5zSVdlYlByb2dyZXNzTGlzdGVuZXIuU1RBVEVfU1RPUCkgIT0gMCkgewotCQkJCQlyZW1vdmVGcm9tVGFibGUgKCk7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZTY0IChuc0lXZWJQcm9ncmVzcyB3ZWJQcm9ncmVzcywgbnNJUmVxdWVzdCByZXF1ZXN0LCBsb25nIGN1clNlbGZQcm9ncmVzcywgbG9uZyBtYXhTZWxmUHJvZ3Jlc3MsIGxvbmcgY3VyVG90YWxQcm9ncmVzcywgbG9uZyBtYXhUb3RhbFByb2dyZXNzKSB7Ci0JCQkJbG9uZyBjdXJyZW50S0J5dGVzID0gY3VyVG90YWxQcm9ncmVzcyAvIDEwMjQ7Ci0JCQkJbG9uZyB0b3RhbEtCeXRlcyA9IG1heFRvdGFsUHJvZ3Jlc3MgLyAxMDI0OwotCQkJCXRhYmxlSXRlbS5zZXRUZXh0ICgxLCBiYXNlU3RyaW5nICsgIiAoIiArIGN1cnJlbnRLQnl0ZXMgKyAiLyIgKyB0b3RhbEtCeXRlcyArICIpIik7Ci0JCQkJdGFibGUuZ2V0Q29sdW1uICgxKS5wYWNrICgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaW5pdCAobnNJVVJJIHNvdXJjZSwgbnNJVVJJIHRhcmdldCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBuc0lNSU1FSW5mbyBNSU1FSW5mbywgZG91YmxlIHN0YXJ0VGltZSwgbnNJTG9jYWxGaWxlIHRlbXBGaWxlLCBmaW5hbCBuc0lDYW5jZWxhYmxlIGNhbmNlbGFibGUpIHsKLQkJCQl0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCWJ1dHRvbiA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuUFVTSCk7Ci0JCQkJYnV0dG9uLnNldFRleHQgKCJDYW5jZWwiKTsKLQkJCQlidXR0b24ucGFjayAoKTsKLQkJCQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCQkJY2FuY2VsYWJsZS5jYW5jZWwgKE1vemlsbGEuTlNfRVJST1JfQUJPUlQpOwotCQkJCQkJcmVtb3ZlRnJvbVRhYmxlICgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJVGFibGVFZGl0b3IgZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCQkJZWRpdG9yLnNldEVkaXRvciAoYnV0dG9uLCB0YWJsZUl0ZW0sIDApOwotCQkJCWVkaXRvci5taW5pbXVtV2lkdGggPSBidXR0b24uY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJCQliYXNlU3RyaW5nID0gIkRvd25sb2FkaW5nIHRvICIgKyB0YXJnZXQuZ2V0UGF0aCAoKTsKLQkJCQl0YWJsZUl0ZW0uc2V0VGV4dCAoMSwgYmFzZVN0cmluZyk7Ci0JCQkJaWYgKHRhYmxlLmdldEl0ZW1Db3VudCAoKSA9PSAxKSB7Ci0JCQkJCSgoR3JpZERhdGEpdGFibGUuZ2V0TGF5b3V0RGF0YSAoKSkuZXhjbHVkZSA9IGZhbHNlOwkvKiBzaG93IHRoZSB0YWJsZSAqLwotCQkJCQl0YWJsZS5nZXRDb2x1bW4gKDApLnNldFdpZHRoIChlZGl0b3IubWluaW11bVdpZHRoKTsKLQkJCQl9Ci0JCQkJdGFibGUuZ2V0Q29sdW1uICgxKS5wYWNrICgpOwotCQkJCXRhYmxlLmdldFNoZWxsICgpLmxheW91dCAoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG9uU3RhdHVzQ2hhbmdlIChuc0lXZWJQcm9ncmVzcyB3ZWJQcm9ncmVzcywgbnNJUmVxdWVzdCByZXF1ZXN0LCBsb25nIHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHt9Ci0JCQlwdWJsaWMgdm9pZCBvblNlY3VyaXR5Q2hhbmdlIChuc0lXZWJQcm9ncmVzcyB3ZWJQcm9ncmVzcywgbnNJUmVxdWVzdCByZXF1ZXN0LCBsb25nIHN0YXRlKSB7fQotCQkJcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZSAobnNJV2ViUHJvZ3Jlc3Mgd2ViUHJvZ3Jlc3MsIG5zSVJlcXVlc3QgcmVxdWVzdCwgaW50IGN1clNlbGZQcm9ncmVzcywgaW50IG1heFNlbGZQcm9ncmVzcywgaW50IGN1clRvdGFsUHJvZ3Jlc3MsIGludCBtYXhUb3RhbFByb2dyZXNzKSB7fQotCQkJcHVibGljIHZvaWQgb25Mb2NhdGlvbkNoYW5nZSAobnNJV2ViUHJvZ3Jlc3Mgd2ViUHJvZ3Jlc3MsIG5zSVJlcXVlc3QgcmVxdWVzdCwgbnNJVVJJIGxvY2F0aW9uKSB7fQotCi0JCQkvKiB0aGUgZm9sbG93aW5nIGFyZSBub3QgcGFydCBvZiB0aGUgbnNJVHJhbnNmZXIgaW50ZXJmYWNlIGJ1dCBhcmUgaGVyZSBmb3IgdGhlIHNuaXBwZXQncyBjb252ZW5pZW5jZSAqLwotCQkJQnV0dG9uIGJ1dHRvbjsKLQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW07Ci0JCQlTdHJpbmcgYmFzZVN0cmluZzsKLQotCQkJdm9pZCByZW1vdmVGcm9tVGFibGUgKCkgewotCQkJCXRhYmxlSXRlbS5kaXNwb3NlICgpOwotCQkJCWJ1dHRvbi5kaXNwb3NlICgpOwotCQkJCWlmICh0YWJsZS5nZXRJdGVtQ291bnQgKCkgPT0gMCkgewotCQkJCQkoKEdyaWREYXRhKXRhYmxlLmdldExheW91dERhdGEgKCkpLmV4Y2x1ZGUgPSB0cnVlOwkvKiBoaWRlIHRoZSB0YWJsZSAqLwotCQkJCX0KLQkJCQl0YWJsZS5nZXRDb2x1bW4gKDEpLnBhY2sgKCk7Ci0JCQkJdGFibGUuZ2V0U2hlbGwgKCkubGF5b3V0ICgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxZTk5NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjc4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbCB0aXAgc25pcHBldDogc2hvdyBhIExhYmVsJ3MgdG9vbCB0aXAgaWZmIGl0J3Mgbm90IGZ1bGx5IHZpc2libGUKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjc4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMTAsIDEwLCAzMDAsIDEwMCk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoInJlc2l6ZSB0aGUgU2hlbGwgdGhlbiBob3ZlciBvdmVyIHRoaXMgTGFiZWwiKTsKLQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRW50ZXIsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcmVxdWlyZWRTaXplID0gbGFiZWwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQlQb2ludCBsYWJlbFNpemUgPSBsYWJlbC5nZXRTaXplICgpOwotCQkJYm9vbGVhbiBmdWxseVZpc2libGUgPSByZXF1aXJlZFNpemUueCA8PSBsYWJlbFNpemUueCAmJiByZXF1aXJlZFNpemUueSA8PSBsYWJlbFNpemUueTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkxhYmVsIGlzIGZ1bGx5IHZpc2libGU6ICIgKyBmdWxseVZpc2libGUpOwotCQkJbGFiZWwuc2V0VG9vbFRpcFRleHQgKGZ1bGx5VmlzaWJsZSA/IG51bGwgOiBsYWJlbC5nZXRUZXh0ICgpKTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlmN2U4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBkcmF3IGEgcmVmbGVjdGlvbiBvZiBhbiBpbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNzkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCAoKSk7Ci0JCWZpbmFsIEltYWdlIGltYWdlID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZSAoU1dULklDT05fUVVFU1RJT04pOwotCQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCQlHQyBnYyA9IGUuZ2M7Ci0JCQkJaW50IHggPSAxMCwgeSA9IDEwOwotCQkJCWdjLmRyYXdJbWFnZSAoaW1hZ2UsIHgsIHkpOwotCQkJCVRyYW5zZm9ybSB0ciA9IG5ldyBUcmFuc2Zvcm0gKGUuZGlzcGxheSk7Ci0JCQkJdHIuc2V0RWxlbWVudHMgKDEsIDAsIDAsIC0xLCAxLCAyKih5K3JlY3QuaGVpZ2h0KSk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtICh0cik7Ci0JCQkJZ2MuZHJhd0ltYWdlIChpbWFnZSwgeCwgeSk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtIChudWxsKTsKLQkJCQlDb2xvciBiYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCAoKTsKLQkJCQlQYXR0ZXJuIHAgPSBuZXcgUGF0dGVybiAoZS5kaXNwbGF5LCB4LCB5K3JlY3QuaGVpZ2h0LCB4LCB5KygyKnJlY3QuaGVpZ2h0KSwgYmFja2dyb3VuZCwgMCwgYmFja2dyb3VuZCwgMjU1KTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybiAocCk7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSAoeCwgeStyZWN0LmhlaWdodCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJCXAuZGlzcG9zZSAoKTsKLQkJCQl0ci5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwuc2V0U2l6ZSAoNjAwLCA0MDApOwotCQlzaGVsbC5vcGVuICgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpCi0JCQkJZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotCQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODkxZmNjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogb3BlbiBhIHNoZWxsIG1heGltaXplZCAoZnVsbCBzY3JlZW4pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TWF4aW1pemVkICh0cnVlKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDliMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGRyYXcgYSBtdWx0aS1ncmFkaWVudCAod2l0aG91dCBhZHZhbmNlZCBncmFwaGljcykKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjgwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULk5PX0JBQ0tHUk9VTkQpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCAoKSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5QYWludCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvciAoZGlzcGxheSwgMjM0LCAyNDYsIDI1Myk7Ci0JCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IgKGRpc3BsYXksIDIxNywgMjQwLCAyNTIpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcjEpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChjb2xvcjIpOwotCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQgLyAyLCB0cnVlKTsKLQkJCWNvbG9yMS5kaXNwb3NlICgpOwotCQkJY29sb3IyLmRpc3Bvc2UgKCk7Ci0JCQlDb2xvciBjb2xvcjMgPSBuZXcgQ29sb3IgKGRpc3BsYXksIDE5MCwgMjMwLCAyNTMpOwotCQkJQ29sb3IgY29sb3I0ID0gbmV3IENvbG9yIChkaXNwbGF5LCAxNjcsIDIxNywgMjQ1KTsKLQkJCWdjLnNldEZvcmVncm91bmQoY29sb3IzKTsKLQkJCWdjLnNldEJhY2tncm91bmQoY29sb3I0KTsKLQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSAocmVjdC54LCByZWN0LnkgKyAocmVjdC5oZWlnaHQgLyAyKSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQgLyAyICsgMSwgdHJ1ZSk7Ci0JCQljb2xvcjMuZGlzcG9zZSAoKTsKLQkJCWNvbG9yNC5kaXNwb3NlICgpOwotCQkJCi0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDY0KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTBhY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGRyYXcgYSBtdWx0aS1ncmFkaWVudAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuTk9fQkFDS0dST1VORCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJR0MgZ2MgPSBlLmdjOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yIChkaXNwbGF5LCAyMzQsIDI0NiwgMjUzKTsKLQkJCUNvbG9yIGNvbG9yMiA9IG5ldyBDb2xvciAoZGlzcGxheSwgMjE3LCAyNDAsIDI1Mik7Ci0JCQlDb2xvciBjb2xvcjMgPSBuZXcgQ29sb3IgKGRpc3BsYXksIDE5MCwgMjMwLCAyNTMpOwotCQkJQ29sb3IgY29sb3I0ID0gbmV3IENvbG9yIChkaXNwbGF5LCAxNjcsIDIxNywgMjQ1KTsKLQkJCVBhdHRlcm4gcDEgPSBuZXcgUGF0dGVybiAoZGlzcGxheSwgMCwgMCwgMCwgcmVjdC5oZWlnaHQgLyAyLCBjb2xvcjEsIGNvbG9yMik7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybiAocDEpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZSAocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0IC8gMik7Ci0JCQlQYXR0ZXJuIHAyID0gbmV3IFBhdHRlcm4gKGRpc3BsYXksIDAsIHJlY3QuaGVpZ2h0IC8gMiwgMCwgcmVjdC5oZWlnaHQsIGNvbG9yMywgY29sb3I0KTsKLQkJCWdjLnNldEJhY2tncm91bmRQYXR0ZXJuIChwMik7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSArIChyZWN0LmhlaWdodCAvIDIpLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCAvIDIgKyAxKTsKLQkJCXAxLmRpc3Bvc2UgKCk7Ci0JCQlwMi5kaXNwb3NlICgpOwotCQkJY29sb3IxLmRpc3Bvc2UgKCk7Ci0JCQljb2xvcjIuZGlzcG9zZSAoKTsKLQkJCWNvbG9yMy5kaXNwb3NlICgpOwotCQkJY29sb3I0LmRpc3Bvc2UgKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDY0KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODg0ZGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb3B5L3Bhc3RlIGltYWdlIHRvL2Zyb20gY2xpcGJvYXJkLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjgyIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzaGVsbC5zZXRUZXh0KCJDbGlwYm9hcmQgSW1hZ2VUcmFuc2ZlciIpOwotCi0JICAgIGZpbmFsIEJ1dHRvbiBpbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5OT05FICk7Ci0JICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JICAgIGdkLm1pbmltdW1IZWlnaHQgPSA0MDA7Ci0JICAgIGdkLm1pbmltdW1XaWR0aCA9IDYwMDsKLQkgICAgaW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIHRydWUpKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiT3BlbiIpOwotCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nIChzaGVsbCwgU1dULk9QRU4pOwotCQkJCWRpYWxvZy5zZXRUZXh0KCJPcGVuIGFuIGltYWdlIGZpbGUgb3IgY2FuY2VsIik7Ci0JCQkJU3RyaW5nIHN0cmluZyA9IGRpYWxvZy5vcGVuICgpOwotCQkJCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQkJCQlJbWFnZSBpbWFnZSA9IGltYWdlQnV0dG9uLmdldEltYWdlKCk7Ci0JCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHN0cmluZyk7Ci0JCQkJCWltYWdlQnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQ29weSIpOwotCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IGltYWdlQnV0dG9uLmdldEltYWdlKCk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJSW1hZ2VUcmFuc2ZlciB0cmFuc2ZlciA9IEltYWdlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXXtpbWFnZS5nZXRJbWFnZURhdGEoKX0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIlBhc3RlIik7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUltYWdlVHJhbnNmZXIgdHJhbnNmZXIgPSBJbWFnZVRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IChJbWFnZURhdGEpY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQkJCQlpZiAoaW1hZ2VEYXRhICE9IG51bGwpIHsKLQkJCQkJaW1hZ2VCdXR0b24uc2V0VGV4dCgiIik7Ci0JCQkJCUltYWdlIGltYWdlID0gaW1hZ2VCdXR0b24uZ2V0SW1hZ2UoKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJCQkJaW1hZ2VCdXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWltYWdlQnV0dG9uLnNldFRleHQoIk5vIGltYWdlIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQ2xlYXIiKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaW1hZ2VCdXR0b24uc2V0VGV4dCgiIik7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZUJ1dHRvbi5nZXRJbWFnZSgpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaW1hZ2VCdXR0b24uc2V0SW1hZ2UobnVsbCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyZTBjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjgzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogRHJhdyBsZWZ0IGFsaWduZWQgaWNvbiwgdGV4dCBhbmQgc2VsZWN0aW9uCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI4MyB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgU25pcHBldDI4My5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlY2xpcHNlLnBuZyIpKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkgKyAiIHdpdGggbG9uZyB0ZXh0IHRoYXQgc2Nyb2xscy4iKTsKLQkJCWlmIChpICUgMiA9PSAxKSBpdGVtLnNldEltYWdlIChpbWFnZSk7Ci0JCX0KLQkJdGFibGUuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHRhYmxlLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCWlmICh0YWJsZS5nZXRJdGVtKHBvaW50KSAhPSBudWxsKSByZXR1cm47Ci0JCQkJZm9yIChpbnQgaT10YWJsZS5nZXRUb3BJbmRleCAoKTsgaTx0YWJsZS5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbSAoaSk7Ci0JCQkJCVJlY3RhbmdsZSBpdGVtUmVjdCA9IGl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCQlpZiAoIWl0ZW1SZWN0LmludGVyc2VjdHMgKHJlY3QpKSByZXR1cm47Ci0JCQkJCWl0ZW1SZWN0LnggPSByZWN0Lng7Ci0JCQkJCWl0ZW1SZWN0LndpZHRoID0gcmVjdC53aWR0aDsKLQkJCQkJaWYgKGl0ZW1SZWN0LmNvbnRhaW5zIChwb2ludCkpIHsKLQkJCQkJCXRhYmxlLnNldFNlbGVjdGlvbiAoaXRlbSk7Ci0JCQkJCQlFdmVudCBzZWxlY3Rpb25FdmVudCA9IG5ldyBFdmVudCAoKTsKLQkJCQkJCXNlbGVjdGlvbkV2ZW50Lml0ZW0gPSBpdGVtOwotCQkJCQkJdGFibGUubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIHNlbGVjdGlvbkV2ZW50KTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCS8qCi0JCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JCSAqLwotCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkZPUkVHUk9VTkQ7Ci0JCQkJU3RyaW5nIG9zTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOwotCQkJCWlmIChvc05hbWUgIT0gbnVsbCAmJiBvc05hbWUuaW5kZXhPZiAoIldpbmRvd3MiKSAhPSAtMSkgewotCQkJCQlpZiAob3NOYW1lLmluZGV4T2YgKCJWaXN0YSIpICE9IC0xIHx8IG9zTmFtZS5pbmRleE9mICgidW5rbm93biIpICE9IC0xKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZXZlbnQuZGV0YWlsICY9IH4oU1dULkZPUkVHUk9VTkQgfCBTV1QuU0VMRUNURUQgfCBTV1QuSE9UIHwgU1dULkZPQ1VTRUQpOwotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSB0YWJsZS5nZXRDbGllbnRBcmVhICgpOwotCQkJCVJlY3RhbmdsZSBpdGVtUmVjdCA9IGl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCWl0ZW1SZWN0LnggPSByZWN0Lng7Ci0JCQkJaXRlbVJlY3Qud2lkdGggPSByZWN0LndpZHRoOwotCQkJCWdjLnNldENsaXBwaW5nICgoUmVjdGFuZ2xlKSBudWxsKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlIChpdGVtUmVjdCk7Ci0JCQl9Ci0JCX0pOwotCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSBpdGVtLmdldEltYWdlICgwKTsKLQkJCQlTdHJpbmcgdGV4dCA9IGl0ZW0uZ2V0VGV4dCAoMCk7Ci0JCQkJUG9pbnQgdGV4dEV4dGVudCA9IGdjLnN0cmluZ0V4dGVudCAodGV4dCk7Ci0JCQkJUmVjdGFuZ2xlIGltYWdlUmVjdCA9IGl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0JCQkJUmVjdGFuZ2xlIHRleHRSZWN0ID0gaXRlbS5nZXRUZXh0Qm91bmRzICgwKTsKLQkJCQlpbnQgdGV4dFkgPSB0ZXh0UmVjdC55ICsgTWF0aC5tYXggKDAsICh0ZXh0UmVjdC5oZWlnaHQgLSB0ZXh0RXh0ZW50LnkpIC8gMik7Ci0JCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJZ2MuZHJhd1N0cmluZyh0ZXh0LCBpbWFnZVJlY3QueCwgdGV4dFksIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJlY3RhbmdsZSBpbWFnZUV4dGVudCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCQkJaW50IGltYWdlWSA9IGltYWdlUmVjdC55ICsgTWF0aC5tYXggKDAsIChpbWFnZVJlY3QuaGVpZ2h0IC0gaW1hZ2VFeHRlbnQuaGVpZ2h0KSAvIDIpOwotCQkJCQlnYy5kcmF3SW1hZ2UgKGltYWdlLCBpbWFnZVJlY3QueCwgaW1hZ2VZKTsKLQkJCQkJZ2MuZHJhd1N0cmluZyAodGV4dCwgdGV4dFJlY3QueCwgdGV4dFksIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlM2YzYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkcmFnIGEgVVJMIGJldHdlZW4gdHdvIGxhYmVscy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI4NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJVUkxUcmFuc2ZlciIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbDEuc2V0VGV4dCAoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlzZXREcmFnU291cmNlIChsYWJlbDEpOwotCXNldERyb3BUYXJnZXQgKGxhYmVsMik7Ci0Jc2hlbGwuc2V0U2l6ZSg2MDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIHNldERyYWdTb3VyY2UgKGZpbmFsIExhYmVsIGxhYmVsKSB7Ci0JaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JZmluYWwgRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSAobGFiZWwsIG9wZXJhdGlvbnMpOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VVJMVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIgKG5ldyBEcmFnU291cmNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZSkgewotCQkJZS5kYXRhID0gbGFiZWwuZ2V0VGV4dCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgc2V0RHJvcFRhcmdldCAoZmluYWwgTGFiZWwgbGFiZWwpIHsKLQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGxhYmVsLCBvcGVyYXRpb25zKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1VSTFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyIChuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IERORC5EUk9QX05PTkUpCi0JCQkJZS5kZXRhaWwgPSBETkQuRFJPUF9MSU5LOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkKLQkJCQllLmRldGFpbCA9IERORC5EUk9QX0xJTks7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhID09IG51bGwpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWxhYmVsLnNldFRleHQoKChTdHJpbmcpIGV2ZW50LmRhdGEpKTsKLQkJfQotCX0pOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTFmYjlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogY3JlYXRlIGEgY2lyY3VsYXIgc2hlbGwgZnJvbSBhIHBhdGguCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjg1IHsKLQlzdGF0aWMgdm9pZCBsb2FkUGF0aChSZWdpb24gcmVnaW9uLCBmbG9hdFtdIHBvaW50cywgYnl0ZVtdIHR5cGVzKSB7Ci0JCWludCBzdGFydCA9IDAsIGVuZCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXN3aXRjaCAodHlwZXNbaV0pIHsKLQkJCQljYXNlIFNXVC5QQVRIX01PVkVfVE86IHsKLQkJCQkJaWYgKHN0YXJ0ICE9IGVuZCkgewotCQkJCQkJaW50IG4gPSAwOwotCQkJCQkJaW50W10gdGVtcCA9IG5ldyBpbnRbZW5kIC0gc3RhcnRdOwotCQkJCQkJZm9yIChpbnQgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHsKLQkJCQkJCQl0ZW1wW24rK10gPSBNYXRoLnJvdW5kKHBvaW50c1trXSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZWdpb24uYWRkKHRlbXApOwotCQkJCQl9Ci0JCQkJCXN0YXJ0ID0gZW5kOwotCQkJCQllbmQgKz0gMjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBBVEhfTElORV9UTzogewotCQkJCQllbmQgKz0gMjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBBVEhfQ0xPU0U6IHsKLQkJCQkJaWYgKHN0YXJ0ICE9IGVuZCkgewotCQkJCQkJaW50IG4gPSAwOwotCQkJCQkJaW50W10gdGVtcCA9IG5ldyBpbnRbZW5kIC0gc3RhcnRdOwotCQkJCQkJZm9yIChpbnQgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHsKLQkJCQkJCQl0ZW1wW24rK10gPSBNYXRoLnJvdW5kKHBvaW50c1trXSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZWdpb24uYWRkKHRlbXApOwotCQkJCQl9Ci0JCQkJCXN0YXJ0ID0gZW5kOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgd2lkdGggPSAyNTAsIGhlaWdodCA9IDI1MDsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0pOwotCQlmaW5hbCBQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJcGF0aC5hZGRBcmMoMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgMzYwKTsKLQkJUGF0aCBwYXRoMiA9IG5ldyBQYXRoKGRpc3BsYXksIHBhdGgsIDAuMWYpOwotCQlwYXRoLmRpc3Bvc2UoKTsKLQkJUGF0aERhdGEgZGF0YSA9IHBhdGgyLmdldFBhdGhEYXRhKCk7Ci0JCXBhdGgyLmRpc3Bvc2UoKTsKLQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JCWxvYWRQYXRoKHJlZ2lvbiwgZGF0YS5wb2ludHMsIGRhdGEudHlwZXMpOwotCQlzaGVsbC5zZXRSZWdpb24ocmVnaW9uKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCQljYXNlIFNXVC5Nb3VzZURvd246IHsKLQkJCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgU1dULlBhaW50OiB7Ci0JCQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJCQlQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgUGF0dGVybihkaXNwbGF5LCByZWN0LngsIHJlY3QueQotCQkJCQkJCQkrIHJlY3QuaGVpZ2h0LCByZWN0LnggKyByZWN0LndpZHRoLCByZWN0LnksIGRpc3BsYXkKLQkJCQkJCQkJLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSwgZGlzcGxheQotCQkJCQkJCQkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQkJCQlnYy5zZXRCYWNrZ3JvdW5kUGF0dGVybihwYXR0ZXJuKTsKLQkJCQkJCWdjLmZpbGxSZWN0YW5nbGUocmVjdCk7Ci0JCQkJCQlwYXR0ZXJuLmRpc3Bvc2UoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbGlzdGVuZXIpOwotCQlzaGVsbC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwNjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogdXNlIGEgbWVudSBpdGVtJ3MgYXJtTGlzdGVuZXIgdG8gdXBkYXRlIGEgc3RhdHVzIGxpbmUuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCUNhbnZhcyBibGFua0NhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlibGFua0NhbnZhcy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgyMDAsIDIwMCkpOwotCQlmaW5hbCBMYWJlbCBzdGF0dXNMaW5lID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXN0YXR1c0xpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0KLQkJTWVudSBiYXIgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCQkKLQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKGJhciwgU1dULkNBU0NBREUpOwotCQltZW51SXRlbS5zZXRUZXh0ICgiVGVzdCIpOwotCQlNZW51IG1lbnUgPSBuZXcgTWVudShiYXIpOwotCQltZW51SXRlbS5zZXRNZW51IChtZW51KTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJCWl0ZW0uYWRkQXJtTGlzdGVuZXIobmV3IEFybUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldEFybWVkKEFybUV2ZW50IGUpIHsKLQkJCQkJc3RhdHVzTGluZS5zZXRUZXh0KCgoTWVudUl0ZW0pZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlZTg0ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBzZWFyY2ggZm9yIGEgc3RyaW5nIGluIGEgVHJlZSByZWN1cnNpdmVseQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI4NyB7Ci0KLXN0YXRpYyBUcmVlIHRyZWU7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgU3RyaW5nIFNFQVJDSF9TVFJJTkcgPSAiNGIiOwotCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMTAsMTAsMzAwLDMwMCk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgR3JpZExheW91dCAoKSk7Ci0KLQkvKiBjcmVhdGUgdGhlIFRyZWUgKi8KLQl0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQl0cmVlLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJbmV3IFRyZWVDb2x1bW4gKHRyZWUsIFNXVC5OT05FKS5zZXRXaWR0aCAoOTApOwotCX0KLQlpbnQgaW5kZXggPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBjcmVhdGVJdGVtIChudWxsLCBpbmRleCsrKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCWl0ZW0gPSBjcmVhdGVJdGVtIChpdGVtLCBpbmRleCsrKTsKLQkJfQotCX0KLQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiRmluZCAnIiArIFNFQVJDSF9TVFJJTkcgKyAiJyIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgaXRlbUNvdW50ID0gdHJlZS5nZXRJdGVtQ291bnQgKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IHRyZWUuZ2V0SXRlbSAoaSk7Ci0JCQkJYm9vbGVhbiBzdWNjZXNzID0gZmluZCAoaXRlbSwgU0VBUkNIX1NUUklORyk7Ci0JCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiRm91bmQgaXQiKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRpZCBub3QgZmluZCBpdCIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi0vKiBmb3IgY3JlYXRpbmcgc2FtcGxlIFRyZWUgKi8KLXN0YXRpYyBUcmVlSXRlbSBjcmVhdGVJdGVtIChUcmVlSXRlbSBwYXJlbnQsIGludCBpdGVtSW5kZXgpIHsKLQlUcmVlSXRlbSBuZXdJdGVtID0gbnVsbDsKLQlpZiAocGFyZW50ID09IG51bGwpIHsJLyogcm9vdCBsZXZlbCBpdGVtICovCi0JCW5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQl9IGVsc2UgewotCQluZXdJdGVtID0gbmV3IFRyZWVJdGVtIChwYXJlbnQsIFNXVC5OT05FKTsKLQl9Ci0JU3RyaW5nIGluZGV4U3RyaW5nID0gU3RyaW5nLnZhbHVlT2YgKGl0ZW1JbmRleCk7IAotCW5ld0l0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10gewotCQlpbmRleFN0cmluZyArICdhJywgaW5kZXhTdHJpbmcgKyAnYicsIGluZGV4U3RyaW5nICsgJ2MnfSk7Ci0JcmV0dXJuIG5ld0l0ZW07Ci19Ci0KLS8qIHJlY3Vyc2l2ZSBmaW5kICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gZmluZCAoVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIHNlYXJjaFN0cmluZykgewotCS8qIGNoZWNrIHRoaXMgaXRlbSAqLwotCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0JCVN0cmluZyBjb250ZW50cyA9IGl0ZW0uZ2V0VGV4dCAoaSk7Ci0JCWlmICgoY29udGVudHMudG9VcHBlckNhc2UgKCkuaW5kZXhPZiAoc2VhcmNoU3RyaW5nLnRvVXBwZXJDYXNlICgpKSkgIT0gLTEpIHsKLQkJCXRyZWUuc2V0U2VsZWN0aW9uIChpdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JaWYgKCFpdGVtLmdldEV4cGFuZGVkICgpKSByZXR1cm4gZmFsc2U7IC8qIGRvbid0IGNoZWNrIGNoaWxkIGl0ZW1zICovCi0KLQkvKiBjaGVjayBjaGlsZCBpdGVtcyAqLwotCWludCBjaGlsZENvdW50ID0gaXRlbS5nZXRJdGVtQ291bnQgKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKLQkJVHJlZUl0ZW0gY2hpbGQgPSBpdGVtLmdldEl0ZW0gKGkpOwotCQlib29sZWFuIHN1Y2Nlc3MgPSBmaW5kIChjaGlsZCwgc2VhcmNoU3RyaW5nKTsKLQkJaWYgKHN1Y2Nlc3MpIHJldHVybiB0cnVlOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmNWU4Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjg4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIFRvb2xCYXIgY29udGFpbmluZyBhbmltYXRlZCBHSUZzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI4OCB7Ci0JCi0Jc3RhdGljIERpc3BsYXkgZGlzcGxheTsKLQlzdGF0aWMgU2hlbGwgc2hlbGw7Ci0Jc3RhdGljIEdDIHNoZWxsR0M7Ci0Jc3RhdGljIENvbG9yIHNoZWxsQmFja2dyb3VuZDsKLQlzdGF0aWMgSW1hZ2VMb2FkZXJbXSBsb2FkZXI7Ci0Jc3RhdGljIEltYWdlRGF0YVtdW10gaW1hZ2VEYXRhQXJyYXk7Ci0Jc3RhdGljIFRocmVhZCBhbmltYXRlVGhyZWFkW107Ci0Jc3RhdGljIEltYWdlW11bXSBpbWFnZTsKLQlwcml2YXRlIHN0YXRpYyBUb29sSXRlbSBpdGVtW107Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlR0lGQmFja2dyb3VuZCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCXNoZWxsQmFja2dyb3VuZCA9IHNoZWxsLmdldEJhY2tncm91bmQoKTsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4gfCBTV1QuTVVMVEkpOwotCQlkaWFsb2cuc2V0VGV4dCgiU2VsZWN0IE11bHRpcGxlIEFuaW1hdGVkIEdJRnMiKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsiKi5naWYifSk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCVN0cmluZyBmaWxlbmFtZXNbXSA9IGRpYWxvZy5nZXRGaWxlTmFtZXMoKTsKLQkJaW50IG51bVRvb2xCYXJJdGVtcyA9IGZpbGVuYW1lcy5sZW5ndGg7Ci0JCWlmIChudW1Ub29sQmFySXRlbXMgPiAwKSB7Ci0JCQl0cnkgewotCQkJCWxvYWRBbGxJbWFnZXMobmV3IEZpbGUoZmlsZW5hbWUpLmdldFBhcmVudCgpLCBmaWxlbmFtZXMpOwotCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlRoZXJlIHdhcyBhbiBlcnJvciBsb2FkaW5nIGFuIGltYWdlLiIpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQkJCWl0ZW0gPSBuZXcgVG9vbEl0ZW1bbnVtVG9vbEJhckl0ZW1zXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtVG9vbEJhckl0ZW1zOyBpKyspIHsKLQkJCQlpdGVtW2ldID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCQkJaXRlbVtpXS5zZXRJbWFnZShpbWFnZVtpXVswXSk7Ci0JCQl9Ci0JCQl0b29sQmFyLnBhY2sgKCk7Ci0JCQlzaGVsbC5vcGVuICgpOwotCQkJCi0JCQlzdGFydEFuaW1hdGlvblRocmVhZHMoKTsKLQkJCQotCQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQkJfQotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bVRvb2xCYXJJdGVtczsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbWFnZVtpXS5sZW5ndGg7IGorKykgewotCQkJCQlpbWFnZVtpXVtqXS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJZGlzcGxheS5kaXNwb3NlICgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkQWxsSW1hZ2VzKFN0cmluZyBkaXJlY3RvcnksIFN0cmluZ1tdIGZpbGVuYW1lcykgdGhyb3dzIFNXVEV4Y2VwdGlvbiB7Ci0JCWludCBudW1JdGVtcyA9IGZpbGVuYW1lcy5sZW5ndGg7Ci0JCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcltudW1JdGVtc107Ci0JCWltYWdlRGF0YUFycmF5ID0gbmV3IEltYWdlRGF0YVtudW1JdGVtc11bXTsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2VbbnVtSXRlbXNdW107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgewotCQkJbG9hZGVyW2ldID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQlpbnQgZnVsbFdpZHRoID0gbG9hZGVyW2ldLmxvZ2ljYWxTY3JlZW5XaWR0aDsKLQkJCWludCBmdWxsSGVpZ2h0ID0gbG9hZGVyW2ldLmxvZ2ljYWxTY3JlZW5IZWlnaHQ7Ci0JCQlpbWFnZURhdGFBcnJheVtpXSA9IGxvYWRlcltpXS5sb2FkKGRpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZW5hbWVzW2ldKTsKLQkJCWludCBudW1GcmFtZXNPZkFuaW1hdGlvbiA9IGltYWdlRGF0YUFycmF5W2ldLmxlbmd0aDsKLQkJCWltYWdlW2ldID0gbmV3IEltYWdlW251bUZyYW1lc09mQW5pbWF0aW9uXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtRnJhbWVzT2ZBbmltYXRpb247IGorKykgewotCQkJCWlmIChqID09IDApIHsKLQkJCQkJLy9mb3IgdGhlIGZpcnN0IGZyYW1lIG9mIGFuaW1hdGlvbiwganVzdCBkcmF3IHRoZSBmaXJzdCBmcmFtZQotCQkJCQlpbWFnZVtpXVtqXSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGFBcnJheVtpXVtqXSk7Ci0JCQkJCWZ1bGxXaWR0aCA9IGltYWdlRGF0YUFycmF5W2ldW2pdLndpZHRoOwotCQkJCQlmdWxsSGVpZ2h0ID0gaW1hZ2VEYXRhQXJyYXlbaV1bal0uaGVpZ2h0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy9hZnRlciB0aGUgZmlyc3QgZnJhbWUgb2YgYW5pbWF0aW9uLCBkcmF3IHRoZSBiYWNrZ3JvdW5kIG9yIHByZXZpb3VzIGZyYW1lIGZpcnN0LCB0aGVuIHRoZSBuZXcgaW1hZ2UgZGF0YSAKLQkJCQkJaW1hZ2VbaV1bal0gPSBuZXcgSW1hZ2UoZGlzcGxheSwgZnVsbFdpZHRoLCBmdWxsSGVpZ2h0KTsKLQkJCQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2VbaV1bal0pOwotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKHNoZWxsQmFja2dyb3VuZCk7Ci0JCQkJCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgZnVsbFdpZHRoLCBmdWxsSGVpZ2h0KTsKLQkJCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlRGF0YUFycmF5W2ldW2pdOwotCQkJCQlzd2l0Y2ggKGltYWdlRGF0YS5kaXNwb3NhbE1ldGhvZCkgewotCQkJCQljYXNlIFNXVC5ETV9GSUxMX0JBQ0tHUk9VTkQ6Ci0JCQkJCQkvKiBGaWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgYmVmb3JlIGRyYXdpbmcuICovCi0JCQkJCQlDb2xvciBiZ0NvbG9yID0gbnVsbDsKLQkJCQkJCWlmICh1c2VHSUZCYWNrZ3JvdW5kICYmIGxvYWRlcltpXS5iYWNrZ3JvdW5kUGl4ZWwgIT0gLTEpIHsKLQkJCQkJCQliZ0NvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIGltYWdlRGF0YS5wYWxldHRlLmdldFJHQihsb2FkZXJbaV0uYmFja2dyb3VuZFBpeGVsKSk7Ci0JCQkJCQl9Ci0JCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IgIT0gbnVsbCA/IGJnQ29sb3IgOiBzaGVsbEJhY2tncm91bmQpOwotCQkJCQkJZ2MuZmlsbFJlY3RhbmdsZShpbWFnZURhdGEueCwgaW1hZ2VEYXRhLnksIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodCk7Ci0JCQkJCQlpZiAoYmdDb2xvciAhPSBudWxsKSBiZ0NvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJLyogUmVzdG9yZSB0aGUgcHJldmlvdXMgaW1hZ2UgYmVmb3JlIGRyYXdpbmcuICovCi0JCQkJCQlnYy5kcmF3SW1hZ2UoCi0JCQkJCQkJaW1hZ2VbaV1bai0xXSwKLQkJCQkJCQkwLAotCQkJCQkJCTAsCi0JCQkJCQkJZnVsbFdpZHRoLAotCQkJCQkJCWZ1bGxIZWlnaHQsCi0JCQkJCQkJMCwKLQkJCQkJCQkwLAotCQkJCQkJCWZ1bGxXaWR0aCwKLQkJCQkJCQlmdWxsSGVpZ2h0KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCUltYWdlIG5ld0ZyYW1lID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQkJCWdjLmRyYXdJbWFnZShuZXdGcmFtZSwKLQkJCQkJCQkwLAotCQkJCQkJCTAsCi0JCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJaW1hZ2VEYXRhLnksCi0JCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQluZXdGcmFtZS5kaXNwb3NlKCk7Ci0JCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uVGhyZWFkcygpIHsKLQkJYW5pbWF0ZVRocmVhZCA9IG5ldyBUaHJlYWRbaW1hZ2UubGVuZ3RoXTsKLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IGltYWdlLmxlbmd0aDsgaWkrKykgewotCQkJZmluYWwgaW50IGkgPSBpaTsKLQkJCWFuaW1hdGVUaHJlYWRbaV0gPSBuZXcgVGhyZWFkKCJBbmltYXRpb24gIitpKSB7Ci0JCQkJaW50IGltYWdlRGF0YUluZGV4ID0gMDsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnQgcmVwZWF0Q291bnQgPSBsb2FkZXJbaV0ucmVwZWF0Q291bnQ7Ci0JCQkJCQl3aGlsZSAobG9hZGVyW2ldLnJlcGVhdENvdW50ID09IDAgfHwgcmVwZWF0Q291bnQgPiAwKSB7Ci0JCQkJCQkJaW1hZ2VEYXRhSW5kZXggPSAoaW1hZ2VEYXRhSW5kZXggKyAxKSAlIGltYWdlRGF0YUFycmF5W2ldLmxlbmd0aDsKLQkJCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAoIWl0ZW1baV0uaXNEaXNwb3NlZCgpKQotCQkJCQkJCQkJCQlpdGVtW2ldLnNldEltYWdlKGltYWdlW2ldW2ltYWdlRGF0YUluZGV4XSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQkvKiBTbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBkZWxheSB0aW1lIChhZGRpbmcgY29tbW9ubHktdXNlZCBzbG93LWRvd24gZnVkZ2UgZmFjdG9ycykuICovCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW50IG1zID0gaW1hZ2VEYXRhQXJyYXlbaV1baW1hZ2VEYXRhSW5kZXhdLmRlbGF5VGltZSAqIDEwOwotCQkJCQkJCQlpZiAobXMgPCAyMCkgbXMgKz0gMzA7Ci0JCQkJCQkJCWlmIChtcyA8IDMwKSBtcyArPSAxMDsKLQkJCQkJCQkJVGhyZWFkLnNsZWVwKG1zKTsKLQkJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCi0JCQkJCQkJLyogSWYgd2UgaGF2ZSBqdXN0IGRyYXduIHRoZSBsYXN0IGltYWdlLCBkZWNyZW1lbnQgdGhlIHJlcGVhdCBjb3VudCBhbmQgc3RhcnQgYWdhaW4uICovCi0JCQkJCQkJaWYgKGltYWdlRGF0YUluZGV4ID09IGltYWdlRGF0YUFycmF5W2ldLmxlbmd0aCAtIDEpIHJlcGVhdENvdW50LS07Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSB3YXMgYW4gZXJyb3IgYW5pbWF0aW5nIHRoZSBHSUYiKTsKLQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWFuaW1hdGVUaHJlYWRbaV0uc2V0RGFlbW9uKHRydWUpOwotCQkJYW5pbWF0ZVRocmVhZFtpXS5zdGFydCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWU2OWZlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyODkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21ibyBleGFtcGxlIHNuaXBwZXQ6IGFkZCBhbiBpdGVtIHRvIGEgY29tYm8gYm94Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyODkgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhzaGVsbCwgU1dULk5PTkUpOwotCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmcgW10geyIxMTExIiwgIjIyMjIiLCAiMzMzMyIsICI0NDQ0In0pOwotCWNvbWJvLnNldFRleHQoY29tYm8uZ2V0SXRlbSgwKSk7Ci0JY29tYm8uYWRkVmVyaWZ5TGlzdGVuZXIobmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGUpIHsKLQkJCVN0cmluZyBuZXdUZXh0ID0gZS50ZXh0OwotCQkJdHJ5IHsKLQkJCQlJbnRlZ2VyLnBhcnNlSW50KG5ld1RleHQpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9KTsKLQljb21iby5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQkJU3RyaW5nIG5ld1RleHQgPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSW50ZWdlci5wYXJzZUludChuZXdUZXh0KTsKLQkJCQkJY29tYm8uYWRkKG5ld1RleHQpOwotCQkJCQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIG5ld1RleHQubGVuZ3RoKCkpKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOGMzNmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGJhciBhbmQgcHVsbCBkb3duIG1lbnUgKGFjY2VsZXJhdG9ycywgbW5lbW9uaWNzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCU1lbnUgYmFyID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQlmaWxlSXRlbS5zZXRUZXh0ICgiJkZpbGUiKTsKLQlNZW51IHN1Ym1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWZpbGVJdGVtLnNldE1lbnUgKHN1Ym1lbnUpOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKHN1Ym1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2VsZWN0IEFsbCIpOwotCQl9Ci0JfSk7Ci0JaXRlbS5zZXRUZXh0ICgiU2VsZWN0ICZBbGxcdEN0cmwrQSIpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0EnKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTFjMTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBDYW52YXMgc25pcHBldDogaWdub3JlIDJuZCBtb3VzZSB1cCBldmVudCBhZnRlciBkb3VibGUtY2xpY2sKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKGUuY291bnQgPT0gMSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW91c2UgdXAiKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJEb3VibGUtY2xpY2siKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2YmE4OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIEdpdmUgYWNjZXNzaWJsZSBuYW1lcyB0byBhIHRyZWUgYW5kIGl0cyB0cmVlIGl0ZW1zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjkxIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTlVMTCk7Ci0JCQl0cmVlSXRlbS5zZXRUZXh0ICgiaXRlbSIgKyBpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQkJCXN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSIgKyBpICsgaik7Ci0JCQl9Ci0JCX0KLQkJdHJlZS5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpIHsKLQkJCQkJZS5yZXN1bHQgPSAiVGhpcyBpcyB0aGUgQWNjZXNzaWJsZSBOYW1lIGZvciB0aGUgVHJlZSI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlkaXNwbGF5LmZpbmRXaWRnZXQodHJlZSwgZS5jaGlsZElEKTsKLQkJCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCQkJZS5yZXN1bHQgPSAiVGhpcyBpcyB0aGUgQWNjZXNzaWJsZSBOYW1lIGZvciB0aGUgVHJlZUl0ZW06ICIgKyBpdGVtLmdldFRleHQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzNmQ2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRha2UgYSBzbmFwc2hvdCBvZiBhIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjkyIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSB0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5VTEwpOwotCQkJdHJlZUl0ZW0uc2V0VGV4dCAoIlRyZWVJdGVtICIgKyBpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQkJCXN1Ykl0ZW0uc2V0VGV4dCgiU3ViSXRlbSAiICsgaSArICItIiArIGopOwotCQkJfQotCQkJaWYgKGkgJSAzID09IDApIHRyZWVJdGVtLnNldEV4cGFuZGVkICh0cnVlKTsKLQkJfQotCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQkJbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IGxhYmVsLmdldEltYWdlICgpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlICgpOwotCQkJfQotCQl9KTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiU25hcHNob3QiKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IGxhYmVsLmdldEltYWdlICgpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlICgpOwotCQkJCWltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCB0cmVlLmdldEJvdW5kcyAoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQkJCQl0cmVlLnByaW50IChnYyk7Ci0JCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCQlsYWJlbC5zZXRJbWFnZSAoaW1hZ2UpOwotCQkJfQotCQl9KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSk7Ci0JCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQl0cmVlLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEgKG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhIChuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjkzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YmM1OTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGNyZWF0ZSBhIHRyaS1zdGF0ZSBidXR0b24uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI5MyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJCi0JCQlCdXR0b24gYjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULkNIRUNLKTsKLQkJCWIxLnNldFRleHQoIlN0YXRlIDEiKTsKLQkJCWIxLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQotCQkJQnV0dG9uIGIyID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JCQliMi5zZXRUZXh0KCJTdGF0ZSAyIik7Ci0JCQliMi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCi0JCQlCdXR0b24gYjMgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULkNIRUNLKTsKLQkJCWIzLnNldFRleHQoIlN0YXRlIDMiKTsKLQkJCWIzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWIzLnNldEdyYXllZCh0cnVlKTsKLQkJCQotCQkJc2hlbGwucGFjaygpOwotCQkJc2hlbGwub3BlbigpOwotCQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGQ2NjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogUmVnaW9uIG9uIGEgY29udHJvbDogY3JlYXRlIGEgbm9uLXJlY3Rhbmd1bGFyIGJ1dHRvbgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOTQgewotCi0Jc3RhdGljIGludFtdIGNpcmNsZShpbnQgciwgaW50IG9mZnNldFgsIGludCBvZmZzZXRZKSB7Ci0JCWludFtdIHBvbHlnb24gPSBuZXcgaW50WzggKiByICsgNF07Ci0JCS8vIHheMiArIHleMiA9IHJeMgotCQlmb3IgKGludCBpID0gMDsgaSA8IDIgKiByICsgMTsgaSsrKSB7Ci0JCQlpbnQgeCA9IGkgLSByOwotCQkJaW50IHkgPSAoaW50KU1hdGguc3FydChyKnIgLSB4KngpOwotCQkJcG9seWdvblsyKmldID0gb2Zmc2V0WCArIHg7Ci0JCQlwb2x5Z29uWzIqaSsxXSA9IG9mZnNldFkgKyB5OwotCQkJcG9seWdvbls4KnIgLSAyKmkgLSAyXSA9IG9mZnNldFggKyB4OwotCQkJcG9seWdvbls4KnIgLSAyKmkgLSAxXSA9IG9mZnNldFkgLSB5OwotCQl9Ci0JCXJldHVybiBwb2x5Z29uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJCi0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJSZWdpb25zIG9uIGEgQ29udHJvbCIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19SRUQpKTsKLQkJCi0JCUJ1dHRvbiBiMiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYjIuc2V0VGV4dCgiQnV0dG9uIHdpdGggUmVnaW9ucyIpOwotCQkKLQkJLy8gZGVmaW5lIGEgcmVnaW9uIHRoYXQgbG9va3MgbGlrZSBhIGNpcmNsZSB3aXRoIHR3byBob2xlcyBpbiBvdAotCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQlyZWdpb24uYWRkKGNpcmNsZSg2NywgODcsIDc3KSk7Ci0JCXJlZ2lvbi5zdWJ0cmFjdChjaXJjbGUoMjAsIDg3LCA0NykpOwotCQlyZWdpb24uc3VidHJhY3QoY2lyY2xlKDIwLCA4NywgMTEzKSk7Ci0JCQotCQkvLyBkZWZpbmUgdGhlIHNoYXBlIG9mIHRoZSBidXR0b24gdXNpbmcgc2V0UmVnaW9uCi0JCWIyLnNldFJlZ2lvbihyZWdpb24pOwotCQliMi5zZXRMb2NhdGlvbigxMDAsNTApOwotCQkKLQkJYjIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwuc2V0U2l6ZSgyMDAsMjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJcmVnaW9uLmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWM0MjQyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogY3JlYXRlIGEgZGlhbG9nIFNoZWxsIGFuZCBwcm9tcHQgZm9yIGEgdGV4dCBzdHJpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI5NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTaGVsbCIpOwotCUZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0JZmlsbExheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCWZpbGxMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0Jc2hlbGwuc2V0TGF5b3V0KGZpbGxMYXlvdXQpOwotCi0JQnV0dG9uIG9wZW4gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCW9wZW4uc2V0VGV4dCAoIlByb21wdCBmb3IgYSBTdHJpbmciKTsKLQlvcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkJZGlhbG9nLnNldFRleHQoIkRpYWxvZyBTaGVsbCIpOwotCQkJRm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQgKCk7Ci0JCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCQlmb3JtTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQkJZm9ybUxheW91dC5zcGFjaW5nID0gMTA7Ci0JCQlkaWFsb2cuc2V0TGF5b3V0IChmb3JtTGF5b3V0KTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGRpYWxvZywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCAoIlR5cGUgYSBTdHJpbmc6Iik7Ci0JCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0KLQkJCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJCWNhbmNlbC5zZXRUZXh0ICgiQ2FuY2VsIik7Ci0JCQlkYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCQkJZGF0YS53aWR0aCA9IDYwOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCQkJY2FuY2VsLnNldExheW91dERhdGEgKGRhdGEpOwotCQkJY2FuY2VsLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2VyIGNhbmNlbGxlZCBkaWFsb2ciKTsKLQkJCQkJZGlhbG9nLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAoZGlhbG9nLCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JCQlkYXRhLndpZHRoID0gMjAwOwotCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgMCwgU1dULkRFRkFVTFQpOwotCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoY2FuY2VsLCAwLCBTV1QuREVGQVVMVCk7Ci0JCQl0ZXh0LnNldExheW91dERhdGEgKGRhdGEpOwotCi0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQgKCJPSyIpOwotCQkJZGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQkJCWRhdGEud2lkdGggPSA2MDsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGNhbmNlbCwgMCwgU1dULkRFRkFVTFQpOwotCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JCQlvay5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiVXNlciB0eXBlZDogIiArIHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCWRpYWxvZy5jbG9zZSAoKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24gKG9rKTsKLQkJCWRpYWxvZy5wYWNrICgpOwotCQkJZGlhbG9nLm9wZW4gKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mjk2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzA0OGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNjcm9sbGVkQ29tcG9zaXRlIHNuaXBwZXQ6IHVzZSBhIFNjcm9sbGVkQ29tcG9zaXRlIHRvIHNjcm9sbCBhIFRyZWUgdmVydGljYWxseQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjk2IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDMwMCk7Ci0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUgKHNoZWxsLCBTV1QuVkVSVElDQUwpOwotCXNjLnNldEJvdW5kcyAoMTAsIDEwLCAxODAsIDIwMCk7Ci0JZmluYWwgaW50IGNsaWVudFdpZHRoID0gc2MuZ2V0Q2xpZW50QXJlYSAoKS53aWR0aDsKLQotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzYywgU1dULk5PTkUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgOTk7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCAoIml0ZW0gIiArIGkpOwotCQluZXcgVHJlZUl0ZW0gKGl0ZW0sIFNXVC5OT05FKS5zZXRUZXh0ICgiY2hpbGQiKTsKLQl9Ci0Jc2Muc2V0Q29udGVudCAodHJlZSk7Ci0JaW50IHByZWZIZWlnaHQgPSB0cmVlLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0JdHJlZS5zZXRTaXplIChjbGllbnRXaWR0aCwgcHJlZkhlaWdodCk7Ci0JLyoKLQkgKiBUaGUgZm9sbG93aW5nIGxpc3RlbmVyIGVuc3VyZXMgdGhhdCB0aGUgVHJlZSBpcyBhbHdheXMgbGFyZ2UKLQkgKiBlbm91Z2ggdG8gbm90IG5lZWQgdG8gc2hvdyBpdHMgb3duIHZlcnRpY2FsIHNjcm9sbGJhci4KLQkgKi8KLQl0cmVlLmFkZFRyZWVMaXN0ZW5lciAobmV3IFRyZWVMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZCAoVHJlZUV2ZW50IGUpIHsKLQkJCWludCBwcmVmSGVpZ2h0ID0gdHJlZS5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCQkJdHJlZS5zZXRTaXplIChjbGllbnRXaWR0aCwgcHJlZkhlaWdodCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZCAoVHJlZUV2ZW50IGUpIHsKLQkJCWludCBwcmVmSGVpZ2h0ID0gdHJlZS5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCQkJdHJlZS5zZXRTaXplIChjbGllbnRXaWR0aCwgcHJlZkhlaWdodCk7Ci0JCX0KLQl9KTsKLQotCUJ1dHRvbiBkb3duQnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlkb3duQnV0dG9uLnNldEJvdW5kcyAoMTAsIDIyMCwgODAsIDMwKTsKLQlkb3duQnV0dG9uLnNldFRleHQgKCJEb3duIDEwcHgiKTsKLQlkb3duQnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXNjLnNldE9yaWdpbiAoMCwgc2MuZ2V0T3JpZ2luICgpLnkgKyAxMCk7Ci0JCX0KLQl9KTsKLQlCdXR0b24gdXBCdXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCXVwQnV0dG9uLnNldEJvdW5kcyAoMTAwLCAyMjAsIDgwLCAzMCk7Ci0JdXBCdXR0b24uc2V0VGV4dCAoIlVwIDEwcHgiKTsKLQl1cEJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzYy5zZXRPcmlnaW4gKDAsIHNjLmdldE9yaWdpbiAoKS55IC0gMTApOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM3MTI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIHdpdGggY29sdW1uIGhlYWRlciBpbWFnZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0Mjk3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JSW1hZ2UgaW1hZ2VzW10gPSBuZXcgSW1hZ2VbXSB7Ci0JCWRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pLAotCQlkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKSwKLQkJZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9RVUVTVElPTiksCi0JCWRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyksCi0JfTsKLQlTdHJpbmdbXSB0aXRsZXMgPSB7IkluZm9ybWF0aW9uIiwgIkVycm9yIiwgIlF1ZXN0aW9uIiwgIldhcm5pbmcifTsKLQlTdHJpbmdbXSBxdWVzdGlvbnMgPSB7Indobz8iLCAid2hhdD8iLCAid2hlcmU/IiwgIndoZW4/IiwgIndoeT8ifTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSAoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQlkYXRhLmhlaWdodEhpbnQgPSAyMDA7Ci0JdGFibGUuc2V0TGF5b3V0RGF0YSAoZGF0YSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8dGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKHRpdGxlcyBbaV0pOwotCQljb2x1bW4uc2V0SW1hZ2UoaW1hZ2VzIFtpXSk7Ci0JfQkKLQlpbnQgY291bnQgPSAxMjg7Ci0JZm9yIChpbnQgaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKDAsICJzb21lIGluZm8iKTsKLQkJaXRlbS5zZXRUZXh0ICgxLCAiZXJyb3IgIyIgKyBpKTsKLQkJaXRlbS5zZXRUZXh0ICgyLCBxdWVzdGlvbnMgW2kgJSBxdWVzdGlvbnMubGVuZ3RoXSk7Ci0JCWl0ZW0uc2V0VGV4dCAoMywgImxvb2sgb3V0ISIpOwotCX0KLQlmb3IgKGludCBpPTA7IGk8dGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbiAoaSkucGFjayAoKTsKLQl9CQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTVmMWVkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBmaW5kIGEgdGFibGUgY2VsbCBmcm9tIG1vdXNlIGRvd24gKFNXVC5GVUxMX1NFTEVDVElPTikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwKLQkJCXwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmaW5hbCBpbnQgcm93Q291bnQgPSA2NCwgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5Db3VudDsgaisrKSB7Ci0JCQlpdGVtLnNldFRleHQoaiwgIkl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJfQotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0JUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCAyMDApOwotCXRhYmxlLnNldFNpemUoc2l6ZSk7Ci0Jc2hlbGwucGFjaygpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtKHB0KTsKLQkJCWlmIChpdGVtID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyhpKTsKLQkJCQlpZiAocmVjdC5jb250YWlucyhwdCkpIHsKLQkJCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJdGVtICIgKyBpbmRleCArICItIiArIGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2JkNzYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyYW0gZXhhbXBsZSBzbmlwcGV0OiBpbnZva2UgdGhlIHN5c3RlbSB0ZXh0IGVkaXRvciBvbiBhdXRvZXhlYy5iYXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JUHJvZ3JhbSBwID0gUHJvZ3JhbS5maW5kUHJvZ3JhbSAoIi50eHQiKTsKLQlpZiAocCAhPSBudWxsKSBwLmV4ZWN1dGUgKCJjOlxcYXV0b2V4ZWMuYmF0Iik7IC8vIFdpbmRvd3Mtc3BlY2lmaWMgZmlsZW5hbWUKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODk4YzFlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyYWNrZXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmFja2VyIChkcmFnIHdoZW4gInRvcm4gb2ZmIikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCVBvaW50IHBvaW50ID0gbnVsbDsKLQkJc3RhdGljIGZpbmFsIGludCBKSVRURVIgPSA4OwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJcG9pbnQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmIChwb2ludCA9PSBudWxsKSByZXR1cm47Ci0JCQkJCWludCBkZWx0YVggPSBwb2ludC54IC0gZXZlbnQueCwgZGVsdGFZID0gcG9pbnQueSAtIGV2ZW50Lnk7Ci0JCQkJCWlmIChNYXRoLmFicyAoZGVsdGFYKSA8IEpJVFRFUiAmJiBNYXRoLmFicyAoZGVsdGFZKSA8IEpJVFRFUikgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVRyYWNrZXIgdHJhY2tlciA9IG5ldyBUcmFja2VyIChkaXNwbGF5LCBTV1QuTk9ORSk7Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gZGlzcGxheS5tYXAgKHNoZWxsLCBudWxsLCBzaGVsbC5nZXRDbGllbnRBcmVhICgpKTsKLQkJCQkJcmVjdC54IC09IGRlbHRhWDsKLQkJCQkJcmVjdC55IC09IGRlbHRhWTsKLQkJCQkJdHJhY2tlci5zZXRSZWN0YW5nbGVzIChuZXcgUmVjdGFuZ2xlIFtdIHtyZWN0fSk7Ci0JCQkJCXRyYWNrZXIub3BlbiAoKTsKLQkJCQkJLy9GQUxMIFRIUk9VR0gKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQlwb2ludCA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjYmRhOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm9ncmFtIGV4YW1wbGUgc25pcHBldDogZmluZCB0aGUgaWNvbiBvZiB0aGUgcHJvZ3JhbSB0aGF0IGVkaXRzIC5ibXAgZmlsZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQgKCJDYW4ndCBmaW5kIGljb24gZm9yIC5ibXAiKTsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JUHJvZ3JhbSBwID0gUHJvZ3JhbS5maW5kUHJvZ3JhbSAoIi5ibXAiKTsKLQlpZiAocCAhPSBudWxsKSB7Ci0JCUltYWdlRGF0YSBkYXRhID0gcC5nZXRJbWFnZURhdGEgKCk7Ci0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCWltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBkYXRhKTsKLQkJCWxhYmVsLnNldEltYWdlIChpbWFnZSk7Ci0JCX0KLQl9Ci0JbGFiZWwucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaWYgKGltYWdlICE9IG51bGwpIGltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmYzkxMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEaXJlY3RvcnlEaWFsb2cgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgZGlyZWN0b3J5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyAoc2hlbGwpOwotCWRpYWxvZy5zZXRGaWx0ZXJQYXRoICgiYzpcXCIpOyAvL1dpbmRvd3Mgc3BlY2lmaWMKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJSRVNVTFQ9IiArIGRpYWxvZy5vcGVuICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc2NWNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBMYWJlbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxhYmVsICh3aXRoIGFuIGltYWdlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldEltYWdlIChpbWFnZSk7Ci0JbGFiZWwucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7IAotCX0gCi0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM4N2NlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIChubyBjb2x1bW5zLCBubyBoZWFkZXJzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRTaXplICgxMDAsIDEwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlNzI4NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGZsYXQgdG9vbCBiYXIgKGltYWdlcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJaXRlbS5zZXRJbWFnZSAoaW1hZ2UpOwotCX0KLQl0b29sQmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2Y2Y2IuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGFiZWwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBsYWJlbCAoYSBzZXBhcmF0b3IpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCW5ldyBMYWJlbCAoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JbmV3IExhYmVsIChzaGVsbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5WRVJUSUNBTCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmFlM2E1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgKGNvbHVtbnMsIGhlYWRlcnMsIGxpbmVzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlICh0cnVlKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlTdHJpbmdbXSB0aXRsZXMgPSB7IiAiLCAiQyIsICIhIiwgIkRlc2NyaXB0aW9uIiwgIlJlc291cmNlIiwgIkluIEZvbGRlciIsICJMb2NhdGlvbiJ9OwotCWZvciAoaW50IGk9MDsgaTx0aXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCAodGl0bGVzIFtpXSk7Ci0JfQkKLQlpbnQgY291bnQgPSAxMjg7Ci0JZm9yIChpbnQgaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKDAsICJ4Iik7Ci0JCWl0ZW0uc2V0VGV4dCAoMSwgInkiKTsKLQkJaXRlbS5zZXRUZXh0ICgyLCAiISIpOwotCQlpdGVtLnNldFRleHQgKDMsICJ0aGlzIHN0dWZmIGJlaGF2ZXMgdGhlIHdheSBJIGV4cGVjdCIpOwotCQlpdGVtLnNldFRleHQgKDQsICJhbG1vc3QgZXZlcnl3aGVyZSIpOwotCQlpdGVtLnNldFRleHQgKDUsICJzb21lLmZvbGRlciIpOwotCQlpdGVtLnNldFRleHQgKDYsICJsaW5lICIgKyBpICsgIiBpbiBub3doZXJlIik7Ci0JfQotCWZvciAoaW50IGk9MDsgaTx0aXRsZXMubGVuZ3RoOyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uIChpKS5wYWNrICgpOwotCX0JCi0JdGFibGUuc2V0U2l6ZSAodGFibGUuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCAyMDApKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI4NWE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENDb21ibyBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIENDb21ibwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDM5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlDQ29tYm8gY29tYm8gPSBuZXcgQ0NvbWJvKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCWNvbWJvLmFkZCgiaXRlbSIgKyBpKTsKLQkJfQotCQljb21iby5zZXRUZXh0KCJpdGVtMCIpOwotCi0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSXRlbSBzZWxlY3RlZCIpOwotCQkJfTsKLQkJfSk7Ci0KLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmM4NDExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBlc2NhcGUgZnJvbSBjbG9zaW5nIGEgZGlhbG9nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiT3BlbiBEaWFsb2cgLi4uIik7Ci0JCWIucGFjaygpOwotCQliLnNldExvY2F0aW9uKDEwLCAxMCk7Ci0JCWIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCVNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNKTsKLQkJCQlkaWFsb2cuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfRVNDQVBFKSB7Ci0JCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjU3NmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBwb3B1cCBtZW51IChzZXQgaW4gbXVsdGlwbGUgY29udHJvbHMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tcG9zaXRlIGMxID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMxLnNldFNpemUgKDEwMCwgMTAwKTsKLQlDb21wb3NpdGUgYzIgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYzIuc2V0Qm91bmRzICgxMDAsIDAsIDEwMCwgMTAwKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLnNldFRleHQgKCJQb3B1cCIpOwotCWMxLnNldE1lbnUgKG1lbnUpOwotCWMyLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwZTE5Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIFRpcHMgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgdG9vbCB0aXBzIGZvciBhIHRhYiBpdGVtLCB0b29sIGl0ZW0sIGFuZCBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JU3RyaW5nIHN0cmluZyA9ICJUaGlzIGlzIGEgc3RyaW5nXG53aXRoIGEgbmV3IGxpbmUuIjsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb2xkZXIuc2V0U2l6ZSAoMjAwLCAyMDApOwotCVRhYkl0ZW0gaXRlbTAgPSBuZXcgVGFiSXRlbSAoZm9sZGVyLCAwKTsKLQlpdGVtMC5zZXRUb29sVGlwVGV4dCAoIlRhYkl0ZW0gdG9vbFRpcDogIiArIHN0cmluZyk7Ci0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWJhci5zZXRCb3VuZHMgKDAsIDIwMCwgMjAwLCA2NCk7Ci0JVG9vbEl0ZW0gaXRlbTEgPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JaXRlbTEuc2V0VG9vbFRpcFRleHQgKCJUb29sSXRlbSB0b29sVGlwOiAiICsgc3RyaW5nKTsKLQlzaGVsbC5zZXRUb29sVGlwVGV4dCAoIlNoZWxsIHRvb2xUaXA6ICIgKyBzdHJpbmcpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWRmNDFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERpc3BsYXkgZXhhbXBsZSBzbmlwcGV0OiBnZXQgdGhlIGJvdW5kcyBhbmQgY2xpZW50IGFyZWEgb2YgYSBkaXNwbGF5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEaXNwbGF5IEJvdW5kcz0iICsgZGlzcGxheS5nZXRCb3VuZHMgKCkgKyAiIERpc3BsYXkgQ2xpZW50QXJlYT0iICsgZGlzcGxheS5nZXRDbGllbnRBcmVhICgpKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlNjM0NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDYXJldCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNhcmV0ICh1c2luZyBhbiBpbWFnZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCUNhcmV0IGNhcmV0ID0gbmV3IENhcmV0IChzaGVsbCwgU1dULk5PTkUpOwotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibGFjayA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTEFDSyk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChibGFjayk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoMCwgMCwgMjAsIDIwKTsKLQlnYy5zZXRGb3JlZ3JvdW5kICh3aGl0ZSk7Ci0JZ2MuZHJhd0xpbmUgKDAsIDAsIDE5LCAxOSk7Ci0JZ2MuZHJhd0xpbmUgKDE5LCAwLCAwLCAxOSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQljYXJldC5zZXRMb2NhdGlvbiAoMTAsIDEwKTsKLQljYXJldC5zZXRJbWFnZSAoaW1hZ2UpOwotCWdjID0gbmV3IEdDIChzaGVsbCk7Ci0JZ2MuZHJhd0ltYWdlIChpbWFnZSwgMTAsIDY0KTsKLQljYXJldC5zZXRWaXNpYmxlIChmYWxzZSk7Ci0JZ2MuZHJhd1N0cmluZyAoIlRlc3QiLCAxMiwgMTIpOwotCWNhcmV0LnNldFZpc2libGUgKHRydWUpOwotCWdjLmRpc3Bvc2UgKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTY4NjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogc2V0IHRoZSBoYW5kIGN1cnNvciBpbnRvIGEgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IgKGRpc3BsYXksIFNXVC5DVVJTT1JfSEFORCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JZmluYWwgQnV0dG9uIGIgPSBuZXcgQnV0dG9uIChzaGVsbCwgMCk7Ci0JYi5zZXRCb3VuZHMgKDEwLCAxMCwgMjAwLCAyMDApOwotCWIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQliLnNldEN1cnNvciAoY3Vyc29yKTsKLQkJfQotCX0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQljdXJzb3IuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhY2VlMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTY2FsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNjYWxlIChtYXhpbXVtIDQwLCBwYWdlIGluY3JlbWVudCA1KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVNjYWxlIHNjYWxlID0gbmV3IFNjYWxlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0Jc2NhbGUuc2V0U2l6ZSAoMjAwLCA2NCk7Ci0Jc2NhbGUuc2V0TWF4aW11bSAoNDApOwotCXNjYWxlLnNldFBhZ2VJbmNyZW1lbnQgKDUpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2FjNjI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBpbnRlcmNlcHQgbW91c2UgZXZlbnRzIChkcmFnIGEgYnV0dG9uIHdpdGggdGhlIG1vdXNlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0NiB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tcG9zaXRlLnNldEVuYWJsZWQgKGZhbHNlKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiQnV0dG9uIik7Ci0JY29tcG9zaXRlLnBhY2sgKCk7Ci0JY29tcG9zaXRlLnNldExvY2F0aW9uICgxMCwgMTApOwotCWZpbmFsIFBvaW50IFtdIG9mZnNldCA9IG5ldyBQb2ludCBbMV07Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBjb21wb3NpdGUuZ2V0Qm91bmRzICgpOwotCQkJCQlpZiAocmVjdC5jb250YWlucyAoZXZlbnQueCwgZXZlbnQueSkpIHsKLQkJCQkJCVBvaW50IHB0MSA9IGNvbXBvc2l0ZS50b0Rpc3BsYXkgKDAsIDApOwotCQkJCQkJUG9pbnQgcHQyID0gc2hlbGwudG9EaXNwbGF5IChldmVudC54LCBldmVudC55KTsgCi0JCQkJCQlvZmZzZXQgWzBdID0gbmV3IFBvaW50IChwdDIueCAtIHB0MS54LCBwdDIueSAtIHB0MS55KTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmIChvZmZzZXQgWzBdICE9IG51bGwpIHsKLQkJCQkJCVBvaW50IHB0ID0gb2Zmc2V0IFswXTsKLQkJCQkJCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAoZXZlbnQueCAtIHB0LngsIGV2ZW50LnkgLSBwdC55KTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQlvZmZzZXQgWzBdID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwNTVjYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIHRvb2wgYmFyIChub3JtYWwsIGhvdCBhbmQgZGlzYWJsZWQgaW1hZ2VzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCi0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCQotCUltYWdlIGRpc2FibGVkSW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfR1JFRU4pOwotCWdjID0gbmV3IEdDIChkaXNhYmxlZEltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoZGlzYWJsZWRJbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JCi0JSW1hZ2UgaG90SW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDIwLCAyMCk7Ci0JY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlnYyA9IG5ldyBHQyAoaG90SW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChob3RJbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JCi0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCk7Ci0JYmFyLnNldFNpemUgKDIwMCwgMzIpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQkJaXRlbS5zZXREaXNhYmxlZEltYWdlIChkaXNhYmxlZEltYWdlKTsKLQkJaXRlbS5zZXRIb3RJbWFnZSAoaG90SW1hZ2UpOwotCQlpZiAoaSAlIDMgPT0gMCkgaXRlbS5zZXRFbmFibGVkIChmYWxzZSk7Ci0JfQotCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzYWJsZWRJbWFnZS5kaXNwb3NlICgpOwotCWhvdEltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2M2JhNzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDYW52YXMgZXhhbXBsZSBzbmlwcGV0OiBzY3JvbGwgYW4gaW1hZ2UgKGZsaWNrZXIgZnJlZSwgbm8gZG91YmxlIGJ1ZmZlcmluZykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUltYWdlIG9yaWdpbmFsSW1hZ2UgPSBudWxsOwotCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cgKHNoZWxsLCBTV1QuT1BFTik7Ci0JZGlhbG9nLnNldFRleHQgKCJPcGVuIGFuIGltYWdlIGZpbGUgb3IgY2FuY2VsIik7Ci0JU3RyaW5nIHN0cmluZyA9IGRpYWxvZy5vcGVuICgpOwotCWlmIChzdHJpbmcgIT0gbnVsbCkgewotCQlvcmlnaW5hbEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBzdHJpbmcpOwotCX0KLQlpZiAob3JpZ2luYWxJbWFnZSA9PSBudWxsKSB7Ci0JCWludCB3aWR0aCA9IDE1MCwgaGVpZ2h0ID0gMjAwOwotCQlvcmlnaW5hbEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJR0MgZ2MgPSBuZXcgR0MgKG9yaWdpbmFsSW1hZ2UpOwotCQlnYy5maWxsUmVjdGFuZ2xlICgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJZ2MuZHJhd0xpbmUgKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCQlnYy5kcmF3TGluZSAoMCwgaGVpZ2h0LCB3aWR0aCwgMCk7Ci0JCWdjLmRyYXdUZXh0ICgiRGVmYXVsdCBJbWFnZSIsIDEwLCAxMCk7Ci0JCWdjLmRpc3Bvc2UgKCk7Ci0JfQotCWZpbmFsIEltYWdlIGltYWdlID0gb3JpZ2luYWxJbWFnZTsKLQlmaW5hbCBQb2ludCBvcmlnaW4gPSBuZXcgUG9pbnQgKDAsIDApOwotCWZpbmFsIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzIChzaGVsbCwgU1dULk5PX0JBQ0tHUk9VTkQgfAotCQkJU1dULk5PX1JFRFJBV19SRVNJWkUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZpbmFsIFNjcm9sbEJhciBoQmFyID0gY2FudmFzLmdldEhvcml6b250YWxCYXIgKCk7Ci0JaEJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWludCBoU2VsZWN0aW9uID0gaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgZGVzdFggPSAtaFNlbGVjdGlvbiAtIG9yaWdpbi54OwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQljYW52YXMuc2Nyb2xsIChkZXN0WCwgMCwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCW9yaWdpbi54ID0gLWhTZWxlY3Rpb247Ci0JCX0KLQl9KTsKLQlmaW5hbCBTY3JvbGxCYXIgdkJhciA9IGNhbnZhcy5nZXRWZXJ0aWNhbEJhciAoKTsKLQl2QmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJaW50IHZTZWxlY3Rpb24gPSB2QmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCBkZXN0WSA9IC12U2VsZWN0aW9uIC0gb3JpZ2luLnk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCWNhbnZhcy5zY3JvbGwgKDAsIGRlc3RZLCAwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJb3JpZ2luLnkgPSAtdlNlbGVjdGlvbjsKLQkJfQotCX0pOwotCWNhbnZhcy5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcyAoKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBjYW52YXMuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWhCYXIuc2V0TWF4aW11bSAocmVjdC53aWR0aCk7Ci0JCQl2QmFyLnNldE1heGltdW0gKHJlY3QuaGVpZ2h0KTsKLQkJCWhCYXIuc2V0VGh1bWIgKE1hdGgubWluIChyZWN0LndpZHRoLCBjbGllbnQud2lkdGgpKTsKLQkJCXZCYXIuc2V0VGh1bWIgKE1hdGgubWluIChyZWN0LmhlaWdodCwgY2xpZW50LmhlaWdodCkpOwotCQkJaW50IGhQYWdlID0gcmVjdC53aWR0aCAtIGNsaWVudC53aWR0aDsKLQkJCWludCB2UGFnZSA9IHJlY3QuaGVpZ2h0IC0gY2xpZW50LmhlaWdodDsKLQkJCWludCBoU2VsZWN0aW9uID0gaEJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgdlNlbGVjdGlvbiA9IHZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaWYgKGhTZWxlY3Rpb24gPj0gaFBhZ2UpIHsKLQkJCQlpZiAoaFBhZ2UgPD0gMCkgaFNlbGVjdGlvbiA9IDA7Ci0JCQkJb3JpZ2luLnggPSAtaFNlbGVjdGlvbjsKLQkJCX0KLQkJCWlmICh2U2VsZWN0aW9uID49IHZQYWdlKSB7Ci0JCQkJaWYgKHZQYWdlIDw9IDApIHZTZWxlY3Rpb24gPSAwOwotCQkJCW9yaWdpbi55ID0gLXZTZWxlY3Rpb247Ci0JCQl9Ci0JCQljYW52YXMucmVkcmF3ICgpOwotCQl9Ci0JfSk7Ci0JY2FudmFzLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlHQyBnYyA9IGUuZ2M7Ci0JCQlnYy5kcmF3SW1hZ2UgKGltYWdlLCBvcmlnaW4ueCwgb3JpZ2luLnkpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQlSZWN0YW5nbGUgY2xpZW50ID0gY2FudmFzLmdldENsaWVudEFyZWEgKCk7Ci0JCQlpbnQgbWFyZ2luV2lkdGggPSBjbGllbnQud2lkdGggLSByZWN0LndpZHRoOwotCQkJaWYgKG1hcmdpbldpZHRoID4gMCkgewotCQkJCWdjLmZpbGxSZWN0YW5nbGUgKHJlY3Qud2lkdGgsIDAsIG1hcmdpbldpZHRoLCBjbGllbnQuaGVpZ2h0KTsKLQkJCX0KLQkJCWludCBtYXJnaW5IZWlnaHQgPSBjbGllbnQuaGVpZ2h0IC0gcmVjdC5oZWlnaHQ7Ci0JCQlpZiAobWFyZ2luSGVpZ2h0ID4gMCkgewotCQkJCWdjLmZpbGxSZWN0YW5nbGUgKDAsIHJlY3QuaGVpZ2h0LCBjbGllbnQud2lkdGgsIG1hcmdpbkhlaWdodCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDE1MCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0Jb3JpZ2luYWxJbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2YTEyOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIHRvb2wgYmFyICh3cmFwIG9uIHJlc2l6ZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0OSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5XUkFQKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCVBvaW50IHNpemUgPSB0b29sQmFyLmNvbXB1dGVTaXplIChyZWN0LndpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCQl0b29sQmFyLnNldFNpemUgKHNpemUpOwotCQl9Ci0JfSk7Ci0JdG9vbEJhci5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VhOTc4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2Nyb2xsZWRDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBzY3JvbGwgYSBjb250cm9sIGluIGEgc2Nyb2xsZWQgY29tcG9zaXRlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSAKLXsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0gICAgLy8gdGhpcyBidXR0b24gaXMgYWx3YXlzIDQwMCB4IDQwMC4gU2Nyb2xsYmFycyBhcHBlYXIgaWYgdGhlIHdpbmRvdyBpcyByZXNpemVkIHRvIGJlCi0gICAgLy8gdG9vIHNtYWxsIHRvIHNob3cgcGFydCBvZiB0aGUgYnV0dG9uCi0gICAgU2Nyb2xsZWRDb21wb3NpdGUgYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgIEJ1dHRvbiBiMSA9IG5ldyBCdXR0b24oYzEsIFNXVC5QVVNIKTsKLSAgICBiMS5zZXRUZXh0KCJmaXhlZCBzaXplIGJ1dHRvbiIpOwotICAgIGIxLnNldFNpemUoNDAwLCA0MDApOwotICAgIGMxLnNldENvbnRlbnQoYjEpOwotCi0gICAgLy8gdGhpcyBidXR0b24gaGFzIGEgbWluaW11bSBzaXplIG9mIDQwMCB4IDQwMC4gSWYgdGhlIHdpbmRvdyBpcyByZXNpemVkIHRvIGJlIGJpZwotICAgIC8vIGVub3VnaCB0byBzaG93IG1vcmUgdGhhbiA0MDAgeCA0MDAsIHRoZSBidXR0b24gd2lsbCBncm93IGluIHNpemUuIElmIHRoZSB3aW5kb3cKLSAgICAvLyBpcyBtYWRlIHRvbyBzbWFsbCB0byBzaG93IDQwMCB4IDQwMCwgc2Nyb2xsYmFycyB3aWxsIGFwcGVhci4KLSAgICBTY3JvbGxlZENvbXBvc2l0ZSBjMiA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgQnV0dG9uIGIyID0gbmV3IEJ1dHRvbihjMiwgU1dULlBVU0gpOwotICAgIGIyLnNldFRleHQoImV4cGFuZGluZyBidXR0b24iKTsKLSAgICBjMi5zZXRDb250ZW50KGIyKTsKLSAgICBjMi5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotICAgIGMyLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotICAgIGMyLnNldE1pbldpZHRoKDQwMCk7Ci0gICAgYzIuc2V0TWluSGVpZ2h0KDQwMCk7Ci0KLSAgICBzaGVsbC5zZXRTaXplKDYwMCwgMzAwKTsKLSAgICBzaGVsbC5vcGVuICgpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmQyOTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgZGlhbG9nIHNoZWxsCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCAoIlNoZWxsIik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0JU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsIChzaGVsbCk7Ci0JZGlhbG9nLnNldFRleHQgKCJEaWFsb2ciKTsKLQlkaWFsb2cuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWRpYWxvZy5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYmQ3NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIHRhYmxlIChzZXQgdGhlIHRvcCBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0VG9wSW5kZXggKDk1KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQyNDYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogc2VsZWN0IGFuIGluZGV4IChzZWxlY3QgYW5kIHNjcm9sbCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2VsZWN0aW9uICg5NSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjYWU0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiByZW1vdmUgc2VsZWN0ZWQgaXRlbXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQl0YWJsZS5zZXRNZW51IChtZW51KTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0ICgiRGVsZXRlIFNlbGVjdGlvbiIpOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJdGFibGUucmVtb3ZlICh0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzICgpKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGIzYTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNhc2ggZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzYXNoIChhbGxvdyBpdCB0byBiZSBtb3ZlZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBTYXNoIHNhc2ggPSBuZXcgU2FzaCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVkVSVElDQUwpOwotCXNhc2guc2V0Qm91bmRzICgxMCwgMTAsIDMyLCAxMDApOwotCXNhc2guYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlzYXNoLnNldEJvdW5kcyAoZS54LCBlLnksIGUud2lkdGgsIGUuaGVpZ2h0KTsKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jc2FzaC5zZXRGb2N1cyAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmE4M2YuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiByZXNpemUgYSB0ZXh0IGNvbnRyb2wgKHNob3cgYWJvdXQgMTAgY2hhcmFjdGVycykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWludCBjb2x1bW5zID0gMTA7Ci0JR0MgZ2MgPSBuZXcgR0MgKHRleHQpOwotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MgKCk7Ci0JaW50IHdpZHRoID0gY29sdW1ucyAqIGZtLmdldEF2ZXJhZ2VDaGFyV2lkdGggKCk7Ci0JaW50IGhlaWdodCA9IGZtLmdldEhlaWdodCAoKTsKLQlnYy5kaXNwb3NlICgpOwotCXRleHQuc2V0U2l6ZSAodGV4dC5jb21wdXRlU2l6ZSAod2lkdGgsIGhlaWdodCkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZWFiYjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3Jlc3NCYXIgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBwcm9ncmVzcyBiYXIgKGZyb20gYW5vdGhlciB0aHJlYWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJZmluYWwgUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IFByb2dyZXNzQmFyKHNoZWxsLCBTV1QuU01PT1RIKTsKLQkJYmFyLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMzIpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWZpbmFsIGludCBtYXhpbXVtID0gYmFyLmdldE1heGltdW0oKTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmb3IgKGZpbmFsIGludFtdIGkgPSBuZXcgaW50WzFdOyBpWzBdIDw9IG1heGltdW07IGlbMF0rKykgewotCQkJCXRyeSB7VGhyZWFkLnNsZWVwICgxMDApO30gY2F0Y2ggKFRocm93YWJsZSB0aCkge30KLQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChiYXIuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCQkJCWJhci5zZXRTZWxlY3Rpb24oaVswXSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDI5NWY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyZXNzQmFyIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIGEgcHJvZ3Jlc3MgYmFyIChmcm9tIHRoZSBVSSB0aHJlYWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JUHJvZ3Jlc3NCYXIgYmFyID0gbmV3IFByb2dyZXNzQmFyIChzaGVsbCwgU1dULlNNT09USCk7Ci0JYmFyLnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDMyKTsKLQlzaGVsbC5vcGVuICgpOwotCWZvciAoaW50IGk9MDsgaTw9YmFyLmdldE1heGltdW0gKCk7IGkrKykgewotCQl0cnkge1RocmVhZC5zbGVlcCAoMTAwKTt9IGNhdGNoIChUaHJvd2FibGUgdGgpIHt9Ci0JCWJhci5zZXRTZWxlY3Rpb24gKGkpOwotCX0KLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MTQ0MTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGEgY29tYm8gYm94IGluIGEgdG9vbCBiYXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ1OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChiYXIsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JVG9vbEl0ZW0gc2VwID0gbmV3IFRvb2xJdGVtIChiYXIsIFNXVC5TRVBBUkFUT1IpOwotCWludCBzdGFydCA9IGJhci5nZXRJdGVtQ291bnQgKCk7Ci0JZm9yIChpbnQgaT1zdGFydDsgaTxzdGFydCs0OyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCAwKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChiYXIsIFNXVC5SRUFEX09OTFkpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJY29tYm8uYWRkICgiSXRlbSAiICsgaSk7Ci0JfQotCWNvbWJvLnBhY2sgKCk7Ci0Jc2VwLnNldFdpZHRoIChjb21iby5nZXRTaXplICgpLngpOwotCXNlcC5zZXRDb250cm9sIChjb21ibyk7Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4ZGFjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBMaXN0IGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2VsZWN0ZWQgaXRlbXMgaW4gYSBsaXN0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgTGlzdCBsaXN0ID0gbmV3IExpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspIGxpc3QuYWRkICgiSXRlbSAiICsgaSk7Ci0JbGlzdC5zZXRCb3VuZHMgKDAsIDAsIDEwMCwgMTAwKTsKLQlsaXN0LmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJaW50IFtdIHNlbGVjdGlvbiA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCWxpc3QuYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJaW50IFtdIHNlbGVjdGlvbiA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGVmYXVsdFNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzMjQ3Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdyaWRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgZ3JpZCBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0gICAgZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBmaW5hbCBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGMuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgICAgIGIuc2V0VGV4dCgiQnV0dG9uICIraSk7Ci0gICAgfQotCi0gICAgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgYi5zZXRUZXh0KCJhZGQgYSBuZXcgYnV0dG9uIGF0IHJvdyAyIGNvbHVtbiAxIik7Ci0gICAgZmluYWwgaW50W10gaW5kZXggPSBuZXcgaW50WzFdOwotICAgIGIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0gICAgICAgICAgICBCdXR0b24gcyA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgICAgICAgICAgcy5zZXRUZXh0KCJTcGVjaWFsICIraW5kZXhbMF0pOwotICAgICAgICAgICAgaW5kZXhbMF0rKzsKLSAgICAgICAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IGMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIHMubW92ZUFib3ZlKGNoaWxkcmVuWzNdKTsKLSAgICAgICAgICAgIHNoZWxsLmxheW91dChuZXcgQ29udHJvbFtdIHtzfSk7Ci0gICAgICAgIH0KLSAgICB9KTsKLQotICAgIHNoZWxsLm9wZW4gKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiY2UxMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIHR3byBvbmUgc2hvdCB0aW1lcnMgKDUwMDAgbXMsIDIwMDAgbXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0JZGlzcGxheS50aW1lckV4ZWMgKDUwMDAsIG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCI1MDAwIik7Ci0JCX0KLQl9KTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAoMjAwMCwgbmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIjIwMDAiKTsKLQkJfQotCX0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5NWU2Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2VsZWN0ZWQgaXRlbXMgaW4gYSB0cmVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtMCA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCWl0ZW0wLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJZm9yIChpbnQgaj0wOyBqPDQ7IGorKykgewotCQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0wLCAwKTsKLQkJCWl0ZW0xLnNldFRleHQgKCJTdWJJdGVtICIgKyBpICsgIiAiICsgaik7Ci0JCQlmb3IgKGludCBrPTA7IGs8NDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTIgPSBuZXcgVHJlZUl0ZW0gKGl0ZW0xLCAwKTsKLQkJCQlpdGVtMi5zZXRUZXh0ICgiU3ViSXRlbSAiICsgaSArICIgIiArIGogKyAiICIgKyBrKTsKLQkJCX0JCi0JCX0KLQl9Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRyZWVJdGVtIFtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUcmVlSXRlbSBbXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGVmYXVsdFNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuRXhwYW5kLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiRXhwYW5kPXsiICsgZS5pdGVtICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5Db2xsYXBzZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkNvbGxhcHNlPXsiICsgZS5pdGVtICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuZ2V0SXRlbXMgKCkgWzBdLnNldEV4cGFuZGVkICh0cnVlKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI5Njc3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogcHJpbnQgbW91c2Ugc3RhdGUgYW5kIGJ1dHRvbiAoZG93biwgbW92ZSwgdXApCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MiB7Ci0KLXN0YXRpYyBTdHJpbmcgc3RhdGVNYXNrIChpbnQgc3RhdGVNYXNrKSB7Ci0JU3RyaW5nIHN0cmluZyA9ICIiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpICE9IDApIHN0cmluZyArPSAiIENUUkwiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkFMVCkgIT0gMCkgc3RyaW5nICs9ICIgQUxUIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgc3RyaW5nICs9ICIgU0hJRlQiOwotCWlmICgoc3RhdGVNYXNrICYgU1dULkNPTU1BTkQpICE9IDApIHN0cmluZyArPSAiIENPTU1BTkQiOwotCXJldHVybiBzdHJpbmc7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIlVua25vd24iOwotCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246IHN0cmluZyA9ICJET1dOIjsgYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOiBzdHJpbmcgPSAiTU9WRSI7IGJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlVXA6IHN0cmluZyA9ICJVUCI7IGJyZWFrOwotCQkJfQotCQkJc3RyaW5nICs9IjogYnV0dG9uOiAiICsgZS5idXR0b24gKyAiLCAiOwotCQkJc3RyaW5nICs9ICJzdGF0ZU1hc2s9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyAoZS5zdGF0ZU1hc2spICsgc3RhdGVNYXNrIChlLnN0YXRlTWFzaykgKyAiLCB4PSIgKyBlLnggKyAiLCB5PSIgKyBlLnk7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjEpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjEiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT04yKSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT04yIjsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMykgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9OMyI7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjQpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjQiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT041KSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT041IjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoc3RyaW5nKTsKLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWUxYTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBkaWFsb2cgc2hlbGwgKHByb21wdCBmb3IgYSB2YWx1ZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCWZpbmFsIGJvb2xlYW4gW10gcmVzdWx0ID0gbmV3IGJvb2xlYW4gWzFdOwotCWZpbmFsIFNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JZGlhbG9nLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JZmluYWwgQnV0dG9uIG9rID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0Jb2suc2V0VGV4dCAoIk9LIik7Ci0JQnV0dG9uIGNhbmNlbCA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCWNhbmNlbC5zZXRUZXh0ICgiQ2FuY2VsIik7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPW5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcmVzdWx0IFswXSA9IGV2ZW50LndpZGdldCA9PSBvazsKLQkJCWRpYWxvZy5jbG9zZSAoKTsKLQkJfQotCX07Ci0Jb2suYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQljYW5jZWwuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQlkaWFsb2cucGFjayAoKTsKLQlkaWFsb2cub3BlbiAoKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJQcm9tcHQgLi4uIik7Ci0Jd2hpbGUgKCFkaWFsb2cuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJSZXN1bHQ6ICIgKyByZXN1bHQgWzBdKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOGRiMTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcHJpbnQgc2VsZWN0ZWQgaXRlbXMgaW4gYSB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQl0YWJsZS5zZXRCb3VuZHMgKDAsIDAsIDEwMCwgMTAwKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRhYmxlSXRlbSBbXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUYWJsZUl0ZW0gW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uICgpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgc3RyaW5nICs9IHNlbGVjdGlvbiBbaV0gKyAiICI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEZWZhdWx0U2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDU1MmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEZvcm1MYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzaW1wbGUgZGlhbG9nIHVzaW5nIGZvcm0gbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULldSQVApOwotCWxhYmVsLnNldFRleHQgKCJUaGlzIGlzIGEgbG9uZyB0ZXh0IHN0cmluZyB0aGF0IHdpbGwgd3JhcCB3aGVuIHRoZSBkaWFsb2cgaXMgcmVzaXplZC4iKTsKLQlMaXN0IGxpc3QgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWxpc3Quc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJJdGVtIDEiLCAiSXRlbSAyIn0pOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJPSyIpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQgKCJDYW5jZWwiKTsKLQkKLQlmaW5hbCBpbnQgaW5zZXRYID0gNCwgaW5zZXRZID0gNDsKLQlGb3JtTGF5b3V0IGZvcm1MYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTsKLQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gaW5zZXRYOwotCWZvcm1MYXlvdXQubWFyZ2luSGVpZ2h0ID0gaW5zZXRZOwotCXNoZWxsLnNldExheW91dCAoZm9ybUxheW91dCk7Ci0JCi0JUG9pbnQgc2l6ZSA9IGxhYmVsLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCWZpbmFsIEZvcm1EYXRhIGxhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSAoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JbGFiZWxEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWxhYmVsRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhIChsYWJlbERhdGEpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRDbGllbnRBcmVhICgpOwotCQkJbGFiZWxEYXRhLndpZHRoID0gcmVjdC53aWR0aCAtIGluc2V0WCAqIDI7Ci0JCQlzaGVsbC5sYXlvdXQgKCk7Ci0JCX0KLQl9KTsKLQkJCi0JRm9ybURhdGEgYnV0dG9uMkRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMkRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLWluc2V0WCk7Ci0JYnV0dG9uMkRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWJ1dHRvbjIuc2V0TGF5b3V0RGF0YSAoYnV0dG9uMkRhdGEpOwotCQotCUZvcm1EYXRhIGJ1dHRvbjFEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWJ1dHRvbjFEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50IChidXR0b24yLCAtaW5zZXRYKTsKLQlidXR0b24xRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMS5zZXRMYXlvdXREYXRhIChidXR0b24xRGF0YSk7Ci0JCi0JRm9ybURhdGEgbGlzdERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JbGlzdERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JbGlzdERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JbGlzdERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgaW5zZXRZKTsKLQlsaXN0RGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGJ1dHRvbjIsIC1pbnNldFkpOwotCWxpc3Quc2V0TGF5b3V0RGF0YSAobGlzdERhdGEpOwotCQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjhmODcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgYSBzaW1wbGUgc2NyaWJibGUgcHJvZ3JhbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJaW50IGxhc3RYID0gMCwgbGFzdFkgPSAwOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMSkgPT0gMCkgYnJlYWs7Ci0JCQkJCUdDIGdjID0gbmV3IEdDIChzaGVsbCk7Ci0JCQkJCWdjLmRyYXdMaW5lIChsYXN0WCwgbGFzdFksIGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQlnYy5kaXNwb3NlICgpOwotCQkJCQkvL0ZBTEwgVEhST1VHSAotCQkJCWNhc2UgU1dULk1vdXNlRG93bjoKLQkJCQkJbGFzdFggPSBldmVudC54OwotCQkJCQlsYXN0WSA9IGV2ZW50Lnk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTRlOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGEgZHJvcCBkb3duIG1lbnUgaW4gYSB0b29sIGJhcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULk5PTkUpOwotCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JZm9yIChpbnQgaT0wOyBpPDg7IGkrKykgewotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlmaW5hbCBUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtICh0b29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gU1dULkFSUk9XKSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyAoKTsKLQkJCQlQb2ludCBwdCA9IG5ldyBQb2ludCAocmVjdC54LCByZWN0LnkgKyByZWN0LmhlaWdodCk7Ci0JCQkJcHQgPSB0b29sQmFyLnRvRGlzcGxheSAocHQpOwotCQkJCW1lbnUuc2V0TG9jYXRpb24gKHB0LngsIHB0LnkpOwotCQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0b29sQmFyLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQltZW51LmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTJiMWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERpc3BsYXkgZXhhbXBsZSBzbmlwcGV0OiBzdG9wIGEgcmVwZWF0aW5nIHRpbWVyIHdoZW4gYSBidXR0b24gaXMgcHJlc3NlZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWZpbmFsIENvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJTdG9wIFRpbWVyIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRCYWNrZ3JvdW5kIChyZWQpOwotCWZpbmFsIGludCB0aW1lID0gNTAwOwotCWZpbmFsIFJ1bm5hYmxlIHRpbWVyID0gbmV3IFJ1bm5hYmxlICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCWlmIChsYWJlbC5pc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0JCQlDb2xvciBjb2xvciA9IGxhYmVsLmdldEJhY2tncm91bmQgKCkuZXF1YWxzIChyZWQpID8gYmx1ZSA6IHJlZDsKLQkJCWxhYmVsLnNldEJhY2tncm91bmQgKGNvbG9yKTsKLQkJCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aGlzKTsKLQkJfQotCX07Ci0JZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRpbWVyKTsKLQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJZGlzcGxheS50aW1lckV4ZWMgKC0xLCB0aW1lcik7Ci0JCX0KLQl9KTsKLQlidXR0b24ucGFjayAoKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhIChuZXcgUm93RGF0YSAoYnV0dG9uLmdldFNpemUgKCkpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGJmOTk5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZvcm1MYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBjZW50ZXIgYSBsYWJlbCBhbmQgc2luZ2xlIGxpbmUgdGV4dCB1c2luZyBhIGZvcm0gbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUgfCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRUZXh0ICgiTmFtZSIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULk5PTkUpOwotCi0JRm9ybUxheW91dCBsYXlvdXQgPSBuZXcgRm9ybUxheW91dCAoKTsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLQlzaGVsbC5zZXRMYXlvdXQgKGxheW91dCk7Ci0KLQlHQyBnYyA9IG5ldyBHQyAodGV4dCk7Ci0JRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcyAoKTsKLQlpbnQgY2hhcldpZHRoID0gZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCAoKTsKLQlpbnQgd2lkdGggPSB0ZXh0LmNvbXB1dGVTaXplIChjaGFyV2lkdGggKiA4LCBTV1QuREVGQVVMVCkueDsKLQlnYy5kaXNwb3NlICgpOwotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEgKHdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JdGV4dC5zZXRMYXlvdXREYXRhIChkYXRhKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCA1KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCAobGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4MzYzZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdGFibGUgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0ICgiTGF6eSBUYWJsZSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkICgpIHsKLQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCWZvciAoaW50IGk9MDsgaTwyMDAwMDsgaSsrKSB7Ci0JCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQlmaW5hbCBpbnQgW10gaW5kZXggPSBuZXcgaW50IFtdIHtpfTsKLQkJCQlkaXNwbGF5LnN5bmNFeGVjIChuZXcgUnVubmFibGUgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCWl0ZW0uc2V0VGV4dCAoIlRhYmxlIEl0ZW0gIiArIGluZGV4IFswXSk7Ci0JCQkJCQlpdGVtLnNldEltYWdlIChpbWFnZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX07Ci0JdGhyZWFkLnN0YXJ0ICgpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzI3NzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYW4gaWNvbiAoaW4gbWVtb3J5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQkKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoNSwgNSwgMTAsIDEwKTsKLQlnYy5kaXNwb3NlICgpOwotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEgKCk7Ci0JCi0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAoCi0JCW5ldyBSR0IgW10gewotCQkJbmV3IFJHQiAoMCwgMCwgMCksCi0JCQluZXcgUkdCICgweEZGLCAweEZGLCAweEZGKSwKLQkJfSk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gbmV3IEltYWdlRGF0YSAoMjAsIDIwLCAxLCBwYWxldHRlKTsKLQlJbWFnZSBtYXNrID0gbmV3IEltYWdlIChkaXNwbGF5LCBtYXNrRGF0YSk7Ci0JZ2MgPSBuZXcgR0MgKG1hc2spOwotCWdjLnNldEJhY2tncm91bmQgKGJsYWNrKTsKLQlnYy5maWxsUmVjdGFuZ2xlICgwLCAwLCAyMCwgMjApOwotCWdjLnNldEJhY2tncm91bmQgKHdoaXRlKTsKLQlnYy5maWxsUmVjdGFuZ2xlICg1LCA1LCAxMCwgMTApOwotCWdjLmRpc3Bvc2UgKCk7Ci0JbWFza0RhdGEgPSBtYXNrLmdldEltYWdlRGF0YSAoKTsKLQkKLQlJbWFnZSBpY29uID0gbmV3IEltYWdlIChkaXNwbGF5LCBpbWFnZURhdGEsIG1hc2tEYXRhKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldEltYWdlIChpY29uKTsKLQlidXR0b24uc2V0U2l6ZSAoNjAsIDYwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpY29uLmRpc3Bvc2UgKCk7Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQltYXNrLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGQ0ZmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9ybUxheW91dCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNpbXBsZSBPSy9DQU5DRUwgZGlhbG9nIHVzaW5nIGZvcm0gbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChkaWFsb2csIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiRXhpdCB0aGUgYXBwbGljYXRpb24/Iik7Ci0JQnV0dG9uIG9rQnV0dG9uID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0Jb2tCdXR0b24uc2V0VGV4dCAoIiZPSyIpOwotCUJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQljYW5jZWxCdXR0b24uc2V0VGV4dCAoIiZDYW5jZWwiKTsKLQkKLQlGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCAoKTsKLQlmb3JtLm1hcmdpbldpZHRoID0gZm9ybS5tYXJnaW5IZWlnaHQgPSA4OwotCWRpYWxvZy5zZXRMYXlvdXQgKGZvcm0pOwotCUZvcm1EYXRhIG9rRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlva0RhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgOCk7Ci0Jb2tCdXR0b24uc2V0TGF5b3V0RGF0YSAob2tEYXRhKTsKLQlGb3JtRGF0YSBjYW5jZWxEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWNhbmNlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAob2tCdXR0b24sIDgpOwotCWNhbmNlbERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChva0J1dHRvbiwgMCwgU1dULlRPUCk7Ci0JY2FuY2VsQnV0dG9uLnNldExheW91dERhdGEgKGNhbmNlbERhdGEpOwotCQotCWRpYWxvZy5zZXREZWZhdWx0QnV0dG9uIChva0J1dHRvbik7Ci0JZGlhbG9nLnBhY2sgKCk7Ci0JZGlhbG9nLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZjODlhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZpbGVEaWFsb2cgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgZmlsZSBuYW1lICh0byBzYXZlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDcyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyAoc2hlbGwsIFNXVC5TQVZFKTsKLQlkaWFsb2cuc2V0RmlsdGVyTmFtZXMgKG5ldyBTdHJpbmcgW10geyJCYXRjaCBGaWxlcyIsICJBbGwgRmlsZXMgKCouKikifSk7Ci0JZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMgKG5ldyBTdHJpbmcgW10geyIqLmJhdCIsICIqLioifSk7IC8vV2luZG93cyB3aWxkIGNhcmRzCi0JZGlhbG9nLnNldEZpbHRlclBhdGggKCJjOlxcIik7IC8vV2luZG93cyBwYXRoCi0JZGlhbG9nLnNldEZpbGVOYW1lICgiZnJlZC5iYXQiKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTYXZlIHRvOiAiICsgZGlhbG9nLm9wZW4gKCkpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDczLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkODU1Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogZW5hYmxlIG1lbnUgaXRlbXMgZHluYW1pY2FsbHkgKHdoZW4gbWVudSBzaG93bikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JdHJlZS5zZXRNZW51IChtZW51KTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUcmVlSXRlbSB0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQl0cmVlSXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JCW1lbnVJdGVtLnNldFRleHQgKHRyZWVJdGVtLmdldFRleHQgKCkpOwotCX0KLQltZW51LmFkZExpc3RlbmVyIChTV1QuU2hvdywgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlNZW51SXRlbSBbXSBtZW51SXRlbXMgPSBtZW51LmdldEl0ZW1zICgpOwotCQkJVHJlZUl0ZW0gW10gdHJlZUl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8bWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtZW51SXRlbXMgW2ldLmdldFRleHQgKCk7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQl3aGlsZSAoaW5kZXg8dHJlZUl0ZW1zLmxlbmd0aCkgewotCQkJCQlpZiAodHJlZUl0ZW1zIFtpbmRleF0uZ2V0VGV4dCAoKS5lcXVhbHMgKHRleHQpKSBicmVhazsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQkJbWVudUl0ZW1zIFtpXS5zZXRFbmFibGVkIChpbmRleCAhPSB0cmVlSXRlbXMubGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0pOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4YmRiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDYXJldCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGNhcmV0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ2FyZXQgY2FyZXQgPSBuZXcgQ2FyZXQgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY2FyZXQuc2V0Qm91bmRzICgxMCwgMTAsIDIsIDMyKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyNzljZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogc2V0IHRoZSB0YWIgdHJhdmVyc2FsIG9yZGVyIG9mIGNoaWxkcmVuCi0gKiBJbiB0aGlzIGV4YW1wbGUsIGNvbXBvc2l0ZTEgKGkuZS4gYzEpIHRhYiBvcmRlciBpcyBzZXQgdG86IEIyLCBCMSwgQjMsIGFuZAotICogc2hlbGwgdGFiIG9yZGVyIGlzIHNldCB0bzogYzEsIEI3LCB0b29sQmFyMSwgKGM0OiBubyBmb2N1c2FibGUgY2hpbGRyZW4pLCBjMiwgTDIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQkKLQlDb21wb3NpdGUgYzEgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYzEuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYjEgPSBuZXcgQnV0dG9uIChjMSwgU1dULlBVU0gpOwotCWIxLnNldFRleHQgKCJCJjEiKTsKLQlCdXR0b24gcjEgPSBuZXcgQnV0dG9uIChjMSwgU1dULlJBRElPKTsKLQlyMS5zZXRUZXh0ICgiUjEiKTsKLQlCdXR0b24gcjIgPSBuZXcgQnV0dG9uIChjMSwgU1dULlJBRElPKTsKLQlyMi5zZXRUZXh0ICgiUiYyIik7Ci0JQnV0dG9uIHIzID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5SQURJTyk7Ci0JcjMuc2V0VGV4dCAoIlIzIik7Ci0JQnV0dG9uIGIyID0gbmV3IEJ1dHRvbiAoYzEsIFNXVC5QVVNIKTsKLQliMi5zZXRUZXh0ICgiQjIiKTsKLQlMaXN0IGwxID0gbmV3IExpc3QgKGMxLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JbDEuc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJMMSJ9KTsKLQlCdXR0b24gYjMgPSBuZXcgQnV0dG9uIChjMSwgU1dULlBVU0gpOwotCWIzLnNldFRleHQgKCJCJjMiKTsKLQlCdXR0b24gYjQgPSBuZXcgQnV0dG9uIChjMSwgU1dULlBVU0gpOwotCWI0LnNldFRleHQgKCJCJjQiKTsKLQkKLQlDb21wb3NpdGUgYzIgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JYzIuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYjUgPSBuZXcgQnV0dG9uIChjMiwgU1dULlBVU0gpOwotCWI1LnNldFRleHQgKCJCJjUiKTsKLQlCdXR0b24gYjYgPSBuZXcgQnV0dG9uIChjMiwgU1dULlBVU0gpOwotCWI2LnNldFRleHQgKCJCJjYiKTsKLQkKLQlMaXN0IGwyID0gbmV3IExpc3QgKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JbDIuc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJMMiJ9KTsKLQkKLQlUb29sQmFyIHRiMSA9IG5ldyBUb29sQmFyIChzaGVsbCwgU1dULkZMQVQgfCBTV1QuQk9SREVSKTsKLQlUb29sSXRlbSBpMSA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuUkFESU8pOwotCWkxLnNldFRleHQgKCJJMSIpOwotCVRvb2xJdGVtIGkyID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5SQURJTyk7Ci0JaTIuc2V0VGV4dCAoIkkyIik7Ci0JQ29tYm8gY29tYm8xID0gbmV3IENvbWJvICh0YjEsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQljb21ibzEuc2V0SXRlbXMgKG5ldyBTdHJpbmcgW10geyJDMSJ9KTsKLQljb21ibzEuc2V0VGV4dCAoIkMxIik7Ci0JY29tYm8xLnBhY2sgKCk7Ci0JVG9vbEl0ZW0gaTMgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlNFUEFSQVRPUik7Ci0JaTMuc2V0V2lkdGggKGNvbWJvMS5nZXRTaXplICgpLngpOwotCWkzLnNldENvbnRyb2wgKGNvbWJvMSk7Ci0JVG9vbEl0ZW0gaTQgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlBVU0gpOwotCWk0LnNldFRleHQgKCJJJjQiKTsKLQlUb29sSXRlbSBpNSA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuQ0hFQ0spOwotCWk1LnNldFRleHQgKCJJNSIpOwotCQotCUJ1dHRvbiBiNyA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYjcuc2V0VGV4dCAoIkImNyIpOwotCQotCUNvbXBvc2l0ZSBjNCA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlDb21wb3NpdGUgYzUgPSBuZXcgQ29tcG9zaXRlIChjNCwgU1dULkJPUkRFUik7Ci0JYzUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCW5ldyBMYWJlbChjNSwgU1dULk5PTkUpLnNldFRleHQoIk5vIik7Ci0JYzUucGFjaygpOwotCi0JQ29udHJvbCBbXSB0YWJMaXN0MSA9IG5ldyBDb250cm9sIFtdIHtiMiwgYjEsIGIzfTsKLQljMS5zZXRUYWJMaXN0ICh0YWJMaXN0MSk7Ci0JQ29udHJvbCBbXSB0YWJMaXN0MiA9IG5ldyBDb250cm9sIFtdIHtjMSwgYjcsIHRiMSwgYzQsIGMyLCBsMn07Ci0Jc2hlbGwuc2V0VGFiTGlzdCAodGFiTGlzdDIpOwotCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCQotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxNzgzYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJGb2xkZXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWIgZm9sZGVyIChzaXggcGFnZXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVGFiRm9sZGVyIHRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8NjsgaSsrKSB7Ci0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtICh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiVGFiSXRlbSAiICsgaSk7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uICh0YWJGb2xkZXIsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQgKCJQYWdlICIgKyBpKTsKLQkJaXRlbS5zZXRDb250cm9sIChidXR0b24pOwotCX0KLQl0YWJGb2xkZXIucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWIyNzZhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcmVzaXplIGNvbHVtbnMgYXMgdGFibGUgcmVzaXplcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQotCWZpbmFsIENvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4xLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjIuc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJpdGVtIDAiICsgaSwgIml0ZW0gMSIraX0pOwotCX0KLQljb21wLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgYXJlYSA9IGNvbXAuZ2V0Q2xpZW50QXJlYSgpOwotCQkJUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQlTY3JvbGxCYXIgdkJhciA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci0JCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gdGFibGUuY29tcHV0ZVRyaW0oMCwwLDAsMCkud2lkdGggLSB2QmFyLmdldFNpemUoKS54OwotCQkJaWYgKHNpemUueSA+IGFyZWEuaGVpZ2h0ICsgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkpIHsKLQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbiB3aWR0aAotCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQlQb2ludCB2QmFyU2l6ZSA9IHZCYXIuZ2V0U2l6ZSgpOwotCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQl9Ci0JCQlQb2ludCBvbGRTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJaWYgKG9sZFNpemUueCA+IGFyZWEud2lkdGgpIHsKLQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucyAKLQkJCQkvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoLzMpOwotCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLSBjb2x1bW4xLmdldFdpZHRoKCkpOwotCQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZSAKLQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGgvMyk7Ci0JCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAtIGNvbHVtbjEuZ2V0V2lkdGgoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkJCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFkYTkwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkcmFnIHRleHQgYmV0d2VlbiB0d28gbGFiZWxzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwxLnNldFRleHQgKCJURVhUIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUik7Ci0Jc2V0RHJhZ0Ryb3AgKGxhYmVsMSk7Ci0Jc2V0RHJhZ0Ryb3AgKGxhYmVsMik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREcmFnRHJvcCAoZmluYWwgTGFiZWwgbGFiZWwpIHsKLQkKLQlUcmFuc2ZlcltdIHR5cGVzID0gbmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfTsKLQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkKLQlmaW5hbCBEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlIChsYWJlbCwgb3BlcmF0aW9ucyk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKHR5cGVzKTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyIChuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZXZlbnQuZG9pdCA9IChsYWJlbC5nZXRUZXh0ICgpLmxlbmd0aCAoKSAhPSAwKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YSAoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kYXRhID0gbGFiZWwuZ2V0VGV4dCAoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpCi0JCQkJbGFiZWwuc2V0VGV4dCAoIiIpOwotCQl9Ci0JfSk7Ci0KLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGxhYmVsLCBvcGVyYXRpb25zKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIodHlwZXMpOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIgKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhID09IG51bGwpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWxhYmVsLnNldFRleHQgKChTdHJpbmcpIGV2ZW50LmRhdGEpOwotCQl9Ci0JfSk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDVkMzVmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGVmaW5lIG15IG93biBkYXRhIHRyYW5zZmVyIHR5cGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzkgewotCi0vKiBUaGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBpcyBhbiA8Ym9sZD5hcnJheSBvZiB0eXBlIE15VHlwZTwvYm9sZD4gd2hlcmUgTXlUeXBlIGlzIGRlZmluZSBhczogKi8KLXN0YXRpYyBjbGFzcyBNeVR5cGUgewotCVN0cmluZyBmaWxlTmFtZTsKLQlsb25nIGZpbGVMZW5ndGg7Ci0JbG9uZyBsYXN0TW9kaWZpZWQ7Ci19Ci0KLXN0YXRpYyBjbGFzcyBNeVRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZVFlQRU5BTUUgPSAibmFtZV9mb3JfbXlfdHlwZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1ZVFlQRUlEID0gcmVnaXN0ZXJUeXBlIChNWVRZUEVOQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBNeVRyYW5zZmVyIF9pbnN0YW5jZSA9IG5ldyBNeVRyYW5zZmVyICgpOwotCi1wdWJsaWMgc3RhdGljIE15VHJhbnNmZXIgZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci0KLXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZSAoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCWlmICghY2hlY2tNeVR5cGUob2JqZWN0KSB8fCAhaXNTdXBwb3J0ZWRUeXBlICh0cmFuc2ZlckRhdGEpKSB7Ci0JCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQl9Ci0JTXlUeXBlIFtdIG15VHlwZXMgPSAoTXlUeXBlIFtdKSBvYmplY3Q7Ci0JdHJ5IHsKLQkJLy8gd3JpdGUgZGF0YSB0byBhIGJ5dGUgYXJyYXkgYW5kIHRoZW4gYXNrIHN1cGVyIHRvIGNvbnZlcnQgdG8gcE1lZGl1bQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSAoKTsKLQkJRGF0YU91dHB1dFN0cmVhbSB3cml0ZU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtIChvdXQpOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbXlUeXBlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJYnl0ZSBbXSBidWZmZXIgPSBteVR5cGVzIFtpXS5maWxlTmFtZS5nZXRCeXRlcyAoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50IChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlIChidWZmZXIpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nIChteVR5cGVzIFtpXS5maWxlTGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyAobXlUeXBlcyBbaV0ubGFzdE1vZGlmaWVkKTsKLQkJfQotCQlieXRlIFtdIGJ1ZmZlciA9IG91dC50b0J5dGVBcnJheSAoKTsKLQkJd3JpdGVPdXQuY2xvc2UgKCk7Ci0JCXN1cGVyLmphdmFUb05hdGl2ZSAoYnVmZmVyLCB0cmFuc2ZlckRhdGEpOwotCX0KLQljYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLX0KLQotcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEgKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQlpZiAoaXNTdXBwb3J0ZWRUeXBlICh0cmFuc2ZlckRhdGEpKSB7Ci0JCWJ5dGUgW10gYnVmZmVyID0gKGJ5dGUgW10pIHN1cGVyLm5hdGl2ZVRvSmF2YSAodHJhbnNmZXJEYXRhKTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotCQlNeVR5cGUgW10gbXlEYXRhID0gbmV3IE15VHlwZSBbMF07Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSAoYnVmZmVyKTsKLQkJCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtIChpbik7Ci0JCQl3aGlsZSAocmVhZEluLmF2YWlsYWJsZSAoKSA+IDIwKSB7Ci0JCQkJTXlUeXBlIGRhdHVtID0gbmV3IE15VHlwZSAoKTsKLQkJCQlpbnQgc2l6ZSA9IHJlYWRJbi5yZWFkSW50ICgpOwotCQkJCWJ5dGUgW10gbmFtZSA9IG5ldyBieXRlIFtzaXplXTsKLQkJCQlyZWFkSW4ucmVhZCAobmFtZSk7Ci0JCQkJZGF0dW0uZmlsZU5hbWUgPSBuZXcgU3RyaW5nIChuYW1lKTsKLQkJCQlkYXR1bS5maWxlTGVuZ3RoID0gcmVhZEluLnJlYWRMb25nICgpOwotCQkJCWRhdHVtLmxhc3RNb2RpZmllZCA9IHJlYWRJbi5yZWFkTG9uZyAoKTsKLQkJCQlNeVR5cGUgW10gbmV3TXlEYXRhID0gbmV3IE15VHlwZSBbbXlEYXRhLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkgKG15RGF0YSwgMCwgbmV3TXlEYXRhLCAwLCBteURhdGEubGVuZ3RoKTsKLQkJCQluZXdNeURhdGEgW215RGF0YS5sZW5ndGhdID0gZGF0dW07Ci0JCQkJbXlEYXRhID0gbmV3TXlEYXRhOwotCQkJfQotCQkJcmVhZEluLmNsb3NlICgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG15RGF0YTsKLQl9Ci0KLQlyZXR1cm4gbnVsbDsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBbXSBnZXRUeXBlTmFtZXMgKCkgewotCXJldHVybiBuZXcgU3RyaW5nIFtdIHtNWVRZUEVOQU1FfTsKLX0KLQotcHJvdGVjdGVkIGludCBbXSBnZXRUeXBlSWRzICgpIHsKLQlyZXR1cm4gbmV3IGludCBbXSB7TVlUWVBFSUR9OwotfQotCi1ib29sZWFuIGNoZWNrTXlUeXBlKE9iamVjdCBvYmplY3QpIHsKLQlpZiAob2JqZWN0ID09IG51bGwgfHwgCi0JCSEob2JqZWN0IGluc3RhbmNlb2YgTXlUeXBlW10pIHx8IAotCQkoKE15VHlwZVtdKW9iamVjdCkubGVuZ3RoID09IDApIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlNeVR5cGVbXSBteVR5cGVzID0gKE15VHlwZVtdKW9iamVjdDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG15VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG15VHlwZXNbaV0gPT0gbnVsbCB8fCAKLQkJCW15VHlwZXNbaV0uZmlsZU5hbWUgPT0gbnVsbCB8fCAKLQkJCW15VHlwZXNbaV0uZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JcmV0dXJuIGNoZWNrTXlUeXBlKG9iamVjdCk7Ci19Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMS5zZXRUZXh0ICgiRHJhZyBTb3VyY2UgZm9yIE15RGF0YVtdIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQlsYWJlbDIuc2V0VGV4dCAoIkRyb3AgVGFyZ2V0IGZvciBNeURhdGFbXSIpOwotCi0JRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSAobGFiZWwxLCBETkQuRFJPUF9DT1BZKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIgKG5ldyBUcmFuc2ZlciBbXSB7TXlUcmFuc2Zlci5nZXRJbnN0YW5jZSAoKX0pOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIgKG5ldyBEcmFnU291cmNlQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhIChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCU15VHlwZSBteVR5cGUxID0gbmV3IE15VHlwZSAoKTsKLQkJCW15VHlwZTEuZmlsZU5hbWUgPSAiQzpcXGFiYy50eHQiOwotCQkJbXlUeXBlMS5maWxlTGVuZ3RoID0gMTAwMDsKLQkJCW15VHlwZTEubGFzdE1vZGlmaWVkID0gMTIzMTIzMTM7Ci0JCQlNeVR5cGUgbXlUeXBlMiA9IG5ldyBNeVR5cGUgKCk7Ci0JCQlteVR5cGUyLmZpbGVOYW1lID0gIkM6XFx4eXoudHh0IjsKLQkJCW15VHlwZTIuZmlsZUxlbmd0aCA9IDUwMDsKLQkJCW15VHlwZTIubGFzdE1vZGlmaWVkID0gMTIzMTIzMjM7Ci0JCQlldmVudC5kYXRhID0gbmV3IE15VHlwZSBbXSB7bXlUeXBlMSwgbXlUeXBlMn07Ci0JCX0KLQl9KTsKLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0IChsYWJlbDIsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9ERUZBVUxUKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIgKG5ldyBUcmFuc2ZlciBbXSB7TXlUcmFuc2Zlci5nZXRJbnN0YW5jZSAoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIgKG5ldyBEcm9wVGFyZ2V0QWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlciAoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQgKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyb3AgKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCkgewotCQkJCU15VHlwZSBbXSBteVR5cGVzID0gKE15VHlwZSBbXSkgZXZlbnQuZGF0YTsKLQkJCQlpZiAobXlUeXBlcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBteVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlzdHJpbmcgKz0gbXlUeXBlcyBbaV0uZmlsZU5hbWUgKyAiICI7Ci0JCQkJCX0KLQkJCQkJbGFiZWwyLnNldFRleHQgKHN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTEyYjc5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmVlIChsYXp5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0ICgiTGF6eSBUcmVlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlGaWxlIFtdIHJvb3RzID0gRmlsZS5saXN0Um9vdHMgKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCVRyZWVJdGVtIHJvb3QgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQlyb290LnNldFRleHQgKHJvb3RzIFtpXS50b1N0cmluZyAoKSk7Ci0JCXJvb3Quc2V0RGF0YSAocm9vdHMgW2ldKTsKLQkJbmV3IFRyZWVJdGVtIChyb290LCAwKTsKLQl9Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULkV4cGFuZCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKGZpbmFsIEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBUcmVlSXRlbSByb290ID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJVHJlZUl0ZW0gW10gaXRlbXMgPSByb290LmdldEl0ZW1zICgpOwotCQkJZm9yIChpbnQgaT0gMDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpdGVtcyBbaV0uZ2V0RGF0YSAoKSAhPSBudWxsKSByZXR1cm47Ci0JCQkJaXRlbXMgW2ldLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSkgcm9vdC5nZXREYXRhICgpOwotCQkJRmlsZSBbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzICgpOwotCQkJaWYgKGZpbGVzID09IG51bGwpIHJldHVybjsKLQkJCWZvciAoaW50IGk9IDA7IGk8ZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtIChyb290LCAwKTsKLQkJCQlpdGVtLnNldFRleHQgKGZpbGVzIFtpXS5nZXROYW1lICgpKTsKLQkJCQlpdGVtLnNldERhdGEgKGZpbGVzIFtpXSk7Ci0JCQkJaWYgKGZpbGVzIFtpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCW5ldyBUcmVlSXRlbSAoaXRlbSwgMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0JUG9pbnQgc2l6ZSA9IHRyZWUuY29tcHV0ZVNpemUgKDMwMCwgU1dULkRFRkFVTFQpOwotCWludCB3aWR0aCA9IE1hdGgubWF4ICgzMDAsIHNpemUueCk7Ci0JaW50IGhlaWdodCA9IE1hdGgubWF4ICgzMDAsIHNpemUueSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoc2hlbGwuY29tcHV0ZVNpemUgKHdpZHRoLCBoZWlnaHQpKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA1NTgyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBsaW1pdCBzZWxlY3Rpb24gdG8gaXRlbXMgdGhhdCBtYXRjaCBhIHBhdHRlcm4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDgwIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiaXRlbSAiICsgaSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7Ci0JCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiICsgaik7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDI7IGsrKykgewotCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiICsgayk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JdHJlZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJVHJlZUl0ZW1bXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJVHJlZUl0ZW1bXSByZXZpc2VkU2VsZWN0aW9uID0gbmV3IFRyZWVJdGVtWzBdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdGV4dCA9IHNlbGVjdGlvbltpXS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRleHQuaW5kZXhPZigiMSIpID4gMCkgewotCQkJCQlUcmVlSXRlbVtdIG5ld1NlbGVjdGlvbiA9IG5ldyBUcmVlSXRlbVtyZXZpc2VkU2VsZWN0aW9uLmxlbmd0aCArIDFdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJldmlzZWRTZWxlY3Rpb24sIDAsIG5ld1NlbGVjdGlvbiwgMCwgcmV2aXNlZFNlbGVjdGlvbi5sZW5ndGgpOwotCQkJCQluZXdTZWxlY3Rpb25bcmV2aXNlZFNlbGVjdGlvbi5sZW5ndGhdID0gc2VsZWN0aW9uW2ldOwotCQkJCQlyZXZpc2VkU2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCQkJCX0KLQkJCX0KLQkJCXRyZWUuc2V0U2VsZWN0aW9uKHJldmlzZWRTZWxlY3Rpb24pOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTdlZGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBPTEUgYW5kIEFjdGl2ZVggZXhhbXBsZSBzbmlwcGV0OiBicm93c2UgdGhlIHR5cGVsaWJpbmZvIGZvciBhIHByb2dyYW0gaWQgKHdpbjMyIG9ubHkpCi0gKiBOT1RFOiBUaGlzIHNuaXBwZXQgdXNlcyBpbnRlcm5hbCBTV1QgcGFja2FnZXMgdGhhdCBhcmUKLSAqIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODEgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQotCWlmIChhcmdzLmxlbmd0aCA9PSAwKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGphdmEgTWFpbiA8cHJvZ3JhbSBpZD4iKTsKLQkJcmV0dXJuOwotCX0KLQotCVN0cmluZyBwcm9nSUQgPSBhcmdzWzBdOwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0KLQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCU9sZUNvbnRyb2xTaXRlIHNpdGUgPSBudWxsOwotCU9sZUF1dG9tYXRpb24gYXV0byA9IG51bGw7Ci0JdHJ5IHsKLQkJc2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShmcmFtZSwgU1dULk5PTkUsIHByb2dJRCk7CQotCQlhdXRvID0gbmV3IE9sZUF1dG9tYXRpb24oc2l0ZSk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gdHlwZSBsaWJyYXJ5IGZvciAiK3Byb2dJRCk7Ci0JCXJldHVybjsKLQl9Ci0JCQotCXByaW50VHlwZUluZm8oYXV0byk7Ci0JCi0JYXV0by5kaXNwb3NlKCk7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCi19Ci0KLXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRUeXBlSW5mbyhPbGVBdXRvbWF0aW9uIGF1dG8pIHsKLQlUWVBFQVRUUiB0eXBlYXR0ciA9IGF1dG8uZ2V0VHlwZUluZm9BdHRyaWJ1dGVzKCk7Ci0JaWYgKHR5cGVhdHRyICE9IG51bGwpIHsJCQotCQlpZiAodHlwZWF0dHIuY0Z1bmNzID4gMCkgU3lzdGVtLm91dC5wcmludGxuKCJGdW5jdGlvbnMgOlxuIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWF0dHIuY0Z1bmNzOyBpKyspIHsJCQkKLQkJCU9sZUZ1bmN0aW9uRGVzY3JpcHRpb24gZGF0YSA9IGF1dG8uZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbihpKTsKLQkJCVN0cmluZyBhcmdMaXN0ID0gIiI7Ci0JCQlpbnQgZmlyc3RPcHRpb25hbEFyZ0luZGV4ID0gZGF0YS5hcmdzLmxlbmd0aCAtIGRhdGEub3B0aW9uYWxBcmdDb3VudDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5hcmdzLmxlbmd0aDsgaisrKSB7Ci0JCQkJYXJnTGlzdCArPSAiWyI7Ci0JCQkJaWYgKGogPj0gZmlyc3RPcHRpb25hbEFyZ0luZGV4KSBhcmdMaXN0ICs9ICJvcHRpb25hbCwgIjsKLQkJCQlhcmdMaXN0ICs9IGdldERpcmVjdGlvbihkYXRhLmFyZ3Nbal0uZmxhZ3MpKyJdICIrZ2V0VHlwZU5hbWUoZGF0YS5hcmdzW2pdLnR5cGUpKyIgIitkYXRhLmFyZ3Nbal0ubmFtZTsKLQkJCQlpZiAoIGogPCBkYXRhLmFyZ3MubGVuZ3RoIC0gMSkgYXJnTGlzdCArPSAiLCAiOwotCQkJfQkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldEludm9rZUtpbmQoZGF0YS5pbnZva2VLaW5kKSsiIChpZCA9ICIrZGF0YS5pZCsiKSA6ICIKLQkJCQkJICAgICAgICArIlxuXHRTaWduYXR1cmUgICA6ICIrZ2V0VHlwZU5hbWUoZGF0YS5yZXR1cm5UeXBlKSsiICIrZGF0YS5uYW1lKyIoIithcmdMaXN0KyIpIgotCQkJICAgICAgICAgICAgICAgICAgICArIlxuXHREZXNjcmlwdGlvbiA6ICIrZGF0YS5kb2N1bWVudGF0aW9uCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdEhlbHAgRmlsZSAgIDogIitkYXRhLmhlbHBGaWxlKyJcbiIpOwotCQl9Ci0JCQotCQlpZiAodHlwZWF0dHIuY1ZhcnMgPiAwKSBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5WYXJpYWJsZXMgIDpcbiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVhdHRyLmNWYXJzOyBpKyspIHsKLQkJCU9sZVByb3BlcnR5RGVzY3JpcHRpb24gZGF0YSA9IGF1dG8uZ2V0UHJvcGVydHlEZXNjcmlwdGlvbihpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUFJPUEVSVFkgKGlkID0gIitkYXRhLmlkKyIpIDoiCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdE5hbWUgOiAiK2RhdGEubmFtZQotCQkJICAgICAgICAgICAgICAgICAgICArIlxuXHRUeXBlIDogIitnZXRUeXBlTmFtZShkYXRhLnR5cGUpKyJcbiIpOwotCQl9Ci0JfQotfQotcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKGludCB0eXBlKSB7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgT0xFLlZUX0JPT0wgOiByZXR1cm4gImJvb2xlYW4iOwotCQljYXNlIE9MRS5WVF9SNCA6IHJldHVybiAiZmxvYXQiOwotCQljYXNlIE9MRS5WVF9SOCA6IHJldHVybiAiZG91YmxlIjsKLQkJY2FzZSBPTEUuVlRfSTQgOiByZXR1cm4gImludCI7Ci0JCWNhc2UgT0xFLlZUX0RJU1BBVENIIDogcmV0dXJuICJJRGlzcGF0Y2giOwotCQljYXNlIE9MRS5WVF9VTktOT1dOIDogcmV0dXJuICJJVW5rbm93biI7Ci0JCWNhc2UgT0xFLlZUX0kyIDogcmV0dXJuICJzaG9ydCI7Ci0JCWNhc2UgT0xFLlZUX0JTVFIgOiByZXR1cm4gIlN0cmluZyI7Ci0JCWNhc2UgT0xFLlZUX1ZBUklBTlQgOiByZXR1cm4gIlZhcmlhbnQiOwotCQljYXNlIE9MRS5WVF9DWSA6IHJldHVybiAiQ3VycmVuY3kiOwotCQljYXNlIE9MRS5WVF9EQVRFIDogcmV0dXJuICJEYXRlIjsKLQkJY2FzZSBPTEUuVlRfVUkxIDogcmV0dXJuICJ1bnNpZ25lZCBjaGFyIjsKLQkJY2FzZSBPTEUuVlRfVUk0IDogcmV0dXJuICJ1bnNpZ25lZCBpbnQiOwotCQljYXNlIE9MRS5WVF9VU0VSREVGSU5FRCA6IHJldHVybiAiVXNlckRlZmluZWQiOwotCQljYXNlIE9MRS5WVF9IUkVTVUxUIDogcmV0dXJuICJpbnQiOwotCQljYXNlIE9MRS5WVF9WT0lEIDogcmV0dXJuICJ2b2lkIjsKLQkJCi0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0JPT0wgOiByZXR1cm4gImJvb2xlYW4gKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1I0IDogcmV0dXJuICJmbG9hdCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfUjggOiByZXR1cm4gImRvdWJsZSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfSTQgOiByZXR1cm4gImludCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfRElTUEFUQ0ggOiByZXR1cm4gIklEaXNwYXRjaCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVU5LTk9XTiA6IHJldHVybiAiSVVua25vd24gKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0kyIDogcmV0dXJuICJzaG9ydCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfQlNUUiA6IHJldHVybiAiU3RyaW5nICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9WQVJJQU5UIDogcmV0dXJuICJWYXJpYW50ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9DWSA6IHJldHVybiAiQ3VycmVuY3kgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0RBVEUgOiByZXR1cm4gIkRhdGUgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1VJMSA6IHJldHVybiAidW5zaWduZWQgY2hhciAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVUk0IDogcmV0dXJuICJ1bnNpZ25lZCBpbnQgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1VTRVJERUZJTkVEIDogcmV0dXJuICJVc2VyRGVmaW5lZCAqIjsKLQl9Ci0JcmV0dXJuICJ1bmtub3duICIrIHR5cGU7CQotfQotcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERpcmVjdGlvbihpbnQgZGlyZWN0aW9uKXsKLQlTdHJpbmcgZGlyU3RyaW5nID0gIiI7Ci0JYm9vbGVhbiBjb21tYSA9IGZhbHNlOwotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRklOKSAhPSAwKSB7Ci0JCWRpclN0cmluZyArPSAiaW4iOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRk9VVCkgIT0gMCl7Ci0JCWlmIChjb21tYSkgZGlyU3RyaW5nICs9ICIsICI7Ci0JCWRpclN0cmluZyArPSAib3V0IjsKLQkJY29tbWEgPSB0cnVlOwotCX0KLQlpZiAoKGRpcmVjdGlvbiAmIE9MRS5JRExGTEFHX0ZMQ0lEKSAhPSAwKXsKLQkJaWYgKGNvbW1hKSBkaXJTdHJpbmcgKz0gIiwgIjsKLQkJZGlyU3RyaW5nICs9ICJsY2lkIjsKLQkJY29tbWEgPSB0cnVlOwotCX0KLQlpZiAoKGRpcmVjdGlvbiAmIE9MRS5JRExGTEFHX0ZSRVRWQUwpICE9IDApewotCQlpZiAoY29tbWEpIGRpclN0cmluZyArPSAiLCAiOyAKLQkJZGlyU3RyaW5nICs9ICJyZXR2YWwiOwotCX0KLQkKLQlyZXR1cm4gZGlyU3RyaW5nOwotfQotcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEludm9rZUtpbmQoaW50IGludktpbmQpIHsKLQlzd2l0Y2ggKGludktpbmQpIHsKLQkJY2FzZSBPTEUuSU5WT0tFX0ZVTkMgOiByZXR1cm4gIk1FVEhPRCI7Ci0JCWNhc2UgT0xFLklOVk9LRV9QUk9QRVJUWUdFVCA6IHJldHVybiAiUFJPUEVSVFkgR0VUIjsKLQkJY2FzZSBPTEUuSU5WT0tFX1BST1BFUlRZUFVUIDogcmV0dXJuICJQUk9QRVJUWSBQVVQiOwotCQljYXNlIE9MRS5JTlZPS0VfUFJPUEVSVFlQVVRSRUYgOiByZXR1cm4gIlBST1BFUlRZIFBVVCBCWSBSRUYiOwotCX0KLQlyZXR1cm4gInVua25vd24gIitpbnZLaW5kOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkNzIzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ1RhYkZvbGRlciBleGFtcGxlIHNuaXBwZXQ6IHByZXZlbnQgYW4gaXRlbSBmcm9tIGNsb3NpbmcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODIgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUNUYWJGb2xkZXIgZm9sZGVyID0gbmV3IENUYWJGb2xkZXIoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuQ0xPU0UpOwotCQlpdGVtLnNldFRleHQoIkl0ZW0gIitpKTsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkpOwotCQl0ZXh0LnNldFRleHQoIkNvbnRlbnQgZm9yIEl0ZW0gIitpKTsKLQkJaXRlbS5zZXRDb250cm9sKHRleHQpOwotCX0KLQkKLQlmaW5hbCBDVGFiSXRlbSBzcGVjaWFsSXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0Jc3BlY2lhbEl0ZW0uc2V0VGV4dCgiRG9uJ3QgQ2xvc2UgTWUiKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChmb2xkZXIsIFNXVC5NVUxUSSk7Ci0JdGV4dC5zZXRUZXh0KCJUaGlzIHRhYiBjYW4gbmV2ZXIgYmUgY2xvc2VkIik7Ci0Jc3BlY2lhbEl0ZW0uc2V0Q29udHJvbCh0ZXh0KTsKLQkJCi0JZm9sZGVyLmFkZENUYWJGb2xkZXIyTGlzdGVuZXIobmV3IENUYWJGb2xkZXIyQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY2xvc2UoQ1RhYkZvbGRlckV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuaXRlbS5lcXVhbHMoc3BlY2lhbEl0ZW0pKSB7Ci0JCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JZmluYWwgQ1RhYkl0ZW0gbm9DbG9zZUl0ZW0gPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0Jbm9DbG9zZUl0ZW0uc2V0VGV4dCgiTm8gQ2xvc2UgQnV0dG9uIik7Ci0JVGV4dCB0ZXh0MiA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJKTsKLQl0ZXh0Mi5zZXRUZXh0KCJUaGlzIHRhYiBkb2VzIG5vdCBoYXZlIGEgY2xvc2UgYnV0dG9uIik7Ci0Jbm9DbG9zZUl0ZW0uc2V0Q29udHJvbCh0ZXh0Mik7Ci0JCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmOGZjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZXRlcm1pbmUgZGF0YSB0eXBlcyBhdmFpbGFibGUgKHdpbjMyIG9ubHkpCi0gKiBOT1RFOiBUaGlzIHNuaXBwZXQgdXNlcyBpbnRlcm5hbCBTV1QgcGFja2FnZXMgdGhhdCBhcmUKLSAqIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDgzIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi1wcml2YXRlIHN0YXRpYyBTbmlwcGV0ODMgX2luc3RhbmNlID0gbmV3IFNuaXBwZXQ4MygpOwotcHJpdmF0ZSBpbnRbXSBpZHM7Ci1wcml2YXRlIFN0cmluZ1tdIG5hbWVzOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIGNvbnRyb2wgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dCgiRHJhZyBkYXRhIG92ZXIgdGhpcyBzaXRlIHRvIHNlZSB0aGUgbmF0aXZlIHRyYW5zZmVyIHR5cGUuIik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldChjb250cm9sLCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTksgfCBETkQuRFJPUF9NT1ZFKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1NuaXBwZXQ4My5nZXRJbnN0YW5jZSgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsJCQkKLQkJCVN0cmluZyBvcHMgPSAiIjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0NPUFkpICE9IDApIG9wcyArPSAiQ29weTsiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTU9WRSkgIT0gMCkgb3BzICs9ICJNb3ZlOyI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9MSU5LKSAhPSAwKSBvcHMgKz0gIkxpbms7IjsKLQkJCWNvbnRyb2wucmVtb3ZlQWxsKCk7Ci0JCQlUYWJsZUl0ZW0gaXRlbTEgPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsU1dULk5PTkUpOwotCQkJaXRlbTEuc2V0VGV4dCgiQWxsb3dlZCBPcGVyYXRpb25zIGFyZSAiK29wcyk7Ci0JCQkKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0NPUFkpICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQl9IGVsc2UgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfTElOSykgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9MSU5LOwotCQkJCX0gZWxzZSBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX01PVkU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlUcmFuc2ZlckRhdGFbXSBkYXRhID0gZXZlbnQuZGF0YVR5cGVzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW50IGlkID0gZGF0YVtpXS50eXBlOwotCQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZUZyb21JZChpZCk7Ci0JCQkJVGFibGVJdGVtIGl0ZW0yID0gbmV3IFRhYmxlSXRlbShjb250cm9sLFNXVC5OT05FKTsKLQkJCQlpdGVtMi5zZXRUZXh0KCJEYXRhIHR5cGUgaXMgIitpZCsiICIrbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHN0YXRpYyBTbmlwcGV0ODMgZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci1TbmlwcGV0ODMoKSB7Ci0JaWRzID0gbmV3IGludFs4MDAwMF07Ci0JbmFtZXMgPSBuZXcgU3RyaW5nWzgwMDAwXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQlpZHNbaV0gPSBpOwotCQluYW1lc1tpXSA9IGdldE5hbWVGcm9tSWQoaSk7Ci0JfQotfQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsKLQlyZXR1cm4gIkhlbGxvIFdvcmxkIjsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmFtZXM7Ci19Ci1wcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpewotCXJldHVybiBpZHM7Ci19Ci1zdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tSWQoaW50IGlkKSB7Ci0JU3RyaW5nIG5hbWUgPSBudWxsOwotCWludCBtYXhTaXplID0gMTI4OwotCVRDSEFSIGJ1ZmZlciA9IG5ldyBUQ0hBUigwLCBtYXhTaXplKTsKLQlpbnQgc2l6ZSA9IENPTS5HZXRDbGlwYm9hcmRGb3JtYXROYW1lKGlkLCBidWZmZXIsIG1heFNpemUpOwotCWlmIChzaXplICE9IDApIHsKLQkJbmFtZSA9IGJ1ZmZlci50b1N0cmluZygwLCBzaXplKTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIENPTS5DRl9IRFJPUDoKLQkJCQluYW1lID0gIkNGX0hEUk9QIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1RFWFQ6Ci0JCQkJbmFtZSA9ICJDRl9URVhUIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX0JJVE1BUDoKLQkJCQluYW1lID0gIkNGX0JJVE1BUCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9NRVRBRklMRVBJQ1Q6Ci0JCQkJbmFtZSA9ICJDRl9NRVRBRklMRVBJQ1QiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfU1lMSzoKLQkJCQluYW1lID0gIkNGX1NZTEsiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRElGOgotCQkJCW5hbWUgPSAiQ0ZfRElGIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1RJRkY6Ci0JCQkJbmFtZSA9ICJDRl9USUZGIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX09FTVRFWFQ6Ci0JCQkJbmFtZSA9ICJDRl9PRU1URVhUIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX0RJQjoKLQkJCQluYW1lID0gIkNGX0RJQiI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9QQUxFVFRFOgotCQkJCW5hbWUgPSAiQ0ZfUEFMRVRURSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9QRU5EQVRBOgotCQkJCW5hbWUgPSAiQ0ZfUEVOREFUQSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9SSUZGOgotCQkJCW5hbWUgPSAiQ0ZfUklGRiI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9XQVZFOgotCQkJCW5hbWUgPSAiQ0ZfV0FWRSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9VTklDT0RFVEVYVDoKLQkJCQluYW1lID0gIkNGX1VOSUNPREVURVhUIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX0VOSE1FVEFGSUxFOgotCQkJCW5hbWUgPSAiQ0ZfRU5ITUVUQUZJTEUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfTE9DQUxFOgotCQkJCW5hbWUgPSAiQ0ZfTE9DQUxFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX01BWDoKLQkJCQluYW1lID0gIkNGX01BWCI7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JfQotCXJldHVybiBuYW1lOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmZjExMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRlZmluZSBhIGRlZmF1bHQgb3BlcmF0aW9uIChpbiB0aGlzIGV4YW1wbGUsIENvcHkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldFRleHQoIkRyYWcgU291cmNlIik7Ci0JRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShsYWJlbCwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGF0YSA9ICJUZXh0IFRyYW5zZmVycmVkIjsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZG9pdCkgewotCQkJCVN0cmluZyBvcGVyYXRpb24gPSBudWxsOwotCQkJCXN3aXRjaCAoZXZlbnQuZGV0YWlsKSB7Ci0JCQkJY2FzZSBETkQuRFJPUF9NT1ZFOgotCQkJCQlvcGVyYXRpb24gPSAibW92ZWQiOyBicmVhazsKLQkJCQljYXNlIERORC5EUk9QX0NPUFk6Ci0JCQkJCW9wZXJhdGlvbiA9ICJjb3BpZWQiOyBicmVhazsKLQkJCQljYXNlIERORC5EUk9QX0xJTks6Ci0JCQkJCW9wZXJhdGlvbiA9ICJsaW5rZWQiOyBicmVhazsKLQkJCQljYXNlIERORC5EUk9QX05PTkU6Ci0JCQkJCW9wZXJhdGlvbiA9ICJkaXNhbGxvd2VkIjsgYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJb3BlcmF0aW9uID0gInVua25vd24iOyBicmVhazsKLQkJCQl9Ci0JCQkJbGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2UgKGRhdGEgIitvcGVyYXRpb24rIikiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2UgKGRyYWcgY2FuY2VsbGVkKSIpOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGV4dC5zZXRUZXh0KCJEcm9wIFRhcmdldCIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGV4dCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBvcGVyYXRpb24gPSBudWxsOwotCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCWNhc2UgRE5ELkRST1BfTU9WRToKLQkJCQlvcGVyYXRpb24gPSAibW92ZWQiOyBicmVhazsKLQkJCWNhc2UgRE5ELkRST1BfQ09QWToKLQkJCQlvcGVyYXRpb24gPSAiY29waWVkIjsgYnJlYWs7Ci0JCQljYXNlIERORC5EUk9QX0xJTks6Ci0JCQkJb3BlcmF0aW9uID0gImxpbmtlZCI7IGJyZWFrOwotCQkJY2FzZSBETkQuRFJPUF9OT05FOgotCQkJCW9wZXJhdGlvbiA9ICJkaXNhbGxvd2VkIjsgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCW9wZXJhdGlvbiA9ICJ1bmtub3duIjsgYnJlYWs7Ci0JCQl9Ci0JCQl0ZXh0LmFwcGVuZCgiXG4iK29wZXJhdGlvbisoU3RyaW5nKWV2ZW50LmRhdGEpOwotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNkMDhkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFBvY2tldFBDIGV4YW1wbGUgc25pcHBldDogSGVsbG8gV29ybGQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCi0JLyogCi0JICogQ3JlYXRlIGEgU2hlbGwgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZQotCSAqIGkuZS4gZnVsbCBzY3JlZW4sIG5vIGRlY29yYXRpb24gb24gUG9ja2V0UEMuCi0JICovCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0KLQkvKiAKLQkgKiBTZXQgYSB0ZXh0IHNvIHRoYXQgdGhlIHRvcCBsZXZlbCBTaGVsbAotCSAqIGFsc28gYXBwZWFycyBpbiB0aGUgUG9ja2V0UEMgdGFzayBsaXN0Ci0JICovCi0Jc2hlbGwuc2V0VGV4dCgiTWFpbiIpOwotCi0JLyoKLQkgKiBTZXQgYSBtZW51YmFyIHRvIGZvbGxvdyBVSSBndWlkZWxpbmVzCi0JICogb24gUG9ja2V0UEMKLQkgKi8KLQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjk5MjQ5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFBvY2tldFBDIFNoZWxsIGV4YW1wbGUgc25pcHBldDogJ09rJyBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5DTE9TRSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiIpOwotCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtYik7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDAwNjg2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBQb2NrZXRQQyBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IHJlc2l6ZSBhdXRvbWF0aWNhbGx5IGFzIFNJUCBpcyBvbiBvciBvZmYKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuUkVTSVpFKTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0JTWVudSBtYiA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQkvKiBBZGQgYSBidXR0b24gdG8gbWFrZSB0aGUgcmVzaXplIG1vcmUgdmlzdWFsICovCi0JRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIk1haW4iKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzYwZGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGVFZGl0b3IgZXhhbXBsZSBzbmlwcGV0OiBlZGl0IHRoZSB0ZXh0IG9mIGEgdGFibGUgaXRlbSAoaW4gcGxhY2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODggewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSElERV9TRUxFQ1RJT04pOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaXRlbSAiICsgaSwgImVkaXQgdGhpcyB2YWx1ZSJ9KTsKLQl9Ci0JY29sdW1uMS5wYWNrKCk7Ci0JY29sdW1uMi5wYWNrKCk7Ci0JCi0JZmluYWwgVGFibGVFZGl0b3IgZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yKHRhYmxlKTsKLQkvL1RoZSBlZGl0b3IgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGNlbGwgYW5kIG11c3QKLQkvL25vdCBiZSBhbnkgc21hbGxlciB0aGFuIDUwIHBpeGVscy4KLQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JZWRpdG9yLm1pbmltdW1XaWR0aCA9IDUwOwotCS8vIGVkaXRpbmcgdGhlIHNlY29uZCBjb2x1bW4KLQlmaW5hbCBpbnQgRURJVEFCTEVDT0xVTU4gPSAxOwotCQotCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBDbGVhbiB1cCBhbnkgcHJldmlvdXMgZWRpdG9yIGNvbnRyb2wKLQkJCUNvbnRyb2wgb2xkRWRpdG9yID0gZWRpdG9yLmdldEVkaXRvcigpOwotCQkJaWYgKG9sZEVkaXRvciAhPSBudWxsKSBvbGRFZGl0b3IuZGlzcG9zZSgpOwotCQotCQkJLy8gSWRlbnRpZnkgdGhlIHNlbGVjdGVkIHJvdwotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWUuaXRlbTsKLQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkKLQkJCS8vIFRoZSBjb250cm9sIHRoYXQgd2lsbCBiZSB0aGUgZWRpdG9yIG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgVGFibGUKLQkJCVRleHQgbmV3RWRpdG9yID0gbmV3IFRleHQodGFibGUsIFNXVC5OT05FKTsKLQkJCW5ld0VkaXRvci5zZXRUZXh0KGl0ZW0uZ2V0VGV4dChFRElUQUJMRUNPTFVNTikpOwotCQkJbmV3RWRpdG9yLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IG1lKSB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KWVkaXRvci5nZXRFZGl0b3IoKTsKLQkJCQkJZWRpdG9yLmdldEl0ZW0oKS5zZXRUZXh0KEVESVRBQkxFQ09MVU1OLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQluZXdFZGl0b3Iuc2VsZWN0QWxsKCk7Ci0JCQluZXdFZGl0b3Iuc2V0Rm9jdXMoKTsKLQkJCWVkaXRvci5zZXRFZGl0b3IobmV3RWRpdG9yLCBpdGVtLCBFRElUQUJMRUNPTFVNTik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3MjViYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIG1lbnUgd2l0aCByYWRpbyBpdGVtcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4OSB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5SQURJTyk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1lbnVJdGVtIGl0ZW0gPSAoTWVudUl0ZW0pZS53aWRnZXQ7Ci0JCQkJaWYgKGl0ZW0uZ2V0U2VsZWN0aW9uICgpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoaXRlbSArICIgc2VsZWN0ZWQiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKGl0ZW0gKyAiIHVuc2VsZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQlzaGVsbC5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NWJlMmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBzY3JvbGwgYSBjaGlsZCBjb250cm9sIGF1dG9tYXRpY2FsbHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JY29tcG9zaXRlLnNldFNpemUgKDcwMCwgNjAwKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQljb21wb3NpdGUuYWRkUGFpbnRMaXN0ZW5lciAobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbCAoUGFpbnRFdmVudCBlKSB7Ci0JCQllLmdjLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JCQllLmdjLmZpbGxPdmFsICg1LCA1LCA2OTAsIDU5MCk7Ci0JCX0KLQl9KTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhciA9IHNoZWxsLmdldEhvcml6b250YWxCYXIgKCk7Ci0JaEJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gY29tcG9zaXRlLmdldExvY2F0aW9uICgpOwotCQkJbG9jYXRpb24ueCA9IC1oQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAobG9jYXRpb24pOwotCQl9Ci0JfSk7Ci0JZmluYWwgU2Nyb2xsQmFyIHZCYXIgPSBzaGVsbC5nZXRWZXJ0aWNhbEJhciAoKTsKLQl2QmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUG9pbnQgbG9jYXRpb24gPSBjb21wb3NpdGUuZ2V0TG9jYXRpb24gKCk7Ci0JCQlsb2NhdGlvbi55ID0gLXZCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJY29tcG9zaXRlLnNldExvY2F0aW9uIChsb2NhdGlvbik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlQb2ludCBzaXplID0gY29tcG9zaXRlLmdldFNpemUgKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQloQmFyLnNldE1heGltdW0gKHNpemUueCk7Ci0JCQl2QmFyLnNldE1heGltdW0gKHNpemUueSk7Ci0JCQloQmFyLnNldFRodW1iIChNYXRoLm1pbiAoc2l6ZS54LCByZWN0LndpZHRoKSk7Ci0JCQl2QmFyLnNldFRodW1iIChNYXRoLm1pbiAoc2l6ZS55LCByZWN0LmhlaWdodCkpOwotCQkJaW50IGhQYWdlID0gc2l6ZS54IC0gcmVjdC53aWR0aDsKLQkJCWludCB2UGFnZSA9IHNpemUueSAtIHJlY3QuaGVpZ2h0OwotCQkJaW50IGhTZWxlY3Rpb24gPSBoQmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWludCB2U2VsZWN0aW9uID0gdkJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGNvbXBvc2l0ZS5nZXRMb2NhdGlvbiAoKTsKLQkJCWlmIChoU2VsZWN0aW9uID49IGhQYWdlKSB7Ci0JCQkJaWYgKGhQYWdlIDw9IDApIGhTZWxlY3Rpb24gPSAwOwotCQkJCWxvY2F0aW9uLnggPSAtaFNlbGVjdGlvbjsKLQkJCX0KLQkJCWlmICh2U2VsZWN0aW9uID49IHZQYWdlKSB7Ci0JCQkJaWYgKHZQYWdlIDw9IDApIHZTZWxlY3Rpb24gPSAwOwotCQkJCWxvY2F0aW9uLnkgPSAtdlNlbGVjdGlvbjsKLQkJCX0KLQkJCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAobG9jYXRpb24pOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjEzY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBtb3VzZSBkb3duIGluIGEgdHJlZSBpdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUcmVlSXRlbSB0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQl0cmVlSXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJVHJlZUl0ZW0gaXRlbSA9IHRyZWUuZ2V0SXRlbSAocG9pbnQpOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIk1vdXNlIGRvd246ICIgKyBpdGVtKTsKLQkJCX0KLQkJfQotCX0pOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjk1MzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZHJhZyBsZWFmIGl0ZW1zIGluIGEgdHJlZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJpdGVtICIraSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCQlUcmVlSXRlbSBzdWJJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiK2krIiAiK2opOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCAzOyBrKyspIHsKLQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoIml0ZW0gIitpKyIgIitqKyIgIitrKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlUcmFuc2ZlcltdIHR5cGVzID0gbmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfTsKLQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkKLQlmaW5hbCBEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlICh0cmVlLCBvcGVyYXRpb25zKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIodHlwZXMpOwotCWZpbmFsIFRyZWVJdGVtW10gZHJhZ1NvdXJjZUl0ZW0gPSBuZXcgVHJlZUl0ZW1bMV07Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lciAobmV3IERyYWdTb3VyY2VMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCVRyZWVJdGVtW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMCAmJiBzZWxlY3Rpb25bMF0uZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJCWV2ZW50LmRvaXQgPSB0cnVlOwotCQkJCWRyYWdTb3VyY2VJdGVtWzBdID0gc2VsZWN0aW9uWzBdOwotCQkJfSBlbHNlIHsKLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhIChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRhdGEgPSBkcmFnU291cmNlSXRlbVswXS5nZXRUZXh0KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKQotCQkJCWRyYWdTb3VyY2VJdGVtWzBdLmRpc3Bvc2UoKTsKLQkJCQlkcmFnU291cmNlSXRlbVswXSA9IG51bGw7Ci0JCX0KLQl9KTsKLQotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodHJlZSwgb3BlcmF0aW9ucyk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKHR5cGVzKTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyIChuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfRVhQQU5EIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCWlmIChldmVudC5pdGVtICE9IG51bGwpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJUG9pbnQgcHQgPSBkaXNwbGF5Lm1hcChudWxsLCB0cmVlLCBldmVudC54LCBldmVudC55KTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaXRlbS5nZXRCb3VuZHMoKTsKLQkJCQlpZiAocHQueSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQkJCX0gZWxzZSBpZiAocHQueSA+IGJvdW5kcy55ICsgMipib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLQkJCQl9IGVsc2UgewotCQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfU0VMRUNUOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKWV2ZW50LmRhdGE7Ci0JCQlpZiAoZXZlbnQuaXRlbSA9PSBudWxsKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCQkJfSBlbHNlIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJUG9pbnQgcHQgPSBkaXNwbGF5Lm1hcChudWxsLCB0cmVlLCBldmVudC54LCBldmVudC55KTsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaXRlbS5nZXRCb3VuZHMoKTsKLQkJCQlUcmVlSXRlbSBwYXJlbnQgPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHBhcmVudC5nZXRJdGVtcygpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaXRlbXNbaV0gPT0gaXRlbSkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocHQueSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUsIGluZGV4KTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfSBlbHNlIGlmIChwdC55ID4gYm91bmRzLnkgKyAyKmJvdW5kcy5oZWlnaHQvMykgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShwYXJlbnQsIFNXVC5OT05FLCBpbmRleCsxKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlLmdldEl0ZW1zKCk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpdGVtc1tpXSA9PSBpdGVtKSB7Ci0JCQkJCQkJaW5kZXggPSBpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChwdC55IDwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUsIGluZGV4KTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfSBlbHNlIGlmIChwdC55ID4gYm91bmRzLnkgKyAyKmJvdW5kcy5oZWlnaHQvMykgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgaW5kZXgrMSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKGl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkKLQkJCX0KLQkJfQotCX0pOwotCi0Jc2hlbGwuc2V0U2l6ZSAoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTcxMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY3Vyc29yIGZyb20gYSBzb3VyY2UgYW5kIGEgbWFzawotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQkKLQkvL0NyZWF0ZSBhIHNvdXJjZSBJbWFnZURhdGEgb2YgZGVwdGggMSAobW9ub2Nocm9tZSkKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHt3aGl0ZS5nZXRSR0IoKSwgYmxhY2suZ2V0UkdCKCksfSk7Ci0JSW1hZ2VEYXRhIHNvdXJjZURhdGEgPSBuZXcgSW1hZ2VEYXRhICgyMCwgMjAsIDEsIHBhbGV0dGUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkgKyspIHsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAyMDsgaisrKSB7Ci0JCQlzb3VyY2VEYXRhLnNldFBpeGVsKGksIGosIDEpOwotCQl9Ci0JfQotCQotCS8vQ3JlYXRlIGEgbWFzayBJbWFnZURhdGEgb2YgZGVwdGggMSAobW9ub2Nocm9tZSkKLQlwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHt3aGl0ZS5nZXRSR0IoKSwgYmxhY2suZ2V0UkdCKCksfSk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gbmV3IEltYWdlRGF0YSAoMjAsIDIwLCAxLCBwYWxldHRlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpICsrKSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJbWFza0RhdGEuc2V0UGl4ZWwoaSwgaiwgMSk7Ci0JCX0KLQl9Ci0JLy9DcmVhdGUgY3Vyc29yCi0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgc291cmNlRGF0YSwgbWFza0RhdGEsIDEwLCAxMCk7Ci0JCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgSW1hZ2Ugc291cmNlID0gbmV3IEltYWdlIChkaXNwbGF5LHNvdXJjZURhdGEpOwotCWZpbmFsIEltYWdlIG1hc2sgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIG1hc2tEYXRhKTsKLQkvL0RyYXcgc291cmNlIGFuZCBtYXNrIGp1c3QgdG8gc2hvdyB3aGF0IHRoZXkgbG9vayBsaWtlCi0Jc2hlbGwuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJR0MgZ2MgPSBlLmdjOwotCQkJZ2MuZHJhd1N0cmluZygic291cmNlOiAiLCAxMCwgMTApOwotCQkJZ2MuZHJhd0ltYWdlKHNvdXJjZSwgMCwgMCwgMjAsIDIwLCA2MCwgMTAsIDIwLCAyMCk7Ci0JCQlnYy5kcmF3U3RyaW5nKCJtYXNrOiAiLDEwLCA0MCk7Ci0JCQlnYy5kcmF3SW1hZ2UobWFzaywgMCwgMCwgMjAsIDIwLCA2MCwgNDAsIDIwLCAyMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jc2hlbGwuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQljdXJzb3IuZGlzcG9zZSgpOwotCXNvdXJjZS5kaXNwb3NlKCk7Ci0JbWFzay5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU3MjlkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogbWVhc3VyZSBhIHN0cmluZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsIChzaGVsbCwgU1dULk5PTkUpOwotCUdDIGdjID0gbmV3IEdDIChsYWJlbCk7Ci0JUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQgKCJIZWxsbyIpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JbGFiZWwuc2V0VGV4dCAoIkhlbGxvIC0+ICIgKyBzaXplKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjZlMjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ2xpcGJvYXJkIGV4YW1wbGUgc25pcHBldDogY29weSBhbmQgcGFzdGUgZGF0YSB3aXRoIHRoZSBjbGlwYm9hcmQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBDbGlwYm9hcmQgY2IgPSBuZXcgQ2xpcGJvYXJkKGRpc3BsYXkpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQotCUJ1dHRvbiBjb3B5ID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWNvcHkuc2V0VGV4dCgiQ29weSIpOwotCWNvcHkuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgdGV4dERhdGEgPSB0ZXh0LmdldFNlbGVjdGlvblRleHQoKTsKLQkJCWlmICh0ZXh0RGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCQlUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQkJY2Iuc2V0Q29udGVudHMobmV3IE9iamVjdFtde3RleHREYXRhfSwgbmV3IFRyYW5zZmVyW117dGV4dFRyYW5zZmVyfSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlCdXR0b24gcGFzdGUgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JcGFzdGUuc2V0VGV4dCgiUGFzdGUiKTsKLQlwYXN0ZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVRleHRUcmFuc2ZlciB0cmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJU3RyaW5nIGRhdGEgPSAoU3RyaW5nKWNiLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQkJCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCQl0ZXh0Lmluc2VydChkYXRhKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocGFzdGUsIDAsIFNXVC5MRUZUKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCWNvcHkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb3B5LCA1KTsKLQlwYXN0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChwYXN0ZSwgLTUpOwotCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlzaGVsbC5zZXRTaXplKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWNiLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZGMxMDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIEdDIGV4YW1wbGUgc25pcHBldDogY2FwdHVyZSBhIHdpZGdldCBpbWFnZSB3aXRoIGEgR0MKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJXaWRnZXQiKTsKLQkKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JdGFibGUuc2V0Qm91bmRzKDEwLCAxMCwgMTAwLCAxMDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSB7Ci0JCW5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtIiArIGkpOwotCX0KLQkKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJDYXB0dXJlIik7Ci0JYnV0dG9uLnBhY2soKTsKLQlidXR0b24uc2V0TG9jYXRpb24oMTAsIDE0MCk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHRhYmxlU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCUdDIGdjID0gbmV3IEdDKHRhYmxlKTsKLQkJCWZpbmFsIEltYWdlIGltYWdlID0KLQkJCQluZXcgSW1hZ2UoZGlzcGxheSwgdGFibGVTaXplLngsIHRhYmxlU2l6ZS55KTsKLQkJCWdjLmNvcHlBcmVhKGltYWdlLCAwLCAwKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQotCQkJU2hlbGwgcG9wdXAgPSBuZXcgU2hlbGwoc2hlbGwpOwotCQkJcG9wdXAuc2V0VGV4dCgiSW1hZ2UiKTsKLQkJCXBvcHVwLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhwb3B1cCwgU1dULk5PTkUpOwotCQkJY2FudmFzLnNldEJvdW5kcygxMCwgMTAsIHRhYmxlU2l6ZS54KzEwLCB0YWJsZVNpemUueSsxMCk7Ci0JCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXBvcHVwLnBhY2soKTsKLQkJCXBvcHVwLm9wZW4oKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlMjQ4NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGVDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBuYXZpZ2F0ZSBhIHRhYmxlIGNlbGxzIHdpdGggYXJyb3cga2V5cy4gCi0gKiBFZGl0IHdoZW4gdXNlciBoaXRzIFJldHVybiBrZXkuICBFeGl0IGVkaXQgbW9kZSBieSBoaXR0aW5nIEVzY2FwZSAoY2FuY2VscyBlZGl0KQotICogb3IgUmV0dXJuIChhcHBsaWVzIGVkaXQgdG8gdGFibGUpLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JLy8gY3JlYXRlIGEgYSB0YWJsZSB3aXRoIDMgY29sdW1ucyBhbmQgZmlsbCB3aXRoIGRhdGEKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImNlbGwgIiArIGkgKyAiIDAiLCAJImNlbGwgIiArIGkgKyAiIDEiLCAiY2VsbCAiICsgaSArICIgMiIgfSk7Ci0JfQotCWNvbHVtbjEucGFjaygpOwotCWNvbHVtbjIucGFjaygpOwotCWNvbHVtbjMucGFjaygpOwotCi0JLy8gY3JlYXRlIGEgVGFibGVDdXJzb3IgdG8gbmF2aWdhdGUgYXJvdW5kIHRoZSB0YWJsZQotCWZpbmFsIFRhYmxlQ3Vyc29yIGN1cnNvciA9IG5ldyBUYWJsZUN1cnNvcih0YWJsZSwgU1dULk5PTkUpOwotCS8vIGNyZWF0ZSBhbiBlZGl0b3IgdG8gZWRpdCB0aGUgY2VsbCB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIiAKLQkvLyB3aGlsZSBvdmVyIGEgY2VsbCBpbiB0aGUgdGFibGUKLQlmaW5hbCBDb250cm9sRWRpdG9yIGVkaXRvciA9IG5ldyBDb250cm9sRWRpdG9yKGN1cnNvcik7Ci0JZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQllZGl0b3IuZ3JhYlZlcnRpY2FsID0gdHJ1ZTsKLQotCWN1cnNvci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJLy8gd2hlbiB0aGUgVGFibGVFZGl0b3IgaXMgb3ZlciBhIGNlbGwsIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyByb3cgaW4gCi0JCS8vIHRoZSB0YWJsZQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHsgY3Vyc29yLmdldFJvdygpfSk7Ci0JCX0KLQkJLy8gd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIgaW4gdGhlIFRhYmxlQ3Vyc29yLCBwb3AgdXAgYSB0ZXh0IGVkaXRvciBzbyB0aGF0IAotCQkvLyB0aGV5IGNhbiBjaGFuZ2UgdGhlIHRleHQgb2YgdGhlIGNlbGwKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGN1cnNvciwgU1dULk5PTkUpOwotCQkJVGFibGVJdGVtIHJvdyA9IGN1cnNvci5nZXRSb3coKTsKLQkJCWludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCQl0ZXh0LnNldFRleHQocm93LmdldFRleHQoY29sdW1uKSk7Ci0JCQl0ZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3IgYW5kIGNvcHkgdGhlIGRhdGEgb3ZlciAKLQkJCQkJLy8gd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIKLQkJCQkJaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikgewotCQkJCQkJVGFibGVJdGVtIHJvdyA9IGN1cnNvci5nZXRSb3coKTsKLQkJCQkJCWludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCQkJCQlyb3cuc2V0VGV4dChjb2x1bW4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJCXRleHQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCS8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciB3aGVuIHRoZSB1c2VyIGhpdHMgIkVTQyIKLQkJCQkJaWYgKGUuY2hhcmFjdGVyID09IFNXVC5FU0MpIHsKLQkJCQkJCXRleHQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciB0YWJzIGF3YXkKLQkJCXRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQllZGl0b3Iuc2V0RWRpdG9yKHRleHQpOwotCQkJdGV4dC5zZXRGb2N1cygpOwotCQl9Ci0JfSk7Ci0JLy8gSGlkZSB0aGUgVGFibGVDdXJzb3Igd2hlbiB0aGUgdXNlciBoaXRzIHRoZSAiQ1RSTCIgb3IgIlNISUZUIiBrZXkuCi0JLy8gVGhpcyBhbG93cyB0aGUgdXNlciB0byBzZWxlY3QgbXVsdGlwbGUgaXRlbXMgaW4gdGhlIHRhYmxlLgotCWN1cnNvci5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQlpZiAoZS5rZXlDb2RlID09IFNXVC5DVFJMCi0JCQkJfHwgZS5rZXlDb2RlID09IFNXVC5TSElGVAotCQkJCXx8IChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwCi0JCQkJfHwgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKSB7Ci0JCQkJY3Vyc29yLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JfSk7Ci0JLy8gV2hlbiB0aGUgdXNlciBkb3VibGUgY2xpY2tzIGluIHRoZSBUYWJsZUN1cnNvciwgcG9wIHVwIGEgdGV4dCBlZGl0b3Igc28gdGhhdCAKLQkvLyB0aGV5IGNhbiBjaGFuZ2UgdGhlIHRleHQgb2YgdGhlIGNlbGwKLQljdXJzb3IuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjdXJzb3IsIFNXVC5OT05FKTsKLQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJdGV4dC5zZXRUZXh0KHJvdy5nZXRUZXh0KGNvbHVtbikpOwotCQkJdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIGFuZCBjb3B5IHRoZSBkYXRhIG92ZXIgCi0JCQkJCS8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJCVRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCQkJCQlpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkJCQkJcm93LnNldFRleHQoY29sdW1uLCB0ZXh0LmdldFRleHQoKSk7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciBoaXRzICJFU0MiCi0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0JCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGF3YXkKLQkJCXRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQllZGl0b3Iuc2V0RWRpdG9yKHRleHQpOwotCQkJdGV4dC5zZXRGb2N1cygpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gU2hvdyB0aGUgVGFibGVDdXJzb3Igd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgIlNISUZUIiBvciAiQ1RSTCIga2V5LgotCS8vIFRoaXMgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBtdWx0aXBsZSBzZWxlY3Rpb24gdGFzay4KLQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuQ09OVFJPTCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuU0hJRlQgJiYgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKGUua2V5Q29kZSAhPSBTV1QuQ09OVFJPTAotCQkJCSYmIChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwKQotCQkJCXJldHVybjsKLQkJCWlmIChlLmtleUNvZGUgIT0gU1dULlNISUZUICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0KLQkJCVRhYmxlSXRlbVtdIHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJVGFibGVJdGVtIHJvdyA9IChzZWxlY3Rpb24ubGVuZ3RoID09IDApID8gdGFibGUuZ2V0SXRlbSh0YWJsZS5nZXRUb3BJbmRleCgpKSA6IHNlbGVjdGlvblswXTsKLQkJCXRhYmxlLnNob3dJdGVtKHJvdyk7Ci0JCQljdXJzb3Iuc2V0U2VsZWN0aW9uKHJvdywgMCk7Ci0JCQljdXJzb3Iuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWN1cnNvci5zZXRGb2N1cygpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDE3NGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBmaWxsIGEgbWVudSBkeW5hbWljYWxseSAod2hlbiBtZW51IHNob3duKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDk3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQl0cmVlLnNldE1lbnUgKG1lbnUpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCW1lbnUuYWRkTGlzdGVuZXIgKFNXVC5TaG93LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnVJdGVtIFtdIG1lbnVJdGVtcyA9IG1lbnUuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8bWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbWVudUl0ZW1zIFtpXS5kaXNwb3NlICgpOwotCQkJfQotCQkJVHJlZUl0ZW0gW10gdHJlZUl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8dHJlZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCQltZW51SXRlbS5zZXRUZXh0ICh0cmVlSXRlbXMgW2ldLmdldFRleHQgKCkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzc5MTg2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYW5kIGRpc3Bvc2UgY2hpbGRyZW4gb2YgYSBjb21wb3NpdGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTggewotCi1zdGF0aWMgaW50IHBhZ2VOdW0gPSAwOwotc3RhdGljIENvbXBvc2l0ZSBwYWdlQ29tcG9zaXRlOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiUHVzaCIpOwotCXBhZ2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoKHBhZ2VDb21wb3NpdGUgIT0gbnVsbCkgJiYgKCFwYWdlQ29tcG9zaXRlLmlzRGlzcG9zZWQoKSkpIHsKLQkJCQlwYWdlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXBhZ2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlwYWdlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQlpZiAocGFnZU51bSsrICUgMiA9PSAwKSB7Ci0JCQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFnZUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpLnNldFRleHQoInRhYmxlIGl0ZW0gIiArIGkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbmV3IEJ1dHRvbihwYWdlQ29tcG9zaXRlLCBTV1QuUkFESU8pLnNldFRleHQoInJhZGlvIik7Ci0JCQl9Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhM2FjYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBwcmV2ZW50IGEgc2hlbGwgZnJvbSBjbG9zaW5nIChwcm9tcHQgdGhlIHVzZXIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgc3R5bGUgPSBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuWUVTIHwgU1dULk5POwotCQkJTWVzc2FnZUJveCBtZXNzYWdlQm94ID0gbmV3IE1lc3NhZ2VCb3ggKHNoZWxsLCBzdHlsZSk7Ci0JCQltZXNzYWdlQm94LnNldFRleHQgKCJJbmZvcm1hdGlvbiIpOwotCQkJbWVzc2FnZUJveC5zZXRNZXNzYWdlICgiQ2xvc2UgdGhlIHNoZWxsPyIpOwotCQkJZXZlbnQuZG9pdCA9IG1lc3NhZ2VCb3gub3BlbiAoKSA9PSBTV1QuWUVTOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXRMYXVuY2hlci5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldExhdW5jaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDE5OTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldExhdW5jaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNpbXBsZSAiaGFja2FibGUiIGNvZGUgdGhhdCBydW5zIGFsbCBvZiB0aGUgU1dUIFNuaXBwZXRzLAotICogdHlwaWNhbGx5IGZvciB0ZXN0aW5nLiBPbmUgZXhhbXBsZSBvZiBhIHVzZWZ1bCAiaGFjayIgaXMKLSAqIHRvIGFkZCB0aGUgbGluZToKLSAqICAgIGlmIChzb3VyY2UuaW5kZXhPZigiVGFibGUiKSA9PSAtMSAmJiBzb3VyY2UuaW5kZXhPZigiVHJlZSIpID09IC0xKSBjb250aW51ZTsKLSAqIGFmdGVyIHRoZSBsaW5lOgotICogICAgU3RyaW5nIHNvdXJjZSA9IFN0cmluZy52YWx1ZU9mKGJ1ZmZlcik7Ci0gKiBpbiBvcmRlciB0byBydW4gYWxsIG9mIHRoZSBUYWJsZSBhbmQgVHJlZSBTbmlwcGV0cy4KLSAqLwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0TGF1bmNoZXIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCUZpbGUgc291cmNlRGlyID0gbmV3IEZpbGUoInNyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMiKTsKLQkJYm9vbGVhbiBoYXNTb3VyY2UgPSBzb3VyY2VEaXIuZXhpc3RzKCk7Ci0JCWludCBjb3VudCA9IDMwMDsKLQkJaWYgKGhhc1NvdXJjZSkgewotCQkJRmlsZSBbXSBmaWxlcyA9IHNvdXJjZURpci5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKSBjb3VudCA9IGZpbGVzLmxlbmd0aDsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWlmIChpID09IDEzNiB8fCBpID09IDE1MSB8fCBpID09IDE4MCB8fCBpID09IDIxOSkgY29udGludWU7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gIlNuaXBwZXQiICsgaTsKLQkJCUNsYXNzIGNsYXp6ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5zd3Quc25pcHBldHMuIiArIGNsYXNzTmFtZSk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHt9Ci0JCQlpZiAoY2xhenogIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iICsgY2xhenouZ2V0TmFtZSgpKTsKLQkJCQlpZiAoaGFzU291cmNlKSB7Ci0JCQkJCUZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZURpciwgY2xhc3NOYW1lICsgIi5qYXZhIik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlGaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHNvdXJjZUZpbGUpOwotCQkJCQkJY2hhciBbXSBidWZmZXIgPSBuZXcgY2hhciBbKGludClzb3VyY2VGaWxlLmxlbmd0aCgpXTsKLQkJCQkJCXJlYWRlci5yZWFkKGJ1ZmZlcik7Ci0JCQkJCQlTdHJpbmcgc291cmNlID0gU3RyaW5nLnZhbHVlT2YoYnVmZmVyKTsKLQkJCQkJCWludCBzdGFydCA9IHNvdXJjZS5pbmRleE9mKCJwYWNrYWdlIik7Ci0JCQkJCQlzdGFydCA9IHNvdXJjZS5pbmRleE9mKCIvKiIsIHN0YXJ0KTsKLQkJCQkJCWludCBlbmQgPSBzb3VyY2UuaW5kZXhPZigiKiBGb3IgYSBsaXN0IG9mIGFsbCIpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIGVuZC0zKSk7Ci0JCQkJCQlib29sZWFuIHNraXAgPSBmYWxzZTsKLQkJCQkJCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCQkJCQkJaWYgKHNvdXJjZS5pbmRleE9mKCJQb2NrZXRQQyIpICE9IC0xKSB7Ci0JCQkJCQkJcGxhdGZvcm0gPSAiUG9ja2V0UEMiOwotCQkJCQkJCXNraXAgPSB0cnVlOwotCQkJCQkJfSBlbHNlIGlmIChzb3VyY2UuaW5kZXhPZigiT3BlbkdMIikgIT0gLTEpIHsKLQkJCQkJCQlwbGF0Zm9ybSA9ICJPcGVuR0wiOwotCQkJCQkJCXNraXAgPSB0cnVlOwotCQkJCQkJfSBlbHNlIGlmIChzb3VyY2UuaW5kZXhPZigiSmF2YVhQQ09NIikgIT0gLTEpIHsKLQkJCQkJCQlwbGF0Zm9ybSA9ICJKYXZhWFBDT00iOwotCQkJCQkJCXNraXAgPSB0cnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgW10gcGxhdGZvcm1zID0geyJ3aW4zMiIsICJtb3RpZiIsICJndGsiLCAicGhvdG9uIiwgImNhcmJvbiJ9OwotCQkJCQkJCWZvciAoaW50IHAgPSAwOyBwIDwgcGxhdGZvcm1zLmxlbmd0aDsgcCsrKSB7Ci0JCQkJCQkJCWlmICghcGxhdGZvcm1zW3BdLmVxdWFscyhwbGF0Zm9ybSkgJiYgc291cmNlLmluZGV4T2YoIi4iICsgcGxhdGZvcm1zW3BdKSAhPSAtMSkgewotCQkJCQkJCQkJcGxhdGZvcm0gPSBwbGF0Zm9ybXNbcF07Ci0JCQkJCQkJCQlza2lwID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKHNraXApIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi4uLnNraXBwaW5nICIgKyBwbGF0Zm9ybSArICIgZXhhbXBsZS4uLiIpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCQl9Ci0JCQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCQkJU3RyaW5nIFtdIHBhcmFtID0gbmV3IFN0cmluZyBbMF07Ci0JCQkJaWYgKGkgPT0gODEpIHBhcmFtID0gbmV3IFN0cmluZ1tdIHsiU2hlbGwuRXhwbG9yZXIifTsKLQkJCQl0cnkgewotCQkJCQltZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoIm1haW4iLCBuZXcgQ2xhc3NbXSB7cGFyYW0uZ2V0Q2xhc3MoKX0pOwotCQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgRGlkIG5vdCBmaW5kIG1haW4oU3RyaW5nIFtdKSIpOwotCQkJCX0KLQkJCQlpZiAobWV0aG9kICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1ldGhvZC5pbnZva2UoY2xhenosIG5ldyBPYmplY3QgW10ge3BhcmFtfSk7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBGYWlsZWQgdG8gbGF1bmNoIChpbGxlZ2FsIGFjY2VzcykiKTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgRmFpbGVkIHRvIGxhdW5jaCAoaWxsZWdhbCBhcmd1bWVudCB0byBtYWluKSIpOwotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgRXhjZXB0aW9uIGluIFNuaXBwZXQ6ICIgKyBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL2NhbmNlbC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9jYW5jZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjY0NzY2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL2NhbmNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9lY2xpcHNlLnBuZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL2VjbGlwc2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzk3NTI0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL2VjbGlwc2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgo=